我正在处理旧项目。其中 document.all()
用于 JavaScript 中。相同的命令在 IE8、9、10 中运行良好,但在 IE11 中不起作用。
我发现我们需要使用 document.getElementById()
,但我需要为此更改近 1000 个 JSP 文件。
请提出建议 - 是否有任何替代方案可以实现这一点?
最佳答案
可以在 IE11/Edge 中使用 document.all(id)
和 document.all[id]
- 至少在以下情况下站点有 HTML4 文档类型,也许还有相关的兼容性功能。它似乎也适用于(对我来说)E11/Edge 和 HTML5; YMMV 最后的配置。
也就是说,即使它是 "no longer supported" - 和是even marked as removed (所以 YMMV 在“兼容”模式之外) - 它仍然在 IE11 中实现。 Windows XP“不再受支持”,但它继续被使用,并且仍然像以前一样运行……别介意它是一艘废弃的船。 (该文档仅暗示 HTML5 文档类型触发绿地行为;尽管我无法观察到所声称的效果。)
由于这是一个“旧项目”,最简单的解决方案就是不理会它,根据需要触发 IE“兼容模式”;无论如何,可能还有许多其他过时的方法。也就是说,将网站保留为 HTML4,因为这毕竟是一个“旧项目”。
虽然我最初在评论中建议“shimming”1,但由于多种原因,所需的属性/对象存在问题,并且 all[id]
形式无法模拟为 RobG指出。此外,这样的填充程序实际上不会更新代码以使用已批准的方法 - 这只是一个谎言,并且与最初删除此类填充程序的原因背道而驰。
因此,如果希望更改已弃用/过时的用法,正确的解决方案是修改“1000 个 JSP 文件”。通过一些分析,这应该可以通过大部分自动化的全局替换以及差异/增量代码审查来实现。
1FWIW,最基本的填充程序,假设在 IE11-where-document.all-is-really-removed 中可以重新分配给 document.all,则类似于:
if (!document.all) {
document.all = document.getElementById;
}
这将允许 document.all(someId)
但不允许 all(name)
, all[id]
、all.length
或 all.item(id)
。仍然需要查看 document.all
的当前用法,以确保填充程序覆盖现有用法;未涵盖的少数用法应批量更新。
如果这样的填充程序足够了,仍然需要将其注入(inject)到所有“1000 个 JSP 文件”中;希望已经有一个通用脚本文件..
关于javascript - 是否可以在 IE11 中使用 "document.all"而不更改每个用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29426323/