为什么这个单行JS不能在Firefox中运行?

时间:2011-09-19 01:23:25

标签: javascript html cross-browser onmouseover

http://jsfiddle.net/Gch83/

<input id="myRadioButton1" name="radiobutton" value="radiobutton" type="radio">1
<input id="myRadioButton2" name="radiobutton" value="radiobutton" type="radio">2

<input value="1 checked" onMouseOver="document.all.myRadioButton1.checked = true;" type="button">
<input value="2 checked" onMouseOver="document.all.myRadioButton2.checked = true;" type="button">

将鼠标悬停在按钮上会更改Chrome中的单选按钮,但不会更改Firefox。

为什么会这样?

6 个答案:

答案 0 :(得分:3)

Don't Use document.all改为使用document.getElementById()应该做的伎俩!

答案 1 :(得分:2)

使用document.getElementById(id)代替document.all

答案 2 :(得分:2)

答案 3 :(得分:2)

使用

<input value="1 checked" onMouseOver="document.getElementById('myRadioButton1').checked = true;" type="button">

<input value="2 checked" onMouseOver="document.getElementById('myRadioButton2').checked = true;" type="button">

reason是FF不支持document.all,因为它是由IE引入的,不是标准DOM。

可以找到演示here

答案 4 :(得分:1)

基本上说,使用 document.all 是非标准的。

事实上,这是javascript程序员应该避免的。它是Internet Explorer 4(大约1997年!)的遗留物,并且被包括在内,因为当时还有一些非常基本的DOM API尚未标准化(例如 document.getElementById )。如果现代浏览器支持任何这些旧的DOM API,那么它只是为了与非常旧的程序兼容。 WebKit仍将为 document.all 返回HTMLCollection类型,这就是您注意到您的代码在Chrome浏览器中有效的原因。但现代版本的Firefox故意决定放弃对它的支持,而是返回 undefined 值。

这里推荐的方法是使用 document.getElementById 来获取你想要控制的元素的引用(你可以将id添加到第二对元素),然后注册事件来自javascript的那些元素的处理程序。

答案 5 :(得分:1)

document.all仅在页面处于怪癖模式时才能在Firefox中运行(这绝对不是你想要的)。

Don't use document.all

它是在W3C标准化getElementById()之前创建的。

  

document.all是Microsoft Internet Explorer的专有功能

Source

使用符合W3C标准的现代方法。

var checkbox = document.getElementById('my-checkbox');
document.getElementById('my-button').addEventListener('mouseover', function() {
   checkbox.checked = true;
}, false);

......您需要对IE attachEvent()进行一些研究。