当前位置: 首页 > news >正文

daoi php_php 广告加载类

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

ADLoader.class.php

/** 广告加载管理类

* Date: 2013-08-04

* Author: fdipzone

* Ver: 1.0

*

* Func:

* public load 加载广告集合

* public setConfig 广告配置

* private getAds 根据channel创建广告集合

* private genZoneId zoneid base64_encode 处理

* private genHtml 生成广告html

* private checkBrowser 检查是否需要同步加载的浏览器

*/

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

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, '');

// 同步需要预先加载

if(!self::$_async){

foreach($ads as $ad){

array_push($html, '

');

array_push($html, '

array_push($html, 'ADLoader.preload('.json_encode($ad).');');

array_push($html, '');

array_push($html, '

');

}

}

array_push($html, '

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, '');

}

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

/** 广告配置文件 **/

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 ("

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 ("'>");

break;

case 'url':

document.write ('');

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);

},

/** 预加载广告 */

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 = /(

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

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

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("

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 = [], 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

if(tmp[i]!=="") { result.push(tmp[i]); }

}

return result;

}

function stripNoScript (html) {

return html.replace(/

[\s\S]*?<\/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

" + 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, 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 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

AD Loader

.banner1{margin:10px; border:1px solid #CCCCCC; width:728px; height:90px;}

.banner2{margin:10px; border:1px solid #CCCCCC; width:300px; height:250px;}

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); // 同步加载

?>

相关文章:

  • 参考文献起止页码怎么写_会议论文的参考文献格式
  • css 右上角 翻开动画_「冷知识」为什么不要随意操作 CSS?
  • 熊出没机器人光头强_《熊出没》五大兵器,天才威与光头强的战斗机器人谁更厉害?...
  • 北邮 复习 软件工程_重磅!厦大、北邮改考408!反向抄底厦大,面朝大海?
  • ambari hdfs 启动报错_HDFS这些问题你会处理吗?
  • cvc 降噪_耳机降噪技术-ANC、ENC、DSP、CVC
  • 怎么看mmdetection版本_kaggle notebook运行mmdetection并提交结果采坑记
  • matlab hsi图像分割_图像分割之阈值分割(matlab)
  • imx6 配置串口波特率_STM32F103 串口的使用方法
  • 十天征服单片机百度云_单片机学习「1」 初始51单片机
  • jpa删除数据后数据库无修改_Java编程第46讲——强大、奇妙的数据库操作工具JPA...
  • 有赞小程序源码_有赞小程序商城怎么开通,如何收费?
  • docker pycharm 连接_七、连Pycharm都不知道怎么用,学什么Python
  • github图片_通过这个 Go 项目搭建一个图片服务器竟然这么简单
  • pecs_神奇的PECS是什么?看看BCaBA教师们怎么说
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • Angular 响应式表单之下拉框
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CSS实用技巧干货
  • express.js的介绍及使用
  • javascript从右向左截取指定位数字符的3种方法
  • KMP算法及优化
  • MYSQL 的 IF 函数
  • Python十分钟制作属于你自己的个性logo
  • Python学习之路16-使用API
  • React系列之 Redux 架构模式
  • spring学习第二天
  • Vue 重置组件到初始状态
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 看域名解析域名安全对SEO的影响
  • 码农张的Bug人生 - 见面之礼
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 算法---两个栈实现一个队列
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 消息队列系列二(IOT中消息队列的应用)
  • 新手搭建网站的主要流程
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • MyCAT水平分库
  • 说说我为什么看好Spring Cloud Alibaba
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • # 达梦数据库知识点
  • (java)关于Thread的挂起和恢复
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (差分)胡桃爱原石
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (分布式缓存)Redis哨兵
  • (九)信息融合方式简介
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)编辑寄语:因为爱心,所以美丽
  • **CI中自动类加载的用法总结
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 服务 ServiceController