当前位置:首页 > PHP教程 > php类库 > 列表

php广告加载类用法实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-04-14 11:29:59 浏览: 评论:0 

这篇文章主要介绍了php广告加载类用法实例,采用jQuery技术可实现异步与同步加载,具有非常广泛的实用价值,需要的朋友可以参考下

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

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

ADLoader.class.php类文件如下:

  1. <?php  
  2. /** 广告加载管理类  
  3. *  Date:  2013-08-04  
  4. *  Author: fdipzone  
  5. *  Ver:  1.0  
  6.  
  7. *  Func:  
  8. *  public load     加载广告集合  
  9. *  public setConfig  广告配置  
  10. *  private getAds    根据channel创建广告集合  
  11. *  private genZoneId  zoneid base64_encode 处理  
  12. *  private genHtml   生成广告html  
  13. *  private checkBrowser 检查是否需要同步加载的浏览器  
  14. */ 
  15.    
  16. class ADLoader{ // class start  
  17.    
  18.   private static $_ads = array();   // 广告集合  
  19.   private static $_step = 300;    // 广告加载间隔  
  20.   private static $_async = true;   // 是否异步加载  
  21.   private static $_config = array(); // 广告设置文件  
  22.   private static $_jsclass = null;  // 广告JS class  
  23.    
  24.    
  25.   /** 加载广告集合  
  26.   * @param String $channel 栏目,对应config文件  
  27.   * @param int   $step  广告加载间隔  
  28.   * @param boolean $async  是否异步加载  
  29.   */ 
  30.   public static function load($channel=''$step=''$async=''){  
  31.     if(isset($step) && is_numeric($step) && $step>0){  
  32.       self::$_step = $step;  
  33.     }  
  34.    
  35.     if(isset($async) && is_bool($async)){  
  36.       self::$_async = $async;  
  37.     }  
  38.    
  39.     // 判断浏览器,如IE强制使用同步加载  
  40.     if(!self::checkBrowser()){  
  41.       self::$_async = false;  
  42.     }  
  43.    
  44.     self::getAds($channel);  
  45.     self::genZoneId();  
  46.    
  47.     return self::genHtml();  
  48.   }  
  49.    
  50.   /** 设置config  
  51.   * @param String $config 广告配置  
  52.   * @param String $jsclass js class文件路径  
  53.   */ 
  54.   public static function setConfig($config=array(), $jsclass=''){  
  55.     self::$_config = $config;  
  56.     self::$_jsclass = $jsclass;  
  57.   }  
  58.    
  59.    
  60.   /** 根据channel创建广告集合  
  61.   * @param String $channel 栏目  
  62.   */ 
  63.   private static function getAds($channel=''){  
  64.     $AD_Config = self::$_config;  
  65.     if($AD_Config!=null){  
  66.       self::$_ads = isset($AD_Config[$channel])? $AD_Config[$channel] : $AD_Config['default'];  
  67.     }  
  68.   }  
  69.    
  70.   /** zoneid base64_encode 处理 */ 
  71.   private static function genZoneId(){  
  72.    
  73.     // 同步加载广告不需要处理zoneid  
  74.     if(!self::$_async){  
  75.       return ;  
  76.     }  
  77.    
  78.     $ads = self::$_ads;  
  79.     for($i=0,$len=count($ads); $i<$len$i++){  
  80.       if(isset($ads[$i]['zoneId'])){  
  81.         $ads[$i]['zoneId'] = base64_encode('var zoneid='.$ads[$i]['zoneId'].';');  
  82.       }  
  83.     }  
  84.     self::$_ads = $ads;  
  85.   }  
  86.    
  87.   /** 生成广告html */ 
  88.   private static function genHtml(){  
  89.     $ads = self::$_ads;  
  90.     $html = array();  
  91.     if(self::$_jsclass!=null && $ads){  
  92.       array_push($html'<script type="text/javascript" src="'.self::$_jsclass.'"></script>');  
  93.    
  94.       // 同步需要预先加载  
  95.       if(!self::$_async){  
  96.         foreach($ads as $ad){  
  97.           array_push($html'<div id="'.$ad['domId'].'_container" style="display:none">');  
  98.           array_push($html'<script type="text/javascript">');  
  99.           array_push($html'ADLoader.preload('.json_encode($ad).');');  
  100.           array_push($html'</script>');  
  101.           array_push($html'</div>');  
  102.         }  
  103.       }  
  104.    
  105.       array_push($html'<script type="text/javascript">');  
  106.       array_push($html'var ads='.json_encode($ads).';');  
  107.       array_push($html'$(document).ready(function(){ ADLoader.load(ads, '.self::$_step.', '.intval(self::$_async).'); });');  
  108.       array_push($html'</script>');  
  109.     }  
  110.     return implode("\r\n"$html);  
  111.   } //www.phpfensi.com 
  112.    
  113.   /** 判断是否需要强制同步加载的浏览器 */ 
  114.   private static function checkBrowser(){  
  115.     $user_agent = $_SERVER['HTTP_USER_AGENT'];  
  116.     if(strstr($user_agent,'MSIE')!=''){  
  117.       return false;  
  118.     }  
  119.     return true;  
  120.   }  
  121.    
  122. // class end  
  123. ?> 

ADConfig.php文件如下:

  1. <?php  
  2. /** 广告配置文件 **/ 
  3.    
  4. return array(  
  5.    
  6.   'case_openx' => array(  
  7.     array(  
  8.       'type' => 'openx',  
  9.       'domId' => 'ad_728x90',  
  10.       'zoneId' => 452  
  11.     ),  
  12.     array(  
  13.       'type' => 'openx',  
  14.       'domId' => 'ad_300x250',  
  15.       'zoneId' => 449  
  16.     ),  
  17.     array(  
  18.       'type' => 'openx',  
  19.       'domId' => 'ad_l2_300x250',  
  20.       'zoneId' => 394  
  21.     ),  
  22.   ),  
  23.    
  24.   'case_url' => array(  
  25.     array(  
  26.       'type' => 'url',  
  27.       'domId' => 'ad_728x90',  
  28.       'url' => 'adurl.php?zoneid=452' 
  29.     ),  
  30.     array(  
  31.       'type' => 'url',  
  32.       'domId' => 'ad_300x250',  
  33.       'url' => 'adurl.php?zoneid=449' 
  34.     ),  
  35.     array(  
  36.       'type' => 'url',  
  37.       'domId' => 'ad_l2_300x250',  
  38.       'url' => 'adurl.php?zoneid=394' 
  39.     )  
  40.   ),  
  41.    
  42.   'case_sync_openx' => array(  
  43.     array(  
  44.       'type' => 'openx',  
  45.       'domId' => 'ad_728x90',  
  46.       'zoneId' => 452  
  47.     ),  
  48.     array(  
  49.       'type' => 'openx',  
  50.       'domId' => 'ad_300x250',  
  51.       'zoneId' => 449  
  52.     ),  
  53.     array(  
  54.       'type' => 'openx',  
  55.       'domId' => 'ad_l2_300x250',  
  56.       'zoneId' => 394  
  57.     ),  
  58.   ),  
  59.    
  60.   'default' => array(  
  61.     array(  
  62.       'type' => 'openx',  
  63.       'domId' => 'ad_728x90',  
  64.       'zoneId' => 452  
  65.     ),  
  66.     array(  
  67.       'type' => 'openx',  
  68.       'domId' => 'ad_300x250',  
  69.       'zoneId' => 449  
  70.     ),  
  71.     array(  
  72.       'type' => 'openx',  
  73.       'domId' => 'ad_l2_300x250',  
  74.       'zoneId' => 394  
  75.     ),  
  76.   ),  
  77.    
  78. );  
  79.    
  80. ?> 

ADLoader.js文件如下:

  1. /** 异步加载广告  
  2. *  Date:  2013-08-04  
  3. *  Author: fdipzone  
  4. *  Ver:  1.0  
  5. */ 
  6. var ADLoader = (function(){  
  7.    
  8.   var _ads = [],   // 广告集合  
  9.     _step = 300,  // 广告加载间隔  
  10.     _async = true, // 是否异步加载  
  11.     _loaded = 0;  // 已经加载的广告数  
  12.      
  13.   /** loadAd 循环加载广告  
  14.   * @param int c 第几个广告  
  15.   */ 
  16.   function loadAD(c){  
  17.     if(_loaded>=_ads.length){  
  18.       return ;  
  19.     }  
  20.    
  21.     if($('#'+_ads[c].domId).length>0){ // 判断dom是否存在  
  22.    
  23.       if(_async){ // 异步执行  
  24.    
  25.         crapLoader.loadScript(getScript(_ads[c]), _ads[c].domId, {  
  26.           success: function(){  
  27.             completeAd();  
  28.           }  
  29.         });  
  30.          
  31.       }else// 将同步加载的广告显示  
  32.    
  33.         var ad_container = $('#'+_ads[c].domId+'_container');  
  34.         ad_container.find('embed').attr('wmode','transparent').end().find('object').each(function(k, v){  
  35.           v.wmode = 'transparent'// 将flash变透明  
  36.         });  
  37.         $('#'+_ads[c].domId)[0].appendChild(ad_container[0]);  
  38.         ad_container.show();  
  39.            
  40.         completeAd();  
  41.       }  
  42.     }else// dom不存在  
  43.       completeAd();  
  44.     }  
  45.   }  
  46.    
  47.   /** 加载完广告后处理 */ 
  48.   function completeAd(){  
  49.     _loaded ++;  
  50.     setTimeout(function(){  
  51.       loadAD(_loaded);  
  52.     }, _step);      
  53.   }  
  54.    
  55.   /** 获取广告  
  56.   * @param Array ad 广告参数  
  57.   */ 
  58.   function getScript(ad){  
  59.     var ret = null;  
  60.    
  61.     switch(ad.type){  
  62.       case 'openx'// openx code ad  
  63.         ret = 'data:text/javascript;base64,' + ad.zoneId + 'dmFyIG0zX3UgPSAobG9jYXRpb24ucHJvdG9jb2w9PSdodHRwczonPydodHRwczovL2Fkcy5ubWcuY29tLmhrL3d3dy9kZWxpdmVyeS9hanMucGhwJzonaHR0cDovL2Fkcy5ubWcuY29tLmhrL3d3dy9kZWxpdmVyeS9hanMucGhwJyk7CnZhciBtM19yID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjk5OTk5OTk5OTk5KTsKaWYgKCFkb2N1bWVudC5NQVhfdXNlZCkgZG9jdW1lbnQuTUFYX3VzZWQgPSAnLCc7CmRvY3VtZW50LndyaXRlICgiPHNjciIrImlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0nIittM191KTsKZG9jdW1lbnQud3JpdGUgKCI/em9uZWlkPSIgKyB6b25laWQpOwpkb2N1bWVudC53cml0ZSAoJyZhbXA7Y2I9JyArIG0zX3IpOwppZiAoZG9jdW1lbnQuTUFYX3VzZWQgIT0gJywnKSBkb2N1bWVudC53cml0ZSAoIiZhbXA7ZXhjbHVkZT0iICsgZG9jdW1lbnQuTUFYX3VzZWQpOwpkb2N1bWVudC53cml0ZSAoZG9jdW1lbnQuY2hhcnNldCA/ICcmYW1wO2NoYXJzZXQ9Jytkb2N1bWVudC5jaGFyc2V0IDogKGRvY3VtZW50LmNoYXJhY3RlclNldCA/ICcmYW1wO2NoYXJzZXQ9Jytkb2N1bWVudC5jaGFyYWN0ZXJTZXQgOiAnJykpOwpkb2N1bWVudC53cml0ZSAoIiZhbXA7bG9jPSIgKyBlc2NhcGUod2luZG93LmxvY2F0aW9uKSk7CmlmIChkb2N1bWVudC5yZWZlcnJlcikgZG9jdW1lbnQud3JpdGUgKCImYW1wO3JlZmVyZXI9IiArIGVzY2FwZShkb2N1bWVudC5yZWZlcnJlcikpOwppZiAoZG9jdW1lbnQuY29udGV4dCkgZG9jdW1lbnQud3JpdGUgKCImY29udGV4dD0iICsgZXNjYXBlKGRvY3VtZW50LmNvbnRleHQpKTsKaWYgKGRvY3VtZW50Lm1tbV9mbykgZG9jdW1lbnQud3JpdGUgKCImYW1wO21tbV9mbz0xIik7CmRvY3VtZW50LndyaXRlICgiJz48XC9zY3IiKyJpcHQ+Iik7';  
  64.         break;  
  65.          
  66.       case 'url'// url ad  
  67.         ret = ad.url;  
  68.         break;  
  69.     }  
  70.     return ret;  
  71.   }  
  72.    
  73.   /** 同步加载广告  
  74.   * @param Array ad 广告参数  
  75.   */ 
  76.   function writeAd(ad){  
  77.     switch(ad.type){  
  78.       case 'openx':  
  79.         var m3_u = (location.protocol=='https:'?'https://ads.nmg.com.hk/www/delivery/ajs.php':'http://ads.nmg.com.hk/www/delivery/ajs.php');  
  80.         var m3_r = Math.floor(Math.random()*99999999999);  
  81.         if (!document.MAX_used) document.MAX_used = ',';  
  82.         document.write ("<scr"+"ipt type='text/javascript' src='"+m3_u);  
  83.         document.write ("?zoneid=" + ad.zoneId);  
  84.         document.write ('&cb=' + m3_r);  
  85.         if (document.MAX_used != ',') document.write ("&exclude=" + document.MAX_used);  
  86.         document.write (document.charset ? '&charset='+document.charset : (document.characterSet ? '&charset='+document.characterSet : ''));  
  87.         document.write ("&loc=" + escape(window.location));  
  88.         if (document.referrer) document.write ("&referer=" + escape(document.referrer));  
  89.         if (document.context) document.write ("&context=" + escape(document.context));  
  90.         if (document.mmm_fo) document.write ("&mmm_fo=1");  
  91.         document.write ("'><\/scr"+"ipt>");  
  92.         break;  
  93.        case 'url':  
  94.         document.write ('<script type="text/javascript" src="' + ad.url + '"></script>');  
  95.         break;  
  96.     }  
  97.   }  
  98.    
  99.   obj = {  
  100.    
  101.     /** 加载广告  
  102.     * @param Array  ads  广告集合  
  103.     * @param int   step 广告加载间隔  
  104.     * @param boolean async true:异步加载 false:同步加载  
  105.     */ 
  106.     load: function(ads, step, async){  
  107.       _ads = ads;  
  108.    
  109.       if(typeof(step)!='undefined'){  
  110.         _step = step;  
  111.       }  
  112.    
  113.       if(typeof(async)!='undefined'){  
  114.         _async = async;  
  115.       }  
  116.    
  117.       loadAD(_loaded);  
  118.     },  
  119.    
  120.     /** 预加载广告 */ 
  121.     preload: function(ad){  
  122.       if($('#'+ad.domId).length>0){  // 判断dom是否存在  
  123.         writeAd(ad);  
  124.       }  
  125.     }  
  126.   }  
  127.   return obj;  
  128.    
  129. }());  
  130.    
  131. /* crapLoader */ 
  132. var crapLoader = (function() {  
  133.      
  134.   var isHijacked = false,  
  135.     queue = [],  
  136.     inputBuffer = [],  
  137.     writeBuffer = {},  
  138.     loading = 0,  
  139.     elementCache = {},  
  140.     returnedElements = [],  
  141.     splitScriptsRegex = /(<script[\s\S]*?<\/script>)/gim,  
  142.     globalOptions = {  
  143.       autoRelease: true,  
  144.       parallel: true,  
  145.       debug: false 
  146.     },  
  147.     defaultOptions = {  
  148.       charset: undefined,  
  149.       success: undefined,  
  150.       func: undefined,  
  151.       src: undefined,  
  152.       timeout: 3000  
  153.     },publ,  
  154.     head = document.getElementsByTagName("head")[0] || document.documentElement,  
  155.     support = {  
  156.       scriptOnloadTriggeredAccurately: false,  
  157.       splitWithCapturingParentheses: ("abc".split(/(b)/)[1]==="b")  
  158.     };  
  159.      
  160.   function checkQueue () {  
  161.     if(queue.length) {  
  162.       loadScript( queue.shift() );  
  163.     } else if(loading === 0 && globalOptions.autoRelease) {  
  164.       debug("Queue is empty. Auto-releasing.");  
  165.       publ.release();  
  166.     }  
  167.   }  
  168.    
  169.   function checkWriteBuffer (obj) {  
  170.     var buffer = writeBuffer[obj.domId],  
  171.       returnedEl;  
  172.    
  173.     if(buffer && buffer.length) {  
  174.       writeHtml( buffer.shift(), obj );  
  175.    
  176.     } else {  
  177.       while (returnedElements.length > 0) {  
  178.         returnedEl = returnedElements.pop();  
  179.         var id = returnedEl.id;  
  180.         var elInDoc = getElementById(id);  
  181.         if (!elInDoc) { continue; }  
  182.         var parent = elInDoc.parentNode;  
  183.         elInDoc.id = id + "__tmp";  
  184.         parent.insertBefore(returnedEl, elInDoc);  
  185.         parent.removeChild(elInDoc);  
  186.       }  
  187.       finished(obj);  
  188.     }  
  189.   }  
  190.    
  191.   function debug (message, obj) {  
  192.     if(!globalOptions.debug || !window.console) { return; }  
  193.     var objExtra = "";  
  194.     if(obj) {  
  195.       objExtra = "#"+obj.domId+" ";  
  196.       var depth = obj.depth;  
  197.       while(depth--) { objExtra += "  "; }  
  198.     }  
  199.     console.log("crapLoader " + objExtra + message);  
  200.   }  
  201.    
  202.   function extend (t, s) {  
  203.     var k;  
  204.     if(!s) { return t; }  
  205.     for(k in s) {  
  206.       t[k] = s[k];  
  207.     }  
  208.     return t;  
  209.   }  
  210.    
  211.   function finished (obj) {  
  212.     if(obj.success && typeof obj.success === "function") {  
  213.       obj.success.call( document.getElementById(obj.domId) );  
  214.     }  
  215.     checkQueue();  
  216.   }  
  217.    
  218.   function flush (obj) {  
  219.     var domId = obj.domId,  
  220.       outputFromScript,  
  221.       htmlPartArray;  
  222.    
  223.     outputFromScript = stripNoScript( inputBuffer.join("") );  
  224.     inputBuffer = [];  
  225.    
  226.     htmlPartArray = separateScriptsFromHtml( outputFromScript );  
  227.    
  228.     if(!writeBuffer[domId]) {  
  229.       writeBuffer[domId] = htmlPartArray;  
  230.     } else {  
  231.       Array.prototype.unshift.apply(writeBuffer[domId], htmlPartArray);  
  232.     }  
  233.     checkWriteBuffer(obj);  
  234.   }  
  235.    
  236.   function getCachedElById (domId) {  
  237.     return elementCache[domId] || (elementCache[domId] = document.getElementById(domId));  
  238.   }  
  239.    
  240.   function getElementById (domId) {  
  241.     return ( publ.orgGetElementById.call ?  
  242.       publ.orgGetElementById.call(document, domId) :  
  243.       publ.orgGetElementById(domId) );  
  244.   }  
  245.    
  246.   function getElementByIdReplacement (domId) {  
  247.     var el = getElementById(domId),  
  248.       html, frag, div, found;  
  249.    
  250.     function traverseForElById(domId, el) {  
  251.       var children = el.children, i, l, child;  
  252.       if(children && children.length) {  
  253.         for(i=0,l=children.length; i<l; i++) {  
  254.           child = children[i];  
  255.           if(child.id && child.id === domId) { return child; }  
  256.           if(child.children && child.children.length) {  
  257.             var tmp = traverseForElById(domId, child);  
  258.             if (tmp) return tmp;  
  259.           }  
  260.         }  
  261.       }  
  262.     }  
  263.    
  264.     function searchForAlreadyReturnedEl(domId) {  
  265.       var i, l, returnedEl;  
  266.       for(i=0,l=returnedElements.length; i<l; i++) {  
  267.         returnedEl = returnedElements[i];  
  268.         if(returnedEl.id === domId) { return returnedEl; }  
  269.       }  
  270.     }  
  271.    
  272.     if(el) { return el; }  
  273.    
  274.     if (returnedElements.length) {  
  275.       found = searchForAlreadyReturnedEl(domId);  
  276.       if (found) {  
  277.         return found;  
  278.       }  
  279.     }  
  280.    
  281.     if(inputBuffer.length) {  
  282.       html = inputBuffer.join("");  
  283.       frag = document.createDocumentFragment();  
  284.       div = document.createElement("div");  
  285.       div.innerHTML = html;  
  286.       frag.appendChild(div);  
  287.       found = traverseForElById(domId, div);  
  288.       if (found) {  
  289.         returnedElements.push(found);  
  290.       }  
  291.       return found;  
  292.     }  
  293.   }  
  294.    
  295.   var globalEval = (function () {  
  296.     return (window.execScript ? function(code, language) {  
  297.       window.execScript(code, language || "JavaScript");  
  298.     } : function(code, language) {  
  299.       if(language && !/^javascript/i.test(language)) { return; }  
  300.       window.eval.call(window, code);  
  301.     });  
  302.   }());  
  303.    
  304.   function isScript (html) {  
  305.     return html.toLowerCase().indexOf("<script") === 0;  
  306.   }  
  307.    
  308.   function runFunc (obj) {  
  309.     obj.func();  
  310.     obj.depth++;  
  311.     flush(obj);  
  312.   }  
  313.    
  314.   function loadScript (obj) {  
  315.     loading++;  
  316.     // async loading code from jQuery  
  317.     var script = document.createElement("script");  
  318.     if(obj.type) { script.type = obj.type; }  
  319.     if(obj.charset) { script.charset = obj.charset; }  
  320.     if(obj.language) { script.language = obj.language; }  
  321.    
  322.     logScript(obj);  
  323.    
  324.     var done = false;  
  325.     // Attach handlers for all browsers  
  326.     script.onload = script.onreadystatechange = function() {  
  327.       loading--;  
  328.       script.loaded = true;  
  329.       if ( !done && (!this.readyState ||  
  330.           this.readyState === "loaded" || this.readyState === "complete") ) {  
  331.         done = true;  
  332.         script.onload = script.onreadystatechange = null;  
  333.         debug("onload " + obj.src, obj);  
  334.         flush(obj);  
  335.       }  
  336.     };  
  337.    
  338.     script.loaded = false;  
  339.     script.src = obj.src;  
  340.     obj.depth++;  
  341.    
  342.     // Use insertBefore instead of appendChild to circumvent an IE6 bug.  
  343.     // This arises when a base node is used (#2709 and #4378).  
  344.     head.insertBefore( script, head.firstChild );  
  345.     setTimeout(function() {  
  346.       if(!script.loaded) { throw new Error("SCRIPT NOT LOADED: " + script.src); }  
  347.     }, obj.timeout);  
  348.   }  
  349.    
  350.   function logScript (obj, code, lang) {  
  351.     debug((code ?  
  352.       "Inline " + lang + ": " + code.replace("\n"" ").substr(0, 30) + "..." :  
  353.       "Inject " + obj.src), obj);  
  354.   }  
  355.    
  356.   function separateScriptsFromHtml (htmlStr) {  
  357.     return split(htmlStr, splitScriptsRegex);  
  358.   }  
  359.    
  360.   function split (str, regexp) {  
  361.     var match, prevIndex=0, tmp, result = [], i, l;  
  362.    
  363.     if(support.splitWithCapturingParentheses) {  
  364.       tmp = str.split(regexp);  
  365.     } else {  
  366.       // Cross browser split technique from Steven Levithan  
  367.       // http://blog.stevenlevithan.com/archives/cross-browser-split  
  368.       tmp = [];  
  369.       while(match = regexp.exec(str)) {  
  370.         if(match.index > prevIndex) {  
  371.           result.push(str.slice(prevIndex, match.index));  
  372.         }  
  373.    
  374.         if(match.length > 1 && match.index < str.length) {  
  375.           Array.prototype.push.apply(tmp, match.slice(1));  
  376.         }  
  377.    
  378.         prevIndex = regexp.lastIndex;  
  379.       }  
  380.    
  381.       if(prevIndex < str.length) {  
  382.         tmp.push(str.slice(prevIndex));  
  383.       }  
  384.    
  385.     }  
  386.    
  387.     for(i=0, l=tmp.length; i<l; i=i+1) {  
  388.       if(tmp[i]!=="") { result.push(tmp[i]); }  
  389.     }  
  390.     return result;  
  391.   }  
  392.    
  393.   function stripNoScript (html) {  
  394.     return html.replace(/<noscript>[\s\S]*?<\/noscript>/ig, "");  
  395.   }  
  396.    
  397.   function trim (str) {  
  398.     if(!str) { return str; }  
  399.     return str.replace(/^\s*|\s*$/gi, "");  
  400.   }  
  401.    
  402.   function writeHtml (html, obj) {  
  403.     if( isScript(html) ) {  
  404.       var dummy = document.createElement("div");  
  405.       dummy.innerHTML = "dummy<div>" + html + "</div>"// trick for IE  
  406.       var script = dummy.children[0].children[0];  
  407.       var lang = script.getAttribute("language") || "javascript";  
  408.       if(script.src) {  
  409.         obj.src = script.src;  
  410.         obj.charset = script.charset;  
  411.         obj.language = lang;  
  412.         obj.type = script.type;  
  413.         loadScript(obj);  
  414.       } else {  
  415.         var code = trim( script.text );  
  416.         if(code) {  
  417.           logScript( obj, code, lang);  
  418.           globalEval( code, lang);  
  419.         }  
  420.         flush(obj);  
  421.       }  
  422.     } else {  
  423.       var container = getCachedElById(obj.domId);  
  424.       if(!container) {  
  425.         throw new Error("crapLoader: Unable to inject html. Element with id '" + obj.domId + "' does not exist");  
  426.       }  
  427.          
  428.       html = trim(html); // newline before <object> cause weird effects in IE  
  429.       if(html) {  
  430.         container.innerHTML += html;  
  431.       }  
  432.       checkWriteBuffer(obj);  
  433.     }  
  434.   }  
  435.    
  436.   function writeReplacement (str) {  
  437.     inputBuffer.push(str);  
  438.     debug("write: " + str);  
  439.   }  
  440.    
  441.   function openReplacement () {  
  442.     // document.open() just returns the document when called from a blocking script:  
  443.     // http://www.whatwg.org/specs/web-apps/current-work/#dom-document-open  
  444.     return document;  
  445.   }  
  446.    
  447.   function closeReplacement () {  
  448.     // document.close() does nothing when called from a blocking script:  
  449.     // http://www.whatwg.org/specs/web-apps/current-work/#dom-document-close  
  450.   }  
  451.    
  452.   publ = {  
  453.     hijack: function(options) {  
  454.       if(isHijacked) { return; }  
  455.       isHijacked = true;  
  456.       extend(globalOptions, options);  
  457.       if(globalOptions.parallel && !support.scriptOnloadTriggeredAccurately) {  
  458.         globalOptions.parallel = false;  
  459.         debug("Browsers onload is not reliable. Disabling parallel loading.");  
  460.       }  
  461.    
  462.       document.write = document.writeln = writeReplacement;  
  463.       document.open = openReplacement;  
  464.       document.close = closeReplacement;  
  465.       document.getElementById = getElementByIdReplacement;  
  466.     },  
  467.    
  468.     release: function() {  
  469.       if(!isHijacked) { return; }  
  470.       isHijacked = false;  
  471.       document.write = this.orgWrite;  
  472.       document.writeln = this.orgWriteLn;  
  473.       document.open = this.orgOpen;  
  474.       document.close = this.orgClose;  
  475.       document.getElementById = this.orgGetElementById;  
  476.       elementCache = {};  
  477.     },  
  478.    
  479.     handle: function(options) {  
  480.       if(!isHijacked) {  
  481.         debug("Not in hijacked mode. Auto-hijacking.");  
  482.         this.hijack();  
  483.       }  
  484.       var defaultOptsCopy = extend({}, defaultOptions);  
  485.       var obj = extend(defaultOptsCopy, options);  
  486.       obj.depth = 0;  
  487.    
  488.       if (!obj.domId) {  
  489.         obj.domId = "craploader_" + new Date().getTime();  
  490.         var span = document.createElement("span");  
  491.         span.id = obj.domId;  
  492.         document.body.appendChild(span);  
  493.       }  
  494.    
  495.       if (options.func) {  
  496.         runFunc(obj);  
  497.         return;  
  498.       }  
  499.    
  500.       if(globalOptions.parallel) {  
  501.         setTimeout(function() {  
  502.           loadScript(obj);  
  503.         }, 1);  
  504.       } else {  
  505.         queue.push(obj);  
  506.         setTimeout(function() {  
  507.           if(loading === 0) {  
  508.             checkQueue();  
  509.           }  
  510.         }, 1);  
  511.       }  
  512.     },  
  513.    
  514.     loadScript: function(src, domId, options) {  
  515.       if (typeof domId !== "string") {  
  516.         options = domId;  
  517.         domId = undefined;  
  518.       }  
  519.       this.handle(extend({  
  520.         src:  src,  
  521.         domId: domId  
  522.       }, options));  
  523.     },  
  524.    
  525.     runFunc: function(func, domId, options) {  
  526.       if (typeof domId !== "string") {  
  527.         options = domId;  
  528.         domId = undefined;  
  529.       }  
  530.       this.handle( extend({  
  531.         domId: domId,  
  532.         func:   func  
  533.       }, options) );  
  534.     },  
  535.    
  536.     orgGetElementById  : document.getElementById,  
  537.     orgWrite      : document.write,  
  538.     orgWriteLn     : document.writeln,  
  539.     orgOpen       : document.open,  
  540.     orgClose      : document.close,  
  541.     _olt        : 1,  
  542.     _oltCallback    : function() {  
  543.       support.scriptOnloadTriggeredAccurately = (publ._olt===2);  
  544.     } //www.phpfensi.com 
  545.   };  
  546.    
  547.   return publ;  
  548. }()); 

demo.php示例程序如下:

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  2. <html>  
  3.  <head>  
  4.  <meta http-equiv="content-type" content="text/html; charset=utf-8">  
  5.  <title> AD Loader </title>  
  6.  <style type="text/css">  
  7.  .banner1{margin:10px; border:1px solid #CCCCCC; width:728px; height:90px;}  
  8.  .banner2{margin:10px; border:1px solid #CCCCCC; width:300px; height:250px;}  
  9.  </style>  
  10.  <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.1.min.js"></script>  
  11.  </head>  
  12.    
  13.  <body>  
  14.  <div class="banner1" id="ad_728x90"></div>  
  15.  <div class="banner2" id="ad_300x250"></div>  
  16.  <div class="banner2" id="ad_l2_300x250"></div>  
  17.      
  18.  <?php  
  19.   function showAD($channel='', $step='', $async=''){  
  20.    include('ADLoader.class.php');  
  21.    $ad_config = include('ADConfig.php');  
  22.    ADLoader::setConfig($ad_config, 'ADLoader.js');  
  23.    return ADLoader::load($channel, $step, $async);  
  24.   }  
  25.    
  26.   echo showAD('case_openx'); // 异步加载  
  27.   //echo showAD('case_url');  // url方式异步加载  
  28.   //echo showAD('case_sync_openx', 300, false); // 同步加载  
  29.  ?>  
  30.    
  31.  </body>  
  32. </html> 

adurl.php文件如下:

  1. <?php 
  2. $zoneid = isset($_GET['zoneid'])? intval($_GET['zoneid']) : 0;  
  3. if($zoneid){  
  4. ?>  
  5. var zoneid = <?=$zoneid ?>;  
  6. var m3_u = (location.protocol=='https:'?'https://ads.nmg.com.hk/www/delivery/ajs.php':'http://ads.nmg.com.hk/www/delivery/ajs.php');  
  7. var m3_r = Math.floor(Math.random()*99999999999);  
  8. if (!document.MAX_used) document.MAX_used = ',';  
  9. document.write ("<scr"+"ipt type='text/javascript' src='"+m3_u);  
  10. document.write ("?zoneid=" + zoneid);  
  11. document.write ('&cb=' + m3_r);  
  12. if (document.MAX_used != ',') document.write ("&exclude=" + document.MAX_used);  
  13. document.write (document.charset ? '&charset='+document.charset : (document.characterSet ? '&charset='+document.characterSet : ''));  
  14. document.write ("&loc=" + escape(window.location));  
  15. if (document.referrer) document.write ("&referer=" + escape(document.referrer));  
  16. if (document.context) document.write ("&context=" + escape(document.context));  
  17. if (document.mmm_fo) document.write ("&mmm_fo=1");  
  18. document.write ("'><\/scr"+"ipt>");  
  19. <? } ?> 

Tags: php广告加载类

分享到: