js下IE和FF的一些兼容写法总结

一、脚本差异:

1、事件绑定:addEventListener 与 attachEvent  事件处理函数中this指向不同, IE中指向window

2、获取事件对象 :事件处理函数     window.event

3、获取触发事件的DOM元素: target  srcElement

4、阻止默认行为: e.preventDefault()   e.returnValue= false

5、阻止冒泡:e.stopPropagation()  e.cancelBubble = true;

6、获取样式信息:getComputedStyle(obj,null).width  currentStyle.width

7、实例化XHR对象  new XMLHttpRequest()  newActiveXObject()

8、获取dom元素: parentNode parentElement

二、css差异

1、!important  优先级最高,在IE6以下异常。

IE6及以下浏览器有个比较显式的支持问题存在,!important并不覆盖掉在同一条样式的后面的规则。

div{color:#f00!important;color:#000}  //不会覆盖#000  
改写成下面的这种,会优先应用#000div{color:#f00!important;}
div{color:#000;}    

1、盒模型:

2、e.offsetX

e.pageX  e.x

window.event对象差异 
IE:有window.event对象 
FF:没有window.event对象。可以通过给函数的参数传递event对象。如onmousemove=doMouseMove(event)

获取鼠标当前坐标 
IE:event.x和event.y。 
FF:event.pageX和event.pageY。 
通用:两者都有event.clientX和event.clientY属性。

鼠标当前坐标(加上滚动条滚过的距离) 
IE:event.offsetX和event.offsetY。 
FF:event.layerX和event.layerY。

标签的x和y的坐标位置:style.posLeft 和 style.posTop 
IE:有。 
FF:没有。 
通用:object.offsetLeft 和 object.offsetTop。

获取窗体的高度和宽度 
IE:document.body.offsetWidth和document.body.offsetHeight。注意:此时页面一定要有body标签。 
FF:window.innerWidth和window.innerHegiht,以及document.documentElement.clientWidth和document.documentElement.clientHeight。 
通用:document.body.clientWidth和document.body.clientHeight。

添加事件 
IE:element.attachEvent(”onclick”, func);。 
FF:element.addEventListener(”click”, func, true)。 
通用:element.onclick=func。虽然都可以使用onclick事件,但是onclick和上面两种方法的效果是不一样的,onclick只有执行一个过程,而attachEvent和addEventListener执行的是一个过程列表,也就是多个过程。例如:element.attachEvent(”onclick”, func1);element.attachEvent(”onclick”, func2)这样func1和func2都会被执行。

在这里断桥残雪,曾经写过一个通用的添加删除绑定事件的函数,大家可以查看以下文章:《JavaScript跨浏览器的添加删除事件绑定函数》

标签的自定义属性 
IE:如果给标签div1定义了一个属性value,可以div1.value和div1["value"]取得该值。 
FF:不能用div1.value和div1["value"]取。 
通用:div1.getAttribute(”value”)。

父节点、子节点和删除节点 
IE:parentElement、parement.children,element.romoveNode(true)。 
FF:parentNode、parentNode.childNodes,node.parentNode.removeChild(node)。

clientX,pageX,offsetX,x,layerX,screenX,offsetLeft 
screenX:鼠标在显示屏幕上的坐标。 
clientX:鼠标在页面显示区域的坐标。 
注:以上两个都是各浏览器通用的。以下为特有方法:

pageX:FF特有,鼠标在页面上的位置,从页面左上角开始定位,这个可以很方便在整个页面上进行定位,IE没有直接替换的属性。 
layerX:FF特有,鼠标相对于“触发事件的元素的层级关系中离该元素最近的,设置了position的父元素”的边界的位置,从border的左上角开始定位,即如果这个父元素存在border,则坐标原点在border的左上角,而不是内容区域的左上角。 
offsetX:IE特有,鼠标相对于“触发事件的元素”的位置,从内容区域左上角开始定位,不是从border左上角开始!这个属性比较好用,用来判断鼠标点在一个元素中的哪个位置很方便,FF没有直接替换的属性。 
x:IE特有,跟layerX一个效果,可作为layerX的直接替换属性。 
注:IE和FF的定位有个1px的差别,实际上,IE的定位从0开始,FF的定位从1开始,FF永远会比IE大1px,需要根据实际情况处理。

offsetLeft:这个属性不是事件对象的属性,而是DOM对象所有的,该属性表示的是DOM对象在“该DOM对象的层级关系中离该对象最近的,设置了position的父对象”中的位置,虽然话是这么说的,但是不同的浏览器效果不一样。

FF中严格按上述说明执行,但是在IE6/7中,这个属性返回该DOM对象在其直接父对象中的位置,但是IE8改正了这个问题,不过IE8又有了一个新问题,其他的浏览器都是从父对象的内容区域的左上角开始定位,IE8确是从父元素的border的左上角开始定位,由于测试环境为IETester中的IE8,不能排除是IETester的问题。

时间: 2024-12-18 09:18:36

js下IE和FF的一些兼容写法总结的相关文章

Js获取当前浏览器支持的transform兼容写法

// 获取当前浏览器支持的transform兼容写法 function getTransfrom() { var transform = '', // document.createElement() 创建元素节点, divStyle = document.createElement('div').style, // 返回的是一组object对象,里面包含了transform // 可能涉及到的几种兼容性写法,通过循环,找出浏览器识别的那个 // 依次为: 全部.Safari 和 Chrome.

js中的内置方法的兼容写法

1.如果浏览器不支持every属性,every的实现原理 if(Array.prototype.every===undefined){ Array.prototype.every=function(fun){ //遍历当前数组中每个元素 for(var i=0;i<this.length;i++){ if(this[i]!==undefined){ //调用fun,依次传入当前元素值,位置i,当前数组作为参数 ,将返回值,保存在变量r中 var r=fun(this[i],i,this); if

js在IE和FF下的兼容性问题

长久以来JavaScript兼容性一直是Web开发者的一个主要问题.在正式规范.事实标准以及各种实现之间的存在的差异让许多开发者日夜煎熬.为此,主要从以下几方面差异总结IE和Firefox的Javascript兼容性: 一.函数和方法差异: 二.样式访问和设置: 三.DOM方法及对象引用: 四.事件处理: 五.其他差异的兼容处理. 一.函数和方法差异 1. getYear()方法 [分析说明]先看一下以下代码: [javascript] view plaincopy var year=new D

浅谈 js 下 with 对性能的影响

这几天多次看到有博主们在写 with 的文章,这货确实非常方便,但是却是个性能杀手,所以一直都是上不得台面的.那么他究竟会让效率低下到什么程度呢?先来看下 with 是如何的便捷吧.. // 正常调用 console.log(location.host); console.log(location.pathname); // 在 with 下 with (location) { console.log(host); console.log(pathname); } 如果不影响性能,确实是非常霸气

CSS+JS下拉菜单和纯CSS下拉菜单

一.CSS+JS下拉菜单 原理:一级菜单的li中包含二级菜单ul.在鼠标没有移上去时,二级菜单的ul是display:none的状态,鼠标一移上去变成display:block.改变这个display属性值是通过JS来实现.鼠标hover时,把整个二级菜单的ul给display出来,用到的事件onmouseonver.鼠标移出又把整个二级菜单的ul 给隐藏掉. nav-js.html文件 <!DOCTYPE html > <html> <head> <meta c

原生JS forEach()和map()遍历的区别以及兼容写法

一.原生JS forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前项的索引index,原始数组input. 3.匿名函数中的this都是指Window. 4.只能遍历数组. 1.forEach() 没有返回值. arr[].forEach(function(value,index,array){ //do something }) 参数:value数组中的当前项,

常用原生JS兼容写法

在我们前端开发中,经常会遇到兼容性的问题,因为要考虑用户会使用不同的浏览器来访问你的页面,你要保证你做的网页在任何一个浏览器中都能正常的运行,下面我就举几个常用原生JS的兼容写法: 1:添加事件方法 addHandler:function(element,type,handler){  if(element.addEventListener){//检测是否为DOM2级方法   element.addEventListener(type, handler, false);  }else if (e

小议 js 下字符串比较大小

之前群里有人问如何比较两个时间大小,他的时间格式是 2014-08-08 而不是 2014-8-8.所以我给的方法是 直接比较,如: var a = "2014-08-08"; var b = "2014-09-09"; console.log(a>b, a<b); // false true 很方便不是么,但是原理是什么呢? 打开 ECMA 第 11.8.5 节 The Abstract Relational Comparison Algorithm在

JS下计算当前日期(当天)后N天出现NAN或者undefined的情况

前言: 帮客户做一个订单系统,需要一个日期1,一个日期2,默认情况下日期1为当天,日期2为明天,只是当时有些疑惑的是日期2偶尔会出现NAN的情况,今天在segmentfault.com看到了同样的问题,于是我觉得有必要再重温一下当时的问题.好好做一下到底是为什么? <!--date() NAN start--> 以下代码有问题,不建议直接使用,只是临时版本,后续再修改 <!DOCTYPE html> <html lang="en"> <head