1属性不兼容
如获取元素的样式,IE浏览器支持 obj.currentStyle.width等的方式读取元素样式表内的样式,其他浏览器支持 window.getComputedStyle(元素对象名,null).width的方式读取,因此兼容函数可以封装如下
function getStyle(obj, name){
return getComputedStyle(obj, null)[name] || obj.currentStyle[name];
}
即主要是 || 或运算符的使用。
除此之外,事件对象的兼容性问题也可以通过这样的方式来解决。
btn.onclick = function(event){
event = event || window.event;
}
2方法不兼容
如大部分浏览器支持addEventListener为对象绑定多个事件响应函数,但是IE8及以下浏览器却不支持addEventListener,只支持attachEvent的浏览器。
因此定义一个函数为指定元素绑定事件响应函数,其代码如下。
// 封装函数,参数 绑定的对象obj,事件字符串eventStr,回调函数fun
// 默认传入的eventStr是带on的
function bind(obj, eventStr, fun){
// 需要解决的问题:
// 1 浏览器对于addEventListener和attachEventListener的兼容性
// 2 两个事件绑定函数返回的this不同
// 3 addEventListener的eventStr不带on,而attachEventListener带on
if (obj.addEventListener) {
// 去除on
eventStr = eventStr.replace("on", "");
obj.addEventListener(eventStr, fun, false);
} else {
obj.attachEvent.call(obj, eventStr, fun);
}
}
即通过if-else的判断来解决兼容问题,这是方法类兼容性问题所应采用的方法,因为有的方法不一定会返回值,所以不能只靠 || 或运算符解决兼容性问题。
另外一种解决方法兼容性的方法:
box1.setCapture && box1.setCaputure();
//即当box1.setCapture为真是,再执行box1.setCapture(),实现了if选择的效果。
这是因为,前边的box1.setCapture就相当于if(box1.setCapture)也即if(Boolean(box1.setCaputre));
而根据Boolean的转换规则,只有传入 空字符串、0、NaN、null、undefined返回都是false,其余都是ture,函数对象和对象都是返回true;
3undefined的使用,判断一个对象是否存在从而解决兼容性的问题
if(typeof XMLHttpRequest != "undefined"){
//.......
}