一、解决游览器兼容性问题:客户端检测。
最常用的方法是“能力检测”,其目标不是识别特定的游览器,而是识别游览器的能力。采用这种方式不必估计特定的游览器如何如何,只要确定游览器支持特定的能力即可。
EG:
function getElement(id){
if(document.getElementById){
return document.getElementById(id);
}else if(document.all){
return document.all[id];
}else{
throw new Error ("没有获取element的方法!");
}
}
原则:注意检测条件要先使用能达成目标的最常用条件进行判断,保证代码的最优化效率,避免条件的缺陷。(逻辑判断要充分条件)
能力检测是不仅要检测某个特性是否存在,而是要检测其是否可以达成具体功能的实现,例如:通过判断object.sort是否存在来判断对象是否支持排序时不合理的,必须检测sort是否是函数。
EG:
function isSortable(o){
return typeof object.sort == "function";
}
(其实就是保证判断条件的充分性,包含.sort属性的对象不一定支持排序)
再例如,IE9之前的版本 document.createElement 的类型为object.而IE9之后所有DOM方法统一返回“function”。(原因是IE之前的宿主对象是通过COM而非JScript实现的)
综合目前游览器环境,测试任何对象的某个特性是否存在,要使用下面的函数:
MD:
//au :Peter Michaux
function isHostMethod(Object,property){
var t = typeof object[property];
return t =='function' || (!!(t=='object'&&object[property])) ||
t=='unknow';
}
注:此方法随着时间的推移,可能会出现不合理或不完全的地方,应用时要进行合理的测试。
参考:Peter Michaux的文章《Feature Detection:State of the Art Browser Scripting》
http://peter.michaux.ca/
二、能力检测>>游览器检测
实际开发中,游览器检测被竟然应用,如:
var isFirefox = !!(navigator.vendor && navigator.vendorSub);
var isIE = !!(document.all && document.uniqueID);
这是典型的游览器检测,曾经.vendor和vendorSub确实可以确定Firefox,因为只有其具备此属性,但Safari实现了相同属性后此方法就会带来误判。
所以,通过检测游览器来确定某些方法、属性的可行性是十分被动的,在游览器做出更改后必须修改判断逻辑。。
合理的解决方案是将能力检测作为确定下一步解决方案的一句,而不是用它来判断用户使用的是什么游览器,即如果使用某方法,检测其是否可用后执行,而不是通过判断游览器来分别执行某些方法。
简言之,游览器不具有相对稳定、逻辑严谨的却分性质。
当然,某些特定的需求要展示用户所用游览器的话,,另当别论。