javascript - Document.all 将 Web 应用程序升级为跨浏览器兼容的问题

标签 javascript html cross-browser w3c

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

当前的 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 确实可以在现代浏览器中工作,但不推荐吗?我希望有人能够对此有所了解,因为这种替换将需要更改大量代码。

最佳答案

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

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

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

详情参见The HTMLAllCollection interfaceThe [[IsHTMLDDA]] Internal Slot

关于javascript - Document.all 将 Web 应用程序升级为跨浏览器兼容的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19716679/

相关文章:

javascript - 为什么每次我在 Chrome 中更改日期字段中的年份时都会触发 onChange 事件?

JavaScript 函数格式 : Is one of these a method?

html - 菜单图标不出现且链接不起作用

html - Bootstrap 内联输入和按钮

jquery - 滚动时将元素设置为固定位置会使该元素闪烁

html - CSS 菜单在 Safari 中显示不正确

html - 在 table less 设计中使用 float 好吗?

javascript - 跨域/跨浏览器,ajax调用

javascript - 如何在 JavaScript 中合并两个数组并保持它们的顺序

javascript - 将参数与 Jasmine 中的函数匹配