现在绝大部分广告联盟的广告代码都是使用document.write方式载入到页面中,这种方式很方便,但是可能会阻塞页面剩余内容的加载。
由于广告服务商技术水平参差不齐以及客户端网络的差异,特别在广告位比较多的情况下,有可能导致广告代码引起的用户体验下降。
所以引出本文的优化,其核心思想是重写document.write函数,借鉴了某未知同胞的代码。
1、在全局JS里面增加代码
<script type="text/javascript">
var loadScript = ( function() {
var adQueue = [], adQueueTmp = [], dw = document.write, dwl = document.writeln;
function LoadADScript(url, charset, container, init, callback) {
this.url = url;
this.charset = charset;
this.containerObj = ( typeof container == 'string' ? document.getElementById(container) : container);
this.init = init ||
function() {
};
this.callback = callback ||
function() {
};
}
LoadADScript.prototype = {
startLoad : function() {
var script = document.createElement('script'), _this = this;
_this.init.apply();
if(script.readyState) {//IE
script.onreadystatechange = function() {
if(script.readyState == "loaded" || script.readyState == "complete") {
script.onreadystatechange = null;
_this.startNext();
}
};
} else {//Other
script.onload = function() {
_this.startNext();
};
}
document.write = function(ad) {
ad = ad.replace(/<script.*?src=('|")(.*?)('|").*?>/, function(a0, a1, a2, a3){
var charsetMatch = a0.match(/charset=('|")(.*?)('|")/);
var charset = '';
if(charsetMatch) charset = charsetMatch[2];
var idd = '_rand_'+Math.random();
adQueueTmp.unshift({
url: a2,
container: idd,
callback: $.noop,
charset: charset
});
return '<span id="'+idd+'"></span>';
});
$(_this.containerObj).append($(ad));
};
document.writeln = document.write;
script.src = _this.url;
script.type = 'text/javascript';
if(_this.charset) script.charset = _this.charset;
document.getElementsByTagName('head')[0].appendChild(script);
},
finished : function() {
document.write = this.dw;
document.writeln = this.dwl;
},
startNext : function() {
adQueue.shift();
$.each(adQueueTmp, function(_, script){
loadScript.add(script, true);
});
adQueueTmp = [];
this.callback.apply();
if(adQueue.length > 0) {
adQueue[0].startLoad();
} else {
this.finished();
}
}
};
return {
add : function(adObj, insert) {
if(!adObj)
return;
adQueue[insert ? 'unshift' : 'push'](new LoadADScript(adObj.url, adObj.charset, adObj.container, adObj.init, adObj.callback));
return this;
},
execute : function() {
if(adQueue.length > 0) {
adQueue[0].startLoad();
}
}
};
}());
</script>
2、在需要显示广告的地方加html占位符,如(id要唯一)
<span id="placeholder"></span>
3、在页面尾部添加对应广告js代码
<script type="text/javascript">
loadScript.add({
init: function(){
},
url: 'http://e.7clink.com/cpc.php?c=xxxxxxxxxxxxxxxxxxxxxx',
container: 'da_200',
charset: 'utf-8',
callback: $.noop
});
</script>
4、多个广告重复2和3的操作,最后在页面最尾部添加js代码:
<script type="text/javascript">
loadScript.execute();
</script>