/** * @description 图片base64加载 * @author lizhouquan */bds.base64 = (function () { //获取base64前置参数 var _opt = bds._base64; //内部数据; var _containerAllId = "container", _containerLeftId = "content_left", _containerRightId = "content_right", _BOTTAGLSNAME = "BASE64_BOTTAG", _domain = bds._base64.domain, //base64图片服务域名 _imgWatch = [], //图片加载观察list,如果没有onload,进行容错 _domLoaded = [], //标识对应dom是否已下载 _data = [], //暂存请求回调数据 _dataLoaded = [], //数据是否返回 _finish = [], //是否已完成渲染 _hasSpImg = false, //是否有左侧模板sp_img走base64加载 _expGroup = 0, //左侧实验组 _reqTime = 0, //请求开始时间 _reqEnd = 0, //请求返回时间 - 右侧 _reqEndL = 0, //请求返回时间 - 左侧 _rsst = 0, //请求开始时间 - 测速 _rest = 0, //请求返回时间 - 测速 _dt = 1, //domain类型 _loadState = {}, //记录imglist的状态 _hasPreload = 0, //记录页面是否开启preload _ispdc = false; //是否开启了性能统计 //异步下发起下次搜索时重置变量 var preXhrs = [],$ = window.$; if($) { $(window).on("swap_begin",function(){ _imgWatch = []; //图片加载观察list,如果没有onload,进行容错 _domLoaded = []; //标识对应dom是否已下载 _data = []; //暂存请求回调数据 _dataLoaded = []; //数据是否返回 _finish = []; //是否已完成渲染 _hasSpImg = false; //是否有左侧模板sp_img走base64加载 _expGroup = 0; //左侧实验组 _reqTime = 0; //请求开始时间 _reqEnd = 0; //请求返回时间 - 右侧 _reqEndL = 0; //请求返回时间 - 左侧 _rsst = 0; //请求开始时间 - 测速 _rest = 0; //请求返回时间 - 测速 _dt = 1; //domain类型 _ispdc = false; //是否开启了性能统计 //停止正在执行的base64回调操作 for(var i = 0 ; i < preXhrs.length; i++) { preXhrs[i].abort(); } }); } //初始化方法 var init = function(imgRight,imgLeft,isPreload){ var imgArr = imgRight || [], imgArr2 = imgLeft || []; if(window.__IS_IMG_PREFETCH){ //异步base64去重 function filter(img){ return !window.__IS_IMG_PREFETCH.hasOwnProperty(img); } imgArr=$.grep(imgArr,filter); imgArr2=$.grep(imgArr2,filter); } if(window.__IMG_PRELOAD && isPreload) { //定义loadState,防止callback乱序 _loadState["cbr"] = 0; _loadState["cbpr"] = 0; _hasPreload = 1; //标记页面中有预取 var imgPreloadList = window.__IMG_PRELOAD = {}; for(var i = 0; i < imgArr.length; i++) { if(!imgPreloadList.hasOwnProperty(imgArr[i])) { window.__IMG_PRELOAD[imgArr[i]] = true; } } } else if(window.__IMG_PRELOAD && !isPreload) { //同步base64右侧去重 var tmpArr = []; for(var i = 0; i < imgArr.length; i++){ if(!window.__IMG_PRELOAD.hasOwnProperty(imgArr[i])) { tmpArr.push(imgArr[i]); } } imgArr = tmpArr; } if(_opt.b64Exp) { _expGroup = _opt.b64Exp; if(_expGroup == 1){ _domain = "http://b2.bdstatic.com/"; /*base64 new domain sample deploy*/ _dt = 2; } } _ispdc= _opt.pdc>0 ? true : false; _reqTime = new Date()*1; if(_expGroup==2){ //左右分别发请求 if(imgArr2.length>0){ _hasSpImg = true; } if(!isPreload) { cbl({}); } } if(imgArr.length>0){ //发送请求 if(_ispdc){ if(bds.ready){ bds.ready(function(){ setTimeout(function(){ var _bottag = botTag.get(); var logstr = "dt=" + _dt + "&time=" + ((_reqEnd>0)?(_reqEnd-_reqTime):0) + "&bot=" + _bottag + "&rcount=" + imgArr.length; window._B64_REQ_LOG = ((_reqEnd>0)?(_reqEnd-_reqTime):0) + "_" + imgArr.length; if(_expGroup==2 && _reqEndL>0){ var _apics = document.getElementById("ala_img_pics"); var _lcount = (_apics&&_apics.children)?_apics.children.length:0; logstr += "&time2=" + (_reqEndL-_reqTime) + "&lcount=" + _lcount; } if(Math.random()*100<10){ sendLog(logstr); } }, 2000); }); } } } else { if(!isPreload) { cbr({}); } } if(imgArr.length>0 || imgArr2.length>0){ if(!isPreload) { watchReq(imgArr.length); } } }; //异步加载js function crc32 (str) { if(typeof str=="string"){ var i,crc=0,j=0; for(i=0;i<str.length;i++){ j=i%20+1; crc+=str.charCodeAt(i)<<j; } return Math.abs(crc); } return 0; } var loadJs = function (url) { var matchs = url.match(/.*(bds\.base64\.cb[rl])/); if(!matchs){ return; } var imglist=url.match(/imglist=([^&]*)/); if(!imglist||!imglist[1]){ return; } //see b64_base_popstate.js, this just sync result page callback_name=crc32(imglist[1].replace(/,/g,"")); callback_name="cb_"+(callback_name+"").substr(Math.max(0,callback_name.length-8),8)+"_0"; window[callback_name]=function(data){ if(matchs[1] == "bds.base64.cbr") { cbr(data); }else if(matchs[1] == "bds.base64.cbl") { cbl(data); } window[callback_name]=null; }; var url = matchs[0].replace(/bds\.base64\.cb[rl]/,callback_name); var a = document.createElement("script"); a.setAttribute("type", "text/javascript"); a.setAttribute("src", url); a.setAttribute("defer", "defer"); a.setAttribute("async", "true"); document.getElementsByTagName("head")[0].appendChild(a); }; //图片回填 var imgLoad = function(data,side){ if(_finish[side]){ return; } _finish[side] = true; if(side=="right"){ botTag.ot(false); //设置超时标记减1. } //获取所有图片,通过data-base64-id属性获取需要回填的图片 var imgs = document.getElementById(_expGroup!=1?((side=="left")?_containerLeftId:_containerRightId):_containerAllId).getElementsByTagName("IMG"); for(var i=0;i<imgs.length;i++){ var b64Id = imgs[i].getAttribute("data-b64-id"); if(b64Id){ var find = false; if(data.hasOwnProperty(b64Id)) { setSrc(imgs[i],data[b64Id]); find = true; } if(!find){ //小容错 failover(imgs[i]); } } } fail_ie7(); }; function fail_ie7(){ //外层容错 IE7 setTimeout(function(){ for( var i=0; i<_imgWatch.length; i++ ){ var n = _imgWatch[i]; if(!n.loaded){ failover(n.obj); } } _imgWatch=[]; },200); } function setSrc(img,data){ try{ img.onerror = function(){ failover(this); }; //标记监视,供容错检查 _imgWatch.push({ obj:img, loaded:false }); img.onload = function(){ //标记已加载 for( var i=0; i<_imgWatch.length; i++ ){ var m = _imgWatch[i]; if(m.obj == this){ m.loaded = true; } } }; img.src = "data:image\/jpeg;base64," + data; }catch(e){ //触发exception failover(img); } } //容错,回填原始src var failover = function(img){ if(img.getAttribute("data-b64-id")!=null && img.getAttribute("data-b64-id")!="" && img.getAttribute("data-src")!=null){ img.src = img.getAttribute("data-src"); } }; var watchReq = function(len){ var wt = 1250; if(len<6){ wt = 1000; }else if(len>10){ wt = 1500; } setTimeout(function(){ if( !_dataLoaded["right"] ){ var imgs = document.getElementById(_containerRightId).getElementsByTagName("IMG"); for(var i=0;i<imgs.length;i++){ failover(imgs[i]); } _finish["right"] = true; //设置超时标记 botTag.ot(true); } setTimeout(function(){ if(_hasSpImg && !_dataLoaded["left"]){ var imgs = document.getElementById(_containerLeftId).getElementsByTagName("IMG"); for(var i=0;i<imgs.length;i++){ failover(imgs[i]); } _finish["left"] = true; } },500); },wt); }; /** * base64网速检测标记 * 超时次数变量 BOT * 初始:0 * 范围:0-6 * 变换规则: * 每次超时,BOT +1; * 每次正常:BOT -1; * 到达边界值时,不再继续增加/减少 * 如何使用:(未上线) * BOT大于3时,设置cookie: B64_BOT=1,VUI针对本次请求,读cookie,如果B64_BOT=1,关闭base64服务 * 当BOT小于3时,设置cookie: B64_BOT=0,VUI正常开启base64服务。 */ var botTag = { ot : function(isInc){ var _bottag = botTag.get(); if(isInc){ if(_bottag<6){ _bottag++; } }else{ if(_bottag>0){ _bottag--; } } if( _bottag>=2 ){ var date = new Date(); date.setTime(date.getTime() + 24*3600*1000*5); //此处设置cookie document.cookie = "B64_BOT=1; expires=" + date.toGMTString(); //_bottag = 0; }else if( _bottag<1 ){ if(document.cookie.match('B64_BOT=1')){ document.cookie = "B64_BOT=0;"; } } try{ if(window.localStorage){ window.localStorage[_BOTTAGLSNAME] = _bottag; } }catch(e){} }, get : function(){ try{ if(window.localStorage){ var _bottag = window.localStorage[_BOTTAGLSNAME]; _bottag = _bottag?parseInt(_bottag):0; …