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

Document.all issue for upgrading web application to be cross browser compatible

本文关键字:Document 问题 all 浏览器 应用程序 Web      更新时间:2023-09-26

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

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

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

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

好吧,我写了一个简单的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存在的方式),它们返回"undefined"。

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