js兼容问题
什么是兼容?
兼容是计算机术语,相对于软件,一种是指某个软件能稳定地工作在某操作系统之中,就说这个软件对这个操作系统是兼容的。再就是在多任务操作系统中,几个同时运行的软件之间,如果能稳定地工作,不出经常性的错误,就说它们之间的兼容性好,否则就是兼容性不好。
1.关于获取行外样式 currentStyle 和 getComputedStyle 出现的兼容性问题
我们都知道js通过style不可以获取行外样式,当我们需要获取行外样式时:
我们一般通过这两个方法获取行外样式:
IE下: currentStyle
Chrome,FF下: getComputedStyle(oDiv,false)
兼容两个浏览器的写法:
if(oDiv.currentStyle){
alert(oDiv.currentStyle.width);
}else{
alert(getComputedStyle(oDiv,false).width);
}
*注:在解决很多兼容性写法时,都是用if..else..
封装一个获取行外样式的函数:(兼容所有浏览器,包括低版本IE6,7)
funtion getStyle(obj,name){
if(obj.currentStyle){
//IE
return obj.currentStyle[name];
}else{
//Chrom,FF
return getComputedStyle(obj,false)[name];
}
}
调用:getStyle(oDiv,\'width\');
2.关于用“索引”获取字符串每一项出现的兼容性问题:
对于字符串也有类似于 数组 这样的通过 下标索引 获取每一项的值,
var str="abcde";
aletr(str[1]);
但是低版本的浏览器IE6,7不兼容
兼容方法:str.charAt(i) //全部浏览器都兼容
var str="abcde";
for(var i=0;i<str.length;i++){
alert(str.charAt(i)); //放回字符串中的每一项
}
3.关于DOM中 childNodes 获取子节点出现的兼容性问题
childNodes:获取子节点,
--IE6-8:获取的是元素节点,正常
--高版本浏览器:但是会包含文本节点和元素节点(不正常)
解决方法: 使用nodeType:节点的类型,并作出判断
--nodeType=3-->文本节点
--nodeTyPE=1-->元素节点
例: 获取ul里所有的子节点,让所有的子节点背景色变成红色
获取元素子节点兼容的方法:
var oUl=document.getElementById(\'ul\');
for(var i=0;i<oUl.childNodes.length;i++){
if(oUl.childNodes[i].nodeType==1){
oUl.childNodes[i].style.background=\'red\';
}
}
注:上面childNodes为我们带来的困扰完全可以有children属性来代替。
children属性:只获取元素节点,不获取文本节点,兼容所有的浏览器,
比上面的好用所以我们一般获取子节点时,最好用children属性。
var oUl=document.getElementById(\'ul\');
oUl.children.style.background="red";
//DOM节点相关,主要兼容IE 6 7 8
function
nextnode(obj){
//获取下一个兄弟节点
if
(obj.nextElementSibling) {
return
obj.nextElementSibling;
}
else
{
return
obj.nextSibling;
};
}
function
prenode(obj){
//获取上一个兄弟节点
if
(obj.previousElementSibling) {
return
obj.previousElementSibling;
}
else
{
return
obj.previousSibling;
};
}
function
firstnode(obj){
//获取第一个子节点
if
(obj.firstElementChild) {
return
obj.firstElementChild;
//非IE678支持
}
else
{
return
obj.firstChild;
//IE678支持
};
}
function
lastnode(obj){
//获取最后一个子节点
if
(obj.lastElementChild) {
return
obj.lastElementChild;
//非IE678支持
}
else
{
return
obj.lastChild;
//IE678支持
};
}
4.关于使用 firstChild,lastChild 等,获取第一个/最后一个元素节点时产生的问题
--IE6-8下: firstChild,lastChild,nextSibling,previousSibling,获取第一个元素节点
(高版本浏览器IE9+,FF,Chrome不兼容,其获取的空白文本节点)
--高版本浏览器下: firstElementChild,lastElementChild,nextElementSibling,previousElementSibling
(低版本浏览器IE6-8不兼容)
--兼容写法: 找到ul的第一个元素节点,并将其背景色变成红色
var oUl=document.getElementById(\'ul\');
if(oUl.firstElementChild){
//高版本浏览器
oUl.firstElementChild.style.background=\'red\';
}else{
//IE6-8
oUl.firstChild.style.background=\'red\';
}
5.关于使用 event对象,出现的兼容性问题
如: 获取鼠标位置
IE/Chrom: event.clientX;event.clientY
FF/IE9以上/Chrom: 传参ev--> ev.clientX;ev.clientY
获取event对象兼容性写法: var oEvent==ev||event;
document.oncilck=function(ev){
var oEvent==ev||event;
if(oEvent){
alert(oEvent.clientX);
}
}
//event事件问题
document.onclick=
function
(ev){
//谷歌火狐的写法,IE9以上支持,往下不支持;
var
e=ev;
console.log(e);
}
document.onclick=
function
(){
//谷歌和IE支持,火狐不支持;
var
e=event;
console.log(e);
}
document.onclick=
function
(ev){
//兼容写法;
var
e=ev||window.event;
var
mouseX=e.clientX;
//鼠标X轴的坐标
var
mouseY=e.clientY;
//鼠标Y轴的坐标
}
6.关于为一个元素绑定两个相同事件:attachEvent/attachEventLister 出现的兼容问题
事件绑定:(不兼容需要两个结合做兼容if..else..)
IE8以下用: attachEvent(\'事件名\',fn);
FF,Chrome,IE9-10用: attachEventLister(\'事件名\',fn,false);
多事件绑定封装成一个兼容函数:
function myAddEvent(obj,ev,fn){
if(obj.attachEvent){
//IE8以下
obj.attachEvent(\'on\'+ev,fn);
}else{
//FF,Chrome,IE9-10
obj.attachEventLister(ev,fn,false);
}
}
myAddEvent(oBtn,\'click\',function(){
alert(a);
});
myAddEvent(oBtn,\'click\',function(){
alert(b);
});
7.关于获取滚动条距离而出现的问题
当我们获取滚动条滚动距离时:
IE,Chrome: document.body.scrollTop
FF: document.documentElement.scrollTop
兼容处理:var scrollTop=document.documentElement.scrollTop||document.body.scrollTop
8.事件冒泡兼容
eve.stopPropagation();
eve.cancelBubble = true; //兼容IE
9.获取非行内样式
兼容
if(window.getComputedStyle){ //高版本浏览器window上有getComputedStyle
window.getComputedStyle(box,null).width
}else{
box.currentStyle.width;
}
function getStyle(obj,attr){ //获取非行间样式,obj是对象,attr是值
if(obj.currentStyle){ //针对ie获取非行间样式
return obj.currentStyle[attr];
}else{
return getComputedStyle(obj,false)[attr]; //针对非ie
};
};
10.键盘事件
var x = event.which || event.keyCode;
11.事件监听器(兼容)
兼容问题解决:
1.封装成对象的方式
var EventUtil={
addHandler:function(DOM,EventType,fn){
if(DOM.addEventListener){
DOM.addEventListener(EventType,fn,false);
}else if(DOM.attachEvent){
DOM.attachEvent(\'on\'+EventType,fn)
}else{
DOM[\'on\'+EventType]=fn
}
},
removeHandler:function(DOM,EventType,fn){
if(DOM.removeEventListener){
DOM.removeEventListener(EventType,fn,false)
}else if(DOM.detachEvent){
DOM.detachEvent(\'on\'+EventType,fn)
}else{
DOM[\'on\'+EventType]=null;
}
}
}
2.封装成两个函数的方式
function addEvent(obj,inci,back){
if(obj.addEventListener){
obj.addEventListener(inci,back);
}else if(obj.attachEvent){
obj.attachEvent("on" + inci,back);
}else{
obj["on"+inci] = back;
}
}
function removeEvent(obj,inci,back){
if(obj.removeEventListener){
obj.removeEventListener(inci,back,false);
}else if(obj.detachEvent){
obj.detachEvent("on" + inci,back);
}else{
obj["on"+inci] = null;
}
}
12.获取事件源
var target = e.target || e.srcElement
13.获取方式
兼容方式:
function fn(eve){
var e = eve || window.event;
}
document.onclick = function(eve){
var e = eve || window.event;
console.log(e);
}
14.常遇到的关于浏览器的宽高问题:
//以下均可console.log()实验
var
winW=document.body.clientWidth||document.docuemntElement.clientWidth;
//网页可见区域宽
var
winH=document.body.clientHeight||document.docuemntElement.clientHeight;
//网页可见区域宽
//以上为不包括边框的宽高,如果是offsetWidth或者offsetHeight的话包括边框
var
winWW=document.body.scrollWidth||document.docuemntElement.scrollWidth;
//整个网页的宽
var
winHH=document.body.scrollHeight||document.docuemntElement.scrollHeight;
//整个网页的高
var
scrollHeight=document.body.scrollTop||document.docuemntElement.scrollTop;
//网页被卷去的高
var
scrollLeft=document.body.scrollLeft||document.docuemntElement.scrollLeft;
//网页左卷的距离
var
screenH=window.screen.height;
//屏幕分辨率的高
var
screenW=window.screen.width;
//屏幕分辨率的宽
var
screenX=window.screenLeft;
//浏览器窗口相对于屏幕的x坐标(除了FireFox)
var
screenXX=window.screenX;
//FireFox相对于屏幕的X坐标
var
screenY=window.screenTop;
//浏览器窗口相对于屏幕的y坐标(除了FireFox)
var
screenYY=window.screenY;
//FireFox相对于屏幕的y坐标
15.document.getElementsByClassName问题: