2

我正在为网站进行跨浏览器兼容性升级,并遇到了一个非常有趣的问题。

当前的 JavaScript 用于document.all("whatever").value访问隐藏输入、文本框、复选框等的值。

我已阅读文章和帖子,指出document.all("")在 Firefox/Chrome 中不起作用,document.getElementById("")请改用它,因为这是所有浏览器的标准。

所以,我决定测试我们当前的网站并通过 JavaScript 进行调试,发现它document.all实际上是UNDEFINED并且无法提取它试图访问的值......很酷吧?

好吧,我写了一个简单的 HTML 页面只是为了对此做一个简单的测试。我创建了一个文本类型的输入并输入:

    <input id="testinput" name="testinput" type="textbox" value="5" />

然后我的 JavaScript 调用看起来像:

    alert(document.all("testinput").value);

结果? 该值每次都会在每个浏览器上显示在警报中。更有趣的是,当我调试 JavaScript 时,我在命令窗口 (chrome)document.all中输入,输出未定义……但document.all("testinput").value输出为 5。

我在这里缺少什么吗?

document.all确实可以在现代浏览器中使用,但不推荐?我希望有人能对此有所了解,因为这种替换将需要更改大量代码。

4

1 回答 1

2

是的。这正是它的工作原理。

问题是一些遗留网页测试 document.all 作为检查 IE 的一种方式。JS 代码则有两个代码路径:一个用于 IE,另一个用于其他浏览器。然而,其他遗留页面使用 document.all 时盲目地假设它只需要与 IE 一起使用,因为它是在 IE 是最流行的浏览器时创建的。

由于后面的页面只会在非 IE 浏览器中中断,这对这些浏览器的市场份额或声誉不利,因此它们实现了 document.all() 来应对它们。但是因为在前一种情况下,他们希望 JS 代码遵循非 IE 代码路径,对于 document.all 本身(以及其他几种类似的测试 document.all 存在的方式),他们返回“未定义”。

有关详细信息,请参阅HTMLAllCollection 接口[[IsHTMLDDA]] 内部插槽

于 2013-10-31T22:09:16.140 回答