分别检验是不是DOM2级,IE、DOM0级。
DOM0级:将一个函数赋给一个事件处理程序属性。具备简单、跨浏览器的优点。添加的事件处理程序会在冒泡阶段执行。事件处理程序也是在它所依附的元素做用于中执行。
删除事件处理程序:将事件处理程序的属性的值设为null。
DOM2级:DOM2级事件处理方法:addEventListener()和removeEventListener(),这两种方法 接受三个参数,要处理的事件名,做为事件处理程序的函数和一个布尔值,布尔值为true时,表示在捕获阶段调用事件处理函数;布尔值为false,表示在冒泡阶段调用事件处理函数。
调用addEventListener()添加的事件处理程序只能经过removeEventListener()移除,移除时传入的参数和添加处理程序时使用的参数必须一致。因此经过addEventListener()添加的匿名函数没法移除。与DOM0级相同,事件处理程序也是在它所依附的元素做用于中执行。
大多数状况下将事件处理程序添加到事件流的冒泡阶段,能够最大限度的兼容各类浏览器。
IE事件处理程序:两个方法:attachEvent()和detachEvent()。接收两个参数:要处理的事件名,做为事件处理程序的函数。与上述两种状况的主要区别是做用域不一样:attachEvent()和detachEvent()会在全局做用域中执行。
除了做用域的区别外,DOM2级和IE事件处理程序能够添加多个事件处理程序,而OM0级只能添加一个。css
event:事件处理对象,包含与建立它的特定事件有关的属性和方法。其中target(事件的目标)是其中一个成员。
在兼容DOM的浏览器中,event对象只是简单的传入和返回。而IE中,event参数是为定义的,所以就会返回window.event。
返回事件的目标,IE中为event.srcElemnt。浏览器
阻止浏览器默认事件:IE中为:event.returnValue=false
阻止事件冒泡:IE中为cancelBubble=true,由于IE中只有事件冒泡,因此只能取消事件冒泡。
stopPropagatation()既能阻止事件冒泡也能阻止事件捕获。app
DOM 经过event对象的relatedTarget属性提供了相关元素的信息。这个属性只对mouseover和mouseout事件才包含值,对于其余事件,这个属性值为null。在mouseover事件触发时,IE的fromElement属性保存了相关元素,在mouseout事件触发时,IE的toElement属性保存了相关元素。函数
该事件兼容性问题存在于:opera、Firefox和其余浏览器之间。编码
IE9,Firefox,Chrome,Safari的event对象都支持charcode属性,在发生keypress事件时才包含值。值为按下那个键所对应的ASCII编码。IE8及以前版本和Opera则使用keyCode。spa
要访问剪切板中的数据,可使用clipboardData对象:IE中,这个对象是window对象的属性;而在Firefox,Chrome,Safar中,这个对象是event对象的属性。firefox
FIREFOX支持(除了IE,如今全部浏览器都支持),IE不支持3d
解决办法:不用setAttribute('style','color:red')code
而用object.style.cssText = ‘color:red;'(这写法也有例外)orm
最好的办法是上面种方法都用上,万无一失。
class属性在W3C DOM中扮演着很重要的角色,但因为浏览器差别性仍然存在。使用setAttribute("class", vName)语句动态设置Element的class属性在firefox中是行的通的,在IE中却不行。由于使用IE内核的浏览器不认识"class",要改用"className";
一样,firefox 也不认识"className"。因此经常使用的方法是两者兼备:
element.setAttribute("class", vName);
element.setAttribute("className", vName); //for IE
IE和FF都支持object.className。
var obj = document.getElementById('objId');
obj.setAttribute('onclick','funcitonname()');
该方法FIREFOX支持,IE不支持。
IE中必须用点记法来引用所需的事件处理程序,而且要用赋予匿名函数
以下:
var obj = document.getElementById('objId');
obj.onclick=function(){fucntionname();};
这种方法全部浏览器都支持。
IE之外的其余浏览器
var rdo = document.createElement('input');
rdo.setAttribute('type','radio');
rdo.setAttribute('name','radiobtn');
rdo.setAttribute('value','checked');
IE浏览器
var rdo =document.createElement(”<input name=”radiobtn” type=”radio” value=”checked” />”);
问题说明:innerText在IE中能正常工做,可是innerText在FireFox中却不行。
解决方法:在非IE浏览器中使用textContent代替innerText。
示例:
if(navigator.appName.indexOf("Explorer") >-1){ document.getElementById('element').innerText = "my text"; } else{ document.getElementById('element').textContent = "my text"; }
[注] innerHTML 同时被ie、firefox等浏览器支持,其余的,如outerHTML等只被ie支持,最好不用。
ie、firefox以及其它浏览器对于 table 标签的操做都各不相同,在ie中不容许对table和tr的innerHTML赋值,使用js增长一个tr时,使用appendChild方法也无论用,document.appendChild在往表里插入行时FIREFOX支持,IE不支持。
问题说明:在IE下,使用 obj.parentElement 或 obj.parentNode 访问obj的父结点;在firefox下,使用 obj.parentNode 访问obj的父结点。
解决方法:由于firefox与IE都支持DOM,所以统一使用obj.parentNode 来访问obj的父结点。
问题说明:IE下,even对象有x、y属性,可是没有pageX、pageY属性;Firefox下,even对象有pageX、pageY属性,可是没有x、y属性。
解决方法:var myX = event.x ? event.x : event.pageX; var myY = event.y ? event.y:event.pageY;
问题说明:IE下,可使用 document.formName.item(”itemName”) 或 document.formName.elements ["elementName"];Firefox 下,只能使用document.formName.elements["elementName"]。
解决方法:统一使用document.formName.elements["elementName"]。
问题说明:IE下,可使用获取常规属性的方法来获取自定义属性,也可使用 getAttribute() 获取自定义属性;Firefox下,只能使用 getAttribute() 获取自定义属性。
解决方法:统一经过 getAttribute() 获取自定义属性。
问题说明:IE下,可使用 () 或 [] 获取集合类对象;Firefox下,只能使用 [ ]获取集合类对象。
解决方法:统一使用 [] 获取集合类对象。
问题说明:IE下,可使用 eval(”idName”) 或 getElementById(”idName”) 来取得 id 为 idName 的HTML对象;Firefox下,只能使用 getElementById(”idName”) 来取得 id 为 idName 的HTML对象。
解决方法:统一用 getElementById(”idName”) 来取得 id 为 idName 的HTML对象。
问题说明:Firefox下,可使用const关键字或var关键字来定义常量;IE下,只能使用var关键字来定义常量(IE11解决了)。
解决方法:统一使用var关键字来定义常量。
问题说明:IE下 input.type 属性为只读;可是Firefox下 input.type 属性为读写。
解决办法:不修改 input.type 属性。若是必需要修改,能够先隐藏原来的input,而后在一样的位置再插入一个新的input元素。
问题说明:IE下,使用 document.body.onload = inject; 其中function inject()在这以前已被实现;在Firefox下,使用 document.body.onload = inject();
解决方法:统一使用 document.body.onload=new Function('inject()'); 或者 document.body.onload = function()
问题说明:FireFox中相似 obj.style.height = imgObj.height 的语句无效。解决方法:统一使用 obj.style.height = imgObj.height + ‘px';