MediaWiki:Common.js: Difference between revisions

Jump to navigation Jump to search
5,414 bytes removed ,  14:08, 11 February 2020
no edit summary
No edit summary
No edit summary
 
Line 170: Line 170:


}());
}());
/*
A JavaScript plugin for lazy-loading responsive Google Adsense ads.
-
By Osvaldas Valutis, www.osvaldas.info
Available for use under the MIT License
*/
;( function( root, factory )
{
var pluginName = 'adsenseLoader';
if( typeof define === 'function' && define.amd ) define([], factory( pluginName ));
else if( typeof exports === 'object' ) module.exports = factory( pluginName );
else root[ pluginName ] = factory( pluginName );
}( this, function( pluginName )
{
'use strict';
var scriptUrl = '//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js',
scriptLoaded = false,
throttleTO = 250,
defaultOpts =
{
laziness: 1,
onLoad: false,
},
extendObj = function( defaults, options )
{
var prop, extended = {};
for( prop in defaults )
if( Object.prototype.hasOwnProperty.call( defaults, prop ))
extended[ prop ] = defaults[ prop ];
for( prop in options )
if( Object.prototype.hasOwnProperty.call( options, prop ))
extended[ prop ] = options[ prop ];
return extended;
},
addClass = function( el, className )
{
if( el.classList ) el.classList.add( className );
else el.className += ' ' + className;
},
getOffset = function( el )
{
var rect = el.getBoundingClientRect();
return { top: rect.top + document.body.scrollTop, left: rect.left + document.body.scrollLeft };
},
loadScript = function( url, callback )
{
var s = document.createElement( 'script' );
s.src = url;
s.async = true;
s.addEventListener( 'load', function()
{
s.parentNode.removeChild( s );
if( typeof callback === 'function' )
callback();
});
document.body.appendChild( s );
},
throttle = function(a,b){var c,d;return function(){var e=this,f=arguments,g=+new Date;c&&g<c+a?(clearTimeout(d),d=setTimeout(function(){c=g,b.apply(e,f)},a)):(c=g,b.apply(e,f))}},
adsToLoad = [],
adsLoaded = [],
adsPending = [],
loadAd = function( ad )
{
( adsbygoogle = window.adsbygoogle || []).push({});
var onLoadFn = ad._adsenseLoaderData.options.onLoad;
if( typeof onLoadFn === 'function' )
{
ad.querySelector( 'iframe' ).addEventListener( 'load', function()
{
onLoadFn( ad );
});
}
},
initAds = function()
{
if( !adsToLoad.length ) return true;
var winScroll = window.pageYOffset,
winHeight = window.innerHeight;
adsToLoad.forEach( function( ad )
{
var offset = getOffset( ad ).top,
laziness = ad._adsenseLoaderData.options.laziness + 1;
// if the element is too far below || too far above
if( offset - winScroll > winHeight * laziness || winScroll - offset - ad.offsetHeight - ( winHeight * laziness ) > 0 )
return true;
adsToLoad = removeAdFromList( adsToLoad, ad );
ad._adsenseLoaderData.width = getAdWidth( ad );
addClass( ad.children[ 0 ], 'adsbygoogle' );
adsLoaded.push( ad );
if( typeof adsbygoogle !== 'undefined' ) loadAd( ad );
else adsPending.push( ad );
if( !scriptLoaded )
{
scriptLoaded = true;
loadScript( scriptUrl, function()
{
adsPending.forEach( loadAd );
});
}
});
},
resizeAds = function()
{
if( !adsLoaded.length ) return true;
var anyNew = false;
adsLoaded.forEach( function( ad )
{
if( ad._adsenseLoaderData.width != getAdWidth( ad ))
{
anyNew = true;
adsLoaded = removeAdFromList( adsLoaded, ad );
ad.innerHTML = ad._adsenseLoaderData.originalHTML;
adsToLoad.push( ad );
}
});
if( anyNew ) initAds();
},
getAdWidth = function( ad )
{
return parseInt( window.getComputedStyle( ad, ':before' ).getPropertyValue( 'content' ).slice( 1, -1 ) || 9999 );
},
removeAdFromList = function( list, element )
{
return list.filter( function( entry )
{
return entry !== element;
});
},
normalizeAdElement = function( ad, options )
{
ad._adsenseLoaderData =
{
originalHTML: ad.innerHTML,
options: options
};
ad.adsenseLoader = function( method )
{
if( method == 'destroy' )
{
adsToLoad = removeAdFromList( adsToLoad, ad );
adsLoaded = removeAdFromList( adsLoaded, ad );
adsPending = removeAdFromList( adsLoaded, ad );
ad.innerHTML = ad._adsenseLoaderData.originalHTML;
}
};
return ad;
};
window.addEventListener( 'scroll', throttle( throttleTO, initAds ));
window.addEventListener( 'resize', throttle( throttleTO, initAds ));
window.addEventListener( 'resize', throttle( throttleTO, resizeAds ));
function Plugin( elements, options )
{
if( typeof elements === 'string' ) elements = document.querySelectorAll( elements );
else if( typeof elements.length === 'undefined' ) elements = [ elements ];
options = extendObj( defaultOpts, options );
[].forEach.call( elements, function( entry )
{
entry = normalizeAdElement( entry, options );
adsToLoad.push( entry );
});
this.elements = elements;
initAds();
}
Plugin.prototype =
{
destroy: function()
{
this.elements.forEach( function( entry )
{
entry.adsenseLoader( 'destroy' );
});
}
};
window.adsenseLoaderConfig = function( options )
{
if( typeof options.scriptUrl !== 'undefined' )
scriptUrl = options.scriptUrl;
if( typeof options.throttle !== 'undefined' )
throttleTO = options.throttle;
};
return Plugin;
}));
var instance = new adsenseLoader( '.ads' );

Navigation menu