1,131
edits
imported>Mackan No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
/* Any JavaScript here will be loaded for all users on every page load. */ | /* Any JavaScript here will be loaded for all users on every page load. */ | ||
$(document).ready(function(){ | $(document).ready(function(){ | ||
| Line 171: | 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' ); | |||