码迷,mamicode.com
首页 > 其他好文 > 详细

浏览器探测

时间:2015-07-26 00:20:20      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

也许最常见的重复工作就是浏览器探测(当然“不要重复工作”只是一种思想,并不一定针对浏览器探测)。
考虑一个添加事件处理器的例子,典型的跨浏览器代码写法如下:

function addHandler(target,eventType,handler) {
  if(target.addEventListener){ // DOM2 Events
    target.addEventListener(eventType,handler,false);
  }

  else { // IE
    target.attachEvent(‘on‘+eventType,handler);
  }
}

addHandler(document,‘click‘,function(){
  console.log(‘hello world‘);
});


但是如果一个页面调用了好多次addHandler函数添加事件,每次都会去做浏览器的判断,但是事实是每次的判断结果都是一样的,因为浏览器并不会变化,这时我们就可以针对“不要重复工作”做一个优化策略。

 

function addHandler(target,eventType,handler){
if(target.addEventListener){ // DOM2 Events
addHandler=function(target,eventType,handler){
target.addEventListener(eventType,handler,false);
};
}else{ // IE
addHandler=function(target,eventType,handler){
target.attachEvent(‘on‘+eventType,handler);
};
}
addHandler(target,eventType,handler);
}

// 调用
addHandler(document,‘click‘,function(){
console.log(‘hello world‘);
});

addHandler(window,‘keydown‘,function(){
console.log(‘key down‘);
});

方法在第一次被调用时,会先检查并决定使用哪种方法去绑定事件处理器,然后原始函数被包含正确操作的新函数覆盖。最后一步调用新的函数(也可以直接return 新的函数),并传入原始参数。之后的每次调用addHandler()都不会再做检测,因为检测代码已经被新的函数覆盖。

调用延迟加载函数时,第一次总会消耗较长的时间,因为它必须运行检测接着再调用另一个函数完成任务,但随后调用函数会变快,因为不需要再进行检测。当一个函数在页面中不会立即调用时,延迟加载是最好的选择。

 

条件预加载

条件预加载会在脚本加载期间提前检测,而不会等到函数被调用:

var addHandler=document.addEventListener?
function(target,eventType,handler){
target.addEventListener(eventType,handler,false);
}:
function(target,eventType,handler){
target.attachEvent(‘on‘+eventType,handler);
};

// 调用
addHandler(document,‘click‘,function(){
console.log(‘hello world‘);
});

addHandler(window,‘keydown‘,function(){
console.log(‘key down‘);
});

条件预加载确保所有函数消耗的时间相同,其代价是需要在脚本加载时就检测,而不是加载后。预加载适用于一个函数马上就要被用到,并且在整个页面的生命周期中频繁出现的场合。

 

浏览器探测

标签:

原文地址:http://www.cnblogs.com/abapscript/p/4676820.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!