Bmansurov has uploaded a new change for review.
https://gerrit.wikimedia.org/r/248312
Change subject: WIP: load images on demand when JS is enabled
......................................................................
WIP: load images on demand when JS is enabled
Change-Id: Iebcac684c58feb76b9277dccab6183a5f2f61f52
---
M includes/MobileFormatter.php
M includes/MobileFrontend.body.php
M resources/mobile.startup/Skin.js
3 files changed, 109 insertions(+), 1 deletion(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/MobileFrontend
refs/changes/12/248312/1
diff --git a/includes/MobileFormatter.php b/includes/MobileFormatter.php
index 3a9f0d8..a28666a 100644
--- a/includes/MobileFormatter.php
+++ b/includes/MobileFormatter.php
@@ -120,6 +120,36 @@
}
/**
+ * Enables images to be loaded asynchronously
+ */
+ public function doEnableImagesForAsync() {
+ $doc = $this->getDoc();
+ $domElemsToReplace = array();
+ foreach ( $doc->getElementsByTagName( 'img' ) as $element ) {
+ $domElemsToReplace[] = $element;
+ }
+ /** @var $element DOMElement */
+ foreach ( $domElemsToReplace as $element ) {
+ $parent = $element->parentNode;
+
+
+ $noscript = $doc->createElement( 'noscript' );
+ $noscript->appendChild( $element );
+ $parent->appendChild( $noscript );
+
+// $alt = $element->getAttribute( 'alt' );
+ // , htmlspecialchars( $alt )
+ $spinner = $doc->createElement( 'span' );
+ $spinner->setAttribute( 'class', MobileUI::iconClass(
'spinner', 'element', 'loading spinner' ) );
+ $spinner->setAttribute( 'style', 'display: block' );
+ $parent->appendChild( $spinner );
+// var_dump( $parent );
+// echo '<br><br><br><br>';
+ }
+// die;
+ }
+
+ /**
* Replaces images with [annotations from alt]
*/
private function doRemoveImages() {
diff --git a/includes/MobileFrontend.body.php b/includes/MobileFrontend.body.php
index 28dbe0c..7275d77 100644
--- a/includes/MobileFrontend.body.php
+++ b/includes/MobileFrontend.body.php
@@ -36,6 +36,7 @@
$context = MobileContext::singleton();
$formatter = MobileFormatter::newFromContext( $context, $html );
+ $formatter->doEnableImagesForAsync();
Hooks::run( 'MobileFrontendBeforeDOM', array( $context,
$formatter ) );
diff --git a/resources/mobile.startup/Skin.js b/resources/mobile.startup/Skin.js
index 0d5c195..38fef51 100644
--- a/resources/mobile.startup/Skin.js
+++ b/resources/mobile.startup/Skin.js
@@ -2,7 +2,8 @@
var Skin,
browser = M.require( 'mobile.browser/browser' ),
- View = M.require( 'mobile.view/View' );
+ View = M.require( 'mobile.view/View' ),
+ $window = $( window );
/**
* Representation of the current skin being rendered.
@@ -125,6 +126,8 @@
M.on( 'resize', $.proxy( this, 'emit', '_resize' ) );
this.on( '_resize', loadWideScreenModules );
this.emit( '_resize' );
+
+ this.loadImages();
},
/**
* @inheritdoc
@@ -160,6 +163,80 @@
},
/**
+ * Check if at least half of the element's height and half of
its width are in viewport
+ * @method
+ * @param {jQuery.Object} $el - element that's being tested
+ * @return {Boolean}
+ */
+ isElementInViewport: function ( $el ) {
+ var windowHeight = $window.height(),
+ windowWidth = $window.width(),
+ windowScrollLeft = $window.scrollLeft(),
+ windowScrollTop = $window.scrollTop(),
+ elHeight = $el.height(),
+ elWidth = $el.width(),
+ elOffset = $el.offset();
+
+ return (
+ ( windowScrollTop + windowHeight >=
elOffset.top + elHeight / 2 ) &&
+ ( windowScrollLeft + windowWidth >=
elOffset.left + elWidth / 2 ) &&
+ ( windowScrollTop <= elOffset.top + elHeight /
2 )
+ );
+ },
+
+ /**
+ * Load an image on demand
+ * @param {jQuery.Object} $image
+ */
+ loadImages: function () {
+ var self = this,
+ timer = null,
+ $imageLinks = $( '#content' ).find( '.image' );
+
+ function _loadImages() {
+ var toRemove = [];
+
+ $.each( $imageLinks, function ( i, link ) {
+ var $imageLink = $( link );
+
+ if ( self.isElementInViewport(
$imageLink ) ) {
+ self.loadImage( $imageLink );
+ toRemove.push( i );
+ }
+ } );
+
+ $.each( toRemove, function ( i, id ) {
+ $imageLinks.splice( id, 1 );
+ } );
+
+
+ if ( !$imageLinks.length ) {
+ $window.off( 'scroll.load-images' );
+ }
+
+ };
+
+ $window.on(
+ 'scroll.load-images',
+ // debounce
+ function () {
+ clearTimeout( timer );
+ timer = setTimeout( _loadImages, 250 );
+ }
+ );
+
+ _loadImages();
+ console.log('i work ');
+ },
+
+ loadImage: function ( $imageLink ) {
+ var $noscript = $imageLink.find( 'noscript' ),
+ $image = $( $noscript.text() );
+
+ $imageLink.html( $image );
+ },
+
+ /**
* Returns the appropriate license message including links/name
to
* terms of use (if any) and license page
*/
--
To view, visit https://gerrit.wikimedia.org/r/248312
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Iebcac684c58feb76b9277dccab6183a5f2f61f52
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/MobileFrontend
Gerrit-Branch: master
Gerrit-Owner: Bmansurov <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits