您的位置:首页 > Web前端 > JavaScript

编写跨浏览器的javascript代码必备[js多浏览器兼容写法]

2016-03-08 18:17 856 查看

http://m.jb51.net/article/16319.htm

编写跨浏览器的javascript代码必备[js多浏览器兼容写法]

作者:

下面比较了几种浏览器之间的差异,在写javascript代码时 要时刻注意这些差异

序号

undefined
操作
分类
IE

(6.0)

FireFox

(2.0)

Mozilla

(1.5)

当前

浏览器

备注
1
"."
访问tag的固有属性
OK
OK
OK
OK
 
2
"."
访问tag的用户定义属性

eg: <input type="checkbox" myattr="test">
OK
NO
NO
OK
可以用getAttribute函数 替代
3
obj.getAttribute
访问tag的固有属性
OK
OK
OK
OK
 
4
obj.getAttribute
访问tag的用户定义属性

eg: <input type="checkbox" myattr="test">
OK
OK
OK
OK
 
5
document.all
访问document的所有子元素

eg:document.all
OK
OK
NO
OK
建议用childNodes对象或者getElementById函数实现对应操作。

有人说它不能取Div元素,测试结果是可以,不知道是不是还有其它因素会影响测试结果。
6
obj.all
访问非document元素的所有子元素

eg: document.getElementById("mydiv").all
OK
NO
NO
OK
同上
7
getElementById()
根据元素的id/name来取得元素。

如果元素只设置name属性,没有设置id属性。
OK
NO
NO
OK
注意:很多元素是没有name属性的,eg: td, div,span...
8
变量名 = ""
隐式定义变量-通过向变量名附值方式定义一个新的变量。
OK
OK
OK
OK
建议:为避免必要的麻烦,显示定义变量。

eg:var tmp;
9
id
通过id直接调用对象

eg: test_result_1.innerHTML = ""
OK
OK
NO
OK
eval()函数用来执行脚本,所以向eval函数里面传入对象id/name的话,IE同样会返回对象的引用。

建议用document.getElementById(id)方式调用

注意:因为这个原因,IE中隐式定义的变量不能和HTML中元素的id/name相同。
10
name
通过name直接调用对象

eg: test_for_this_name.innerHTML = ""
OK
NO
NO
OK
同上/ 原因同7
11
name
支持的特殊字符("!",".","@","#","$","<",...)

eg: document.getElementsByName("aaaa!page");
NO
OK
OK
NO
其它的字符没有测试
12
tr.innerHTML = ""
设置TR元素的内部HTML脚本
NO
OK
OK
NO
在IE中,table、tr的innerHTML是只读属性,不能够对其直接设置。可以通过insertRow/insertCell函数进行设置。
13
cells对象访问
访问tr的cells对象

前提:tr元素是被删除后的tr对象,或者是用cloneNode(true)复制的删除前的tr对象
NO
OK
OK
undefined
可以将其插入Table再访问,或者可以用getElementsByTagName函数 对td/th访问。

删除后的rows对象不存在这个问题。其它元素?
14
(index)
访问集合类对象

eg: document.

getElementsByTagName("TD")(0)
OK
NO
NO
OK
建议用正式的操作符"[]".
15
obj.toString()
取得对象的字符串"[object 对象类型的名称]".

eg: td == "[object HTMLTableCellElement]"
NO
OK
OK
NO
可以省略toString()函数,直接用对象来操作。

注:在IE中返回"[object]"。
16
obj.class
定义对象的css式样/风格。

eg: td.class="XPstyle";
NO
OK
NO
-
无法写测试代码,会有编译错误!可以自己用typeof(class) == null来测试一下,没有异常就在代码中可以使用。

在HTML脚本中用class,但是在Javascript中应该用classname(class是JS的保留关键字).

注意:用 setAttribute可以把class值设置到对象中去,但是不会被当作css式样来解析。
17
const
保留关键字,用于定义常量。

eg:const HOURS = 24;
NO
OK
OK
-
暂时只能不使用const。
18
input.type
变更input元素的类型

eg: input.type="button";
NO
OK
OK
NO
IE可以初始input元素类型,但是不能变更类型。

如果必须变更,可以用更换input元素的方式。
19
obj.children
访问对象的子元素集合

eg: document.body.children.length;
OK
NO
NO
OK
可以用childNodes对象替代。
20
node.replaceNode
替换新的节点对象

eg: oldNode.replaceNode(newNode);
OK
NO
NO
OK
可以用replaceChild函数替换。
21
node.removeNode
删除已有节点对象

eg.oldNode.removeNode(true);
OK
NO
NO
OK
可以用oldNode.parentNode.removeChild(oldNode)方式实现。
22
node.insertBefore
在指定节点对象前面插入一个节点对象

document.body.insertBefore(newN, oldN);
OK
OK
OK
OK
 
23
obj.parentElement
访问对象的父元素

eg: document.body.parentElement.id;
OK
NO
NO
OK
可以用parentNode对象替代。
24
obj.childNodes.length
返回子节点的数量,和tag的数量相同。

eg:document.body.childNodes.length;
OK
NO
NO
OK
FF/Mozilla中,空白或者换行是文本节点,是childNodes的成员。

可以用node.getElementsByTagName()回避。
25
obj.

insertAdjacentElement
向指定的位置插入元素

eg: obj.insertAdjacentElement("beforeBegin",button);

OK
NO
NO
OK
insertAdjacentElement函数和insertAdjacentText函数也类似。

可以用insertBefore函数实现类似功能。
26
createElement()
创建指定类型元素。

前提:元素为HTML脚本

eg:document.createElment("<input type='radio' value='test'>");
OK
NO
NO
OK
可以先创建出对象元素,再进行属性设置;或者直接以InnerHTML的形式加到对应位置。

 
27
nodeName
取对象(tag,attribute,textnode)节点名称

eg: name = obj.nodeName;
OK
OK
OK
OK
有人说存在差异,不知道是具体的前提条件,先记录备考。

替代方案:

如果节点是tag元素可以用"tagName"取值;如果节点是attribut对象可以用"name"取值;如果节点是textnode元素可以用nodeType==3判断。
28
window.event
取得当前的事件对象

eg: window.event;
OK
NO
NO
?
可以主动向事件的响应函数传入event参数。

eg:<a onclick="javascript:showHelp(event)">help</a>
29
event.target
取得事件的触发对象

eg: e.target;
NO
OK
OK

可以和srcElement共同使用;可以主动向事件的响应函数传入触发对象元素。

eg:<a onclick="javascript:showHelp(this, event)">help</a>
30
event.srcElement
取得事件的触发对象

eg: e.srcElement;
OK
NO
NO

可以和target共同使用;可以主动向事件的响应函数传入触发对象。

eg: var obj = (e.target) ? e.target : e.srcElemtn;
31
event对象属性
当前三个浏览器的共同拥有的属性:

altKey

button

cancelBubble

clientX

clientY

ctrlKey

screenX

screenY

shiftKey

type

 
altLeft

behaviorCookie

behaviorPart

bookmarks

boundElements

contentOverflow

ctrlLeft

dataFld

dataTransfer

fromElement

keyCode

nextPage

offsetX

offsetY

propertyName

qualifier

reason

recordset

repeat

returnValue

srcElement

shiftLeft

srcFilter

srcUrn

toElement

wheelDelta

x

y

 
bubbles

cancelable

currentTarget

detail

eventPhase

explicitOriginalTarget

isChar

isTrusted

layerX

layerY

metaKey

originalTarget

pageX

pageY

rangeOffset

rangeParent

relatedTarget

target

timeStamp

view

which
bubbles

cancelable

charCode

currentTarget

detail

eventPhase

explicitOriginalTarget

isChar

keyCode

layerX

layerY

metaKey

originalTarget

pageX

pageY

popupWindowURI

rangeOffset

rangeParent

relatedTarget

requestingWindowURI

target

timeStamp

view

which
?
event对象的不同点太多,在使用的时候需要一一检查才行。具体可以用页面下方的测试区域试验。
32
注册event
用attachEvent函数注册
OK
NO
NO
-
小心内存泄漏!!!

事件处理完后一定要调用detachEvent函数销毁事件,而且要注意避免重复注册。
33
注册event
addEventListener函数注册
NO
OK
OK
-
 
34
注册event
obj.onxxx = Function("响应函数名称或代码");方式注册

eg: btn.onclick = Function(doclick);

btn.onclick = Function("return 1+1;");
OK
OK
OK
-
 
35
销毁event
detachEvent函数销毁
OK
NO
NO
-
 
36
销毁event
removeEventListener函数销毁
NO
OK
OK
-
 
37
销毁event
obj.onxxx = null;方式注册

eg: btn.onclick = null;
OK
OK
OK
-
 
38
触发event
fireEvent函数

eg:btn.fireEvent("onclick");

FF:

var e = document.createEvent("Events");

e.initEvent("click", true, false);

element.dispatchEvent(event)
OK
NO
NO
-
 
39
触发event
dispatchEvent函数

eg:

var evt = document.createEvent("MouseEvents");

evt.initMouseEvent("click", true, true);

btn.dispatchEvent(evt);
NO
OK
OK
-
 

您可能感兴趣的文章:

javascript Range对象跨浏览器常用操作
开发跨浏览器javascript常见注意事项
详细解读JavaScript的跨浏览器事件处理

JS中完美兼容各大浏览器的scrolltop方法

最近用到scrolloTop()想去获取滚动条距离顶部的距离,结果只有chrome下面可以正常的获取scrollTop,ff和ie下这个值都等于0,使得许多效果比如屏幕滚动等等均无法正常实现。究其原因是scrollTop()在各个浏览器中的兼容性问题,今天我们就来详细探讨下。

1、各浏览器下 scrollTop的差异

IE6/7/8/9/10:

对于没有doctype声明的页面里可以使用 document.body.scrollTop 来获取 scrollTop高度 ;

对于有doctype声明的页面则可以使用 document.documentElement.scrollTop ;

Safari:

safari 比较特别,有自己获取scrollTop的函数 : window.pageYOffset ;

Firefox:

火狐等等相对标准些的浏览器就省心多了,直接用 document.documentElement.scrollTop ;

2、获取scrollTop值

完美的获取scrollTop 赋值短语 :

复制代码 代码如下:

var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;

通过这句赋值就能在任何情况下获得scrollTop 值。

仔细观察这句赋值,你发现啥了没??

没错, 就是 window.pageYOffset (Safari) 被放置在 || 的中间位置。

因为当 数字0 与 undefine 进行 或运算时,系统默认返回最后一个值。即或运算中 0 == undefine ;

当页面滚动条刚好在最顶端,即scrollTop值为 0 时,IE 下 window.pageYOffset (Safari) 返回为 undefine ,此时将 window.pageYOffset (Safari) 放在或运算最后面时, scrollTop 返回 undefine , undefine 用在接下去的运算就会报错咯。

而其他浏览器 无论 scrollTop 赋值或运算顺序如何都不会返回 undefine. 可以安全使用..

所以说到头还是IE的问题咯. 杯具…

精神有点恍惚,不知道有没有表达清楚。

不过最后总结出来这句实验过OK,大家放心使用。

复制代码 代码如下:

var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;

这是完美的获取scrollTop赋值语句。

以上所述就是本文的全部内容了,希望大家能够喜欢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: