本文实例讲述了php广告加载类的用法,非常实用。分享给大家供大家参考。具体方法如下:
该php广告加载类,支持异步与同步加载。需要使用Jquery实现。
ADLoader.class.php类文件如下:
<?php /** 广告加载管理类 *Date:2013-08-04 *Author: fdipzone *Ver:1.0 * *Func: *public load 加载广告集合 *public setConfig广告配置 *private getAds根据channel创建广告集合 *private genZoneIdzoneid base64_encode 处理 *private genHtml 生成广告html *private checkBrowser 检查是否需要同步加载的浏览器 */class ADLoader{ // class startprivate 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.""></script>");// 同步需要预先加载 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("
", $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 ), array( "type" => "openx", "domId" => "ad_l2_300x250", "zoneId" => 394 ), ),"case_url" => array( array( "type" => "url", "domId" => "ad_728x90", "url" => "adurl.php?zoneid=452" ), array( "type" => "url", "domId" => "ad_300x250", "url" => "adurl.php?zoneid=449" ), array( "type" => "url", "domId" => "ad_l2_300x250", "url" => "adurl.php?zoneid=394" ) ),"case_sync_openx" => array( array( "type" => "openx", "domId" => "ad_728x90", "zoneId" => 452 ), array( "type" => "openx", "domId" => "ad_300x250", "zoneId" => 449 ), array( "type" => "openx", "domId" => "ad_l2_300x250", "zoneId" => 394 ), ),"default" => array( array( "type" => "openx", "domId" => "ad_728x90", "zoneId" => 452 ), array( "type" => "openx", "domId" => "ad_300x250", "zoneId" => 449 ), array( "type" => "openx", "domId" => "ad_l2_300x250", "zoneId" => 394 ), ),);?>
ADLoader.js文件如下:
/** 异步加载广告 *Date:2013-08-04 *Author: fdipzone *Ver:1.0 */ var ADLoader = (function(){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 + ""></script>"); break; } }obj = {/** 加载广告 * @param Arrayads广告集合 * @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); },/** 预加载广告 */ 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[sS]*?</script>)/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, l, 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("
", " ").substr(0, 30) + "..." : "Inject " + obj.src), obj); }function separateScriptsFromHtml (htmlStr) { return split(htmlStr, splitScriptsRegex); }function split (str, regexp) { var match, prevIndex=0, tmp, result = [], i, 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(/<noscript>[sS]*?</noscript>/ig, ""); }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<div>" + html + "</div>"; // 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, code, 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, domId, 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示例程序如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><title> AD Loader </title><style type="text/css">.banner1{margin:10px; border:1px solid #CCCCCC; width:728px; height:90px;}.banner2{margin:10px; border:1px solid #CCCCCC; width:300px; height:250px;}</style><script type="text/javascript" src="http://code.jquery.com/jquery-1.10.1.min.js"></script></head> <body><div class="banner1" id="ad_728x90"></div><div class="banner2" id="ad_300x250"></div><div class="banner2" id="ad_l2_300x250"></div> <?php function showAD($channel="", $step="", $async=""){include("ADLoader.class.php");$ad_config = include("ADConfig.php");ADLoader::setConfig($ad_config, "ADLoader.js");return ADLoader::load($channel, $step, $async); }echo showAD("case_openx"); // 异步加载 //echo showAD("case_url");// url方式异步加载 //echo showAD("case_sync_openx", 300, false); // 同步加载?> </body> </html>adurl.php文件如下:
<?php$zoneid = isset($_GET["zoneid"])? intval($_GET["zoneid"]) : 0; if($zoneid){ ?> var zoneid = <?=$zoneid ?>; 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=" + 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>"); <? } ?>本文所述完整实例源码点击此处本站下载。
希望本文所述对大家的php程序设计有所帮助。