php广告加载类用法实例

前端之家收集整理的这篇文章主要介绍了php广告加载类用法实例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本文实例讲述了PHP广告加载类的用法,非常实用。分享给大家供大家参考。具体方法如下:

PHP广告加载类,支持异步与同步加载。需要使用Jquery实现。

ADLoader.class.PHP文件如下:

PHP;"> class ADLoader{ // class start

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"&gt;'); 
      array_push($html,'<script type="text/javascript"&gt;'); 
      array_push($html,'ADLoader.preload('.json_encode($ad).');'); 
      array_push($html,'</script>'); 
      array_push($html,'</div>'); 
    } 
  } 

  array_push($html,'<script type="text/javascript"&gt;'); 
  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
?>

ADConfig.PHP文件如下:

PHP;"> return array(

'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文件如下:

var _ads = [],// 广告集合
_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

" + html + "
"; // trick for IE
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示例程序如下:

PHP;"> <Meta http-equiv="content-type" content="text/html; charset=utf-8"> AD Loader