本文实例讲述了PHP广告加载类的用法,非常实用。分享给大家供大家参考。具体方法如下:
该PHP广告加载类,支持异步与同步加载。需要使用Jquery实现。
private static $_ads = array(); // 广告集合
private static $_step = 300; // 广告加载间隔
private static $_async = true; // 是否异步加载
private static $_config = array(); // 广告设置文件
private static $_jsclass = null; // 广告JS class
/** 加载广告集合
-
@param String $channel 栏目,对应config文件
-
@param int $step 广告加载间隔
-
@param boolean $async 是否异步加载
*/
public static function load($channel='',$step='',$async=''){
if(isset($step) && is_numeric($step) && $step>0){
self::$_step = $step;
}if(isset($async) && is_bool($async)){
self::$_async = $async;
}// 判断浏览器,如IE强制使用同步加载
if(!self::checkBrowser()){
self::$_async = false;
}self::getAds($channel);
self::genZoneId();return self::genHtml();
}
/** 设置config
- @param String $config 广告配置
- @param String $jsclass js class文件路径
*/
public static function setConfig($config=array(),$jsclass=''){
self::$_config = $config;
self::$_jsclass = $jsclass;
}
/** 根据channel创建广告集合
- @param String $channel 栏目
*/
private static function getAds($channel=''){
$AD_Config = self::$_config;
if($AD_Config!=null){
self::$_ads = isset($AD_Config[$channel])? $AD_Config[$channel] : $AD_Config['default'];
}
}
/* zoneid base64_encode 处理 /
private static function genZoneId(){
// 同步加载广告不需要处理zoneid
if(!self::$_async){
return ;
}
$ads = self::$_ads;
for($i=0,$len=count($ads); $i<$len; $i++){
if(isset($ads[$i]['zoneId'])){
$ads[$i]['zoneId'] = base64_encode('var zoneid='.$ads[$i]['zoneId'].';');
}
}
self::$_ads = $ads;
}
/* 生成广告html /
private static function genHtml(){
$ads = self::$_ads;
$html = array();
if(self::$_jsclass!=null && $ads){
array_push($html,'<script type="text/javascript" src="'.self::$_jsclass.'">');
// 同步需要预先加载
if(!self::$_async){
foreach($ads as $ad){
array_push($html,'<div id="'.$ad['domId'].'_container" style="display:none">');
array_push($html,'<script type="text/javascript">');
array_push($html,'ADLoader.preload('.json_encode($ad).');');
array_push($html,'</script>');
array_push($html,'</div>');
}
}
array_push($html,'<script type="text/javascript">');
array_push($html,'var ads='.json_encode($ads).';');
array_push($html,'$(document).ready(function(){ ADLoader.load(ads,'.self::$_step.','.intval(self::$_async).'); });');
array_push($html,'</script>');
}
return implode("\r\n",$html);
}
/* 判断是否需要强制同步加载的浏览器 /
private static function checkBrowser(){
$user_agent = $_SERVER['HTTP_USER_AGENT'];
if(strstr($user_agent,'MSIE')!=''){
return false;
}
return true;
}
} // class end
?>
'case_openx' => array(
array(
'type' => 'openx','domId' => 'ad_728x90','zoneId' => 452
),array(
'type' => 'openx','domId' => 'ad_300x250','zoneId' => 449
),'domId' => 'ad_l2_300x250','zoneId' => 394
),),'case_url' => array(
array(
'type' => 'url','url' => 'adurl.PHP?zoneid=452'
),array(
'type' => 'url','url' => 'adurl.PHP?zoneid=449'
),'url' => 'adurl.PHP?zoneid=394'
)
),'case_sync_openx' => array(
array(
'type' => 'openx','default' => array(
array(
'type' => 'openx',);
?>
ADLoader.js文件如下:
_step = 300,// 广告加载间隔
_async = true,// 是否异步加载
_loaded = 0; // 已经加载的广告数
/** loadAd 循环加载广告
-
@param int c 第几个广告
*/
function loadAD(c){
if(_loaded>=_ads.length){
return ;
}if($('#'+_ads[c].domId).length>0){ // 判断dom是否存在
if(_async){ // 异步执行
crapLoader.loadScript(getScript(_ads[c]),_ads[c].domId,{ success: function(){ completeAd(); } });
}else{ // 将同步加载的广告显示
var ad_container = $('#'+_ads[c].domId+'_container'); ad_container.find('embed').attr('wmode','transparent').end().find('object').each(function(k,v){ v.wmode = 'transparent'; // 将flash变透明 }); $('#'+_ads[c].domId)[0].appendChild(ad_container[0]); ad_container.show(); completeAd();
}
}else{ // dom不存在
completeAd();
}
}
/* 加载完广告后处理 /
function completeAd(){
_loaded ++;
setTimeout(function(){
loadAD(_loaded);
},_step);
}
/** 获取广告
-
@param Array ad 广告参数
*/
function getScript(ad){
var ret = null;switch(ad.type){
case 'openx': // openx code ad
ret = 'data:text/javascript;base64,' + ad.zoneId + 'dmFyIG0zX3UgPSAobG9jYXRpb24ucHJvdG9jb2w9PSdodHRwczonPydodHRwczovL2Fkcy5ubWcuY29tLmhrL3d3dy9kZWxpdmVyeS9hanMucGhwJzonaHR0cDovL2Fkcy5ubWcuY29tLmhrL3d3dy9kZWxpdmVyeS9hanMucGhwJyk7CnZhciBtM19yID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjk5OTk5OTk5OTk5KTsKaWYgkcfkb2N1bWVudC5NQVhfdXNlZCkgZG9jdW1lbnQuTUFYX3VzZWQgPSAnLCc7CmRvY3VtZW50LndyaXRlICgiPHNjciIrImlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0nIittM191KTsKZG9jdW1lbnQud3JpdGUgKCI/em9uZWlkPSIgKyB6b25laWQpOwpkb2N1bWVudC53cml0ZSAoJyZhbXA7Y2I9JyArIG0zX3IpOwppZiAoZG9jdW1lbnQuTUFYX3VzZWQgIT0gJywnKSBkb2N1bWVudC53cml0ZSAoIiZhbXA7ZXhjbHVkZT0iICsgZG9jdW1lbnQuTUFYX3VzZWQpOwpkb2N1bWVudC53cml0ZSAoZG9jdW1lbnQuY2hhcnNldCA/ICcmYW1wO2NoYXJzZXQ9Jytkb2N1bWVudC5jaGFyc2V0IDogKGRvY3VtZW50LmNoYXJhY3RlclNldCA/ICcmYW1wO2NoYXJzZXQ9Jytkb2N1bWVudC5jaGFyYWN0ZXJTZXQgOiAnJykpOwpkb2N1bWVudC53cml0ZSAoIiZhbXA7bG9jPSIgKyBlc2NhcGUod2luZG93LmxvY2F0aW9uKSk7CmlmIChkb2N1bWVudC5yZWZlcnJlcikgZG9jdW1lbnQud3JpdGUgKCImYW1wO3JlZmVyZXI9IiArIGVzY2FwZShkb2N1bWVudC5yZWZlcnJlcikpOwppZiAoZG9jdW1lbnQuY29udGV4dCkgZG9jdW1lbnQud3JpdGUgKCImY29udGV4dD0iICsgZXNjYXBlKGRvY3VtZW50LmNvbnRleHQpKTsKaWYgKGRvY3VtZW50Lm1tbV9mbykgZG9jdW1lbnQud3JpdGUgKCImYW1wO21tbV9mbz0xIik7CmRvY3VtZW50LndyaXRlICgiJz48XC9zY3IiKyJpcHQ+Iik7';
break;case 'url': // url ad
ret = ad.url;
break;
}
return ret;
}
/** 同步加载广告
- @param Array ad 广告参数
/
function writeAd(ad){
switch(ad.type){
case 'openx':
var m3_u = (location.protocol=='https:'?'https://ads.nmg.com.hk/www/delivery/ajs.PHP':'http://ads.nmg.com.hk/www/delivery/ajs.PHP');
var m3_r = Math.floor(Math.random()99999999999);
if (!document.MAX_used) document.MAX_used = ',';
document.write ("<scr"+"ipt type='text/javascript' src='"+m3_u);
document.write ("?zoneid=" + ad.zoneId);
document.write ('&cb=' + m3_r);
if (document.MAX_used != ',') document.write ("&exclude=" + document.MAX_used);
document.write (document.charset ? '&charset='+document.charset : (document.characterSet ? '&charset='+document.characterSet : ''));
document.write ("&loc=" + escape(window.location));
if (document.referrer) document.write ("&referer=" + escape(document.referrer));
if (document.context) document.write ("&context=" + escape(document.context));
if (document.mmm_fo) document.write ("&mmm_fo=1");
document.write ("'><\/scr"+"ipt>");
break;
case 'url':
document.write ('<script type="text/javascript" src="' + ad.url + '">');
break;
}
}
obj = {
/** 加载广告
* @param Array ads 广告集合
* @param int step 广告加载间隔
* @param boolean async true:异步加载 false:同步加载
*/
load: function(ads,step,async){
_ads = ads;
if(typeof(step)!='undefined'){
_step = step;
}
if(typeof(async)!='undefined'){
_async = async;
}
loadAD(_loaded);
},/** <a href="/tag/yujiazai/" target="_blank" class="keywords">预加载</a>广告 */
preload: function(ad){
if($('#'+ad.domId).length>0){ // 判断dom是否存在
writeAd(ad);
}
}
}
return obj;
}());
/ crapLoader /
var crapLoader = (function() {
var isHijacked = false,queue = [],inputBuffer = [],writeBuffer = {},loading = 0,elementCache = {},returnedElements = [],splitScriptsRegex = /(<script[\s\S]*?@H_502_24@)/gim,globalOptions = {
autoRelease: true,parallel: true,debug: false
},defaultOptions = {
charset: undefined,success: undefined,func: undefined,src: undefined,timeout: 3000
},publ,head = document.getElementsByTagName("head")[0] || document.documentElement,support = {
scriptOnloadTriggeredAccurately: false,splitWithCapturingParentheses: ("abc".split(/(b)/)[1]==="b")
};
function checkQueue () {
if(queue.length) {
loadScript( queue.shift() );
} else if(loading === 0 && globalOptions.autoRelease) {
debug("Queue is empty. Auto-releasing.");
publ.release();
}
}
function checkWriteBuffer (obj) {
var buffer = writeBuffer[obj.domId],returnedEl;
if(buffer && buffer.length) {
writeHtml( buffer.shift(),obj );
} else {
while (returnedElements.length > 0) {
returnedEl = returnedElements.pop();
var id = returnedEl.id;
var elInDoc = getElementById(id);
if (!elInDoc) { continue; }
var parent = elInDoc.parentNode;
elInDoc.id = id + "__tmp";
parent.insertBefore(returnedEl,elInDoc);
parent.removeChild(elInDoc);
}
finished(obj);
}
}
function debug (message,obj) {
if(!globalOptions.debug || !window.console) { return; }
var objExtra = "";
if(obj) {
objExtra = "#"+obj.domId+" ";
var depth = obj.depth;
while(depth--) { objExtra += " "; }
}
console.log("crapLoader " + objExtra + message);
}
function extend (t,s) {
var k;
if(!s) { return t; }
for(k in s) {
t[k] = s[k];
}
return t;
}
function finished (obj) {
if(obj.success && typeof obj.success === "function") {
obj.success.call( document.getElementById(obj.domId) );
}
checkQueue();
}
function flush (obj) {
var domId = obj.domId,outputFromScript,htmlPartArray;
outputFromScript = stripNoScript( inputBuffer.join("") );
inputBuffer = [];
htmlPartArray = separateScriptsFromHtml( outputFromScript );
if(!writeBuffer[domId]) {
writeBuffer[domId] = htmlPartArray;
} else {
Array.prototype.unshift.apply(writeBuffer[domId],htmlPartArray);
}
checkWriteBuffer(obj);
}
function getCachedElById (domId) {
return elementCache[domId] || (elementCache[domId] = document.getElementById(domId));
}
function getElementById (domId) {
return ( publ.orgGetElementById.call ?
publ.orgGetElementById.call(document,domId) :
publ.orgGetElementById(domId) );
}
function getElementByIdReplacement (domId) {
var el = getElementById(domId),html,frag,div,found;
function traverseForElById(domId,el) {
var children = el.children,i,l,child;
if(children && children.length) {
for(i=0,l=children.length; i<l; i++) {
child = children[i];
if(child.id && child.id === domId) { return child; }
if(child.children && child.children.length) {
var tmp = traverseForElById(domId,child);
if (tmp) return tmp;
}
}
}
}
function searchForAlreadyReturnedEl(domId) {
var i,returnedEl;
for(i=0,l=returnedElements.length; i<l; i++) {
returnedEl = returnedElements[i];
if(returnedEl.id === domId) { return returnedEl; }
}
}
if(el) { return el; }
if (returnedElements.length) {
found = searchForAlreadyReturnedEl(domId);
if (found) {
return found;
}
}
if(inputBuffer.length) {
html = inputBuffer.join("");
frag = document.createDocumentFragment();
div = document.createElement("div");
div.innerHTML = html;
frag.appendChild(div);
found = traverseForElById(domId,div);
if (found) {
returnedElements.push(found);
}
return found;
}
}
var globalEval = (function () {
return (window.execScript ? function(code,language) {
window.execScript(code,language || "JavaScript");
} : function(code,language) {
if(language && !/^javascript/i.test(language)) { return; }
window.eval.call(window,code);
});
}());
function isScript (html) {
return html.toLowerCase().indexOf("<script") === 0;
}
function runFunc (obj) {
obj.func();
obj.depth++;
flush(obj);
}
function loadScript (obj) {
loading++;
// async loading code from jQuery
var script = document.createElement("script");
if(obj.type) { script.type = obj.type; }
if(obj.charset) { script.charset = obj.charset; }
if(obj.language) { script.language = obj.language; }
logScript(obj);
var done = false;
// Attach handlers for all browsers
script.onload = script.onreadystatechange = function() {
loading--;
script.loaded = true;
if ( !done && (!this.readyState ||
this.readyState === "loaded" || this.readyState === "complete") ) {
done = true;
script.onload = script.onreadystatechange = null;
debug("onload " + obj.src,obj);
flush(obj);
}
};
script.loaded = false;
script.src = obj.src;
obj.depth++;
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709 and #4378).
head.insertBefore( script,head.firstChild );
setTimeout(function() {
if(!script.loaded) { throw new Error("SCRIPT NOT LOADED: " + script.src); }
},obj.timeout);
}
function logScript (obj,code,lang) {
debug((code ?
"Inline " + lang + ": " + code.replace("\n"," ").substr(0,30) + "..." :
"Inject " + obj.src),obj);
}
function separateScriptsFromHtml (htmlStr) {
return split(htmlStr,splitScriptsRegex);
}
function split (str,regexp) {
var match,prevIndex=0,tmp,result = [],l;
if(support.splitWithCapturingParentheses) {
tmp = str.split(regexp);
} else {
// Cross browser split technique from Steven Levithan
// http://blog.stevenlevithan.com/archives/cross-browser-split
tmp = [];
while(match = regexp.exec(str)) {
if(match.index > prevIndex) {
result.push(str.slice(prevIndex,match.index));
}
if(match.length > 1 && match.index < str.length) {
Array.prototype.push.apply(tmp,match.slice(1));
}
prevIndex = regexp.lastIndex;
}
if(prevIndex < str.length) {
tmp.push(str.slice(prevIndex));
}
}
for(i=0,l=tmp.length; i<l; i=i+1) {
if(tmp[i]!=="") { result.push(tmp[i]); }
}
return result;
}
function stripNoScript (html) {
return html.replace(/
function trim (str) {
if(!str) { return str; }
return str.replace(/^\s|\s$/gi,"");
}
function writeHtml (html,obj) {
if( isScript(html) ) {
var dummy = document.createElement("div");
dummy.innerHTML = "dummy
var script = dummy.children[0].children[0];
var lang = script.getAttribute("language") || "javascript";
if(script.src) {
obj.src = script.src;
obj.charset = script.charset;
obj.language = lang;
obj.type = script.type;
loadScript(obj);
} else {
var code = trim( script.text );
if(code) {
logScript( obj,lang);
globalEval( code,lang);
}
flush(obj);
}
} else {
var container = getCachedElById(obj.domId);
if(!container) {
throw new Error("crapLoader: Unable to inject html. Element with id '" + obj.domId + "' does not exist");
}
html = trim(html); // newline before <object> cause weird effects in IE
if(html) {
container.innerHTML += html;
}
checkWriteBuffer(obj);
}
}
function writeReplacement (str) {
inputBuffer.push(str);
debug("write: " + str);
}
function openReplacement () {
// document.open() just returns the document when called from a blocking script:
// http://www.whatwg.org/specs/web-apps/current-work/#dom-document-open
return document;
}
function closeReplacement () {
// document.close() does nothing when called from a blocking script:
// http://www.whatwg.org/specs/web-apps/current-work/#dom-document-close
}
publ = {
hijack: function(options) {
if(isHijacked) { return; }
isHijacked = true;
extend(globalOptions,options);
if(globalOptions.parallel && !support.scriptOnloadTriggeredAccurately) {
globalOptions.parallel = false;
debug("Browsers onload is not reliable. Disabling parallel loading.");
}
document.write = document.writeln = writeReplacement;
document.open = openReplacement;
document.close = closeReplacement;
document.getElementById = getElementByIdReplacement;
},release: function() {
if(!isHijacked) { return; }
isHijacked = false;
document.write = this.orgWrite;
document.writeln = this.orgWriteLn;
document.open = this.orgOpen;
document.close = this.orgClose;
document.getElementById = this.orgGetElementById;
elementCache = {};
},handle: function(options) {
if(!isHijacked) {
debug("Not in hijacked mode. Auto-hijacking.");
this.hijack();
}
var defaultOptsCopy = extend({},defaultOptions);
var obj = extend(defaultOptsCopy,options);
obj.depth = 0;
if (!obj.domId) {
obj.domId = "craploader_" + new Date().getTime();
var span = document.createElement("span");
span.id = obj.domId;
document.body.appendChild(span);
}
if (options.func) {
runFunc(obj);
return;
}
if(globalOptions.parallel) {
setTimeout(function() {
loadScript(obj);
},1);
} else {
queue.push(obj);
setTimeout(function() {
if(loading === 0) {
checkQueue();
}
},1);
}
},loadScript: function(src,domId,options) {
if (typeof domId !== "string") {
options = domId;
domId = undefined;
}
this.handle(extend({
src: src,domId: domId
},options));
},runFunc: function(func,options) {
if (typeof domId !== "string") {
options = domId;
domId = undefined;
}
this.handle( extend({
domId: domId,func: func
},options) );
},orgGetElementById : document.getElementById,orgWrite : document.write,orgWriteLn : document.writeln,orgOpen : document.open,orgClose : document.close,_olt : 1,_oltCallback : function() {
support.scriptOnloadTriggeredAccurately = (publ._olt===2);
}
};
return publ;
}());
demo.PHP示例程序如下: