/**
* @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;
…