模拟 IE7 的 getElementById 的行为

Emulate behavior of getElementById of IE7

提问人:SATO Yusuke 提问时间:10/29/2023 更新时间:10/29/2023 访问量:45

问:

背景

我有一个当前在 Edge Internet Explorer 模式下运行的 Web 应用程序。我想将此应用程序移植到 Edge 或 Chrome 等现代浏览器。

此应用程序中的 JavaScript 依赖于 IE7 文档模式 (https://learn.microsoft.com/en-us/internet-explorer/ie11-deploy-guide/img-ie11-docmode-lg)。例如,此应用程序大量使用,并假定对 ID 和 NAME 属性执行不区分大小写的匹配。getElementById()getElementById()

问题

当然,您可以根据现代 JavaScript API 中的规范重写此应用程序。但是这个应用程序有太多的 JavaScript 文件,它需要相当多的非显而易见的工作。所以我正在寻找一些解决方法。getElementById()

问题

有没有办法在现代浏览器上模拟IE7文档模式的行为?getElementById()

例如,如何反向填充 的行为以模仿它在 IE7 上的行为?getElementById()

javascript internet-explorer polyfills

评论

1赞 Bergi 10/29/2023
当然,只是用你想要的旧行为覆盖吗?document.getElementById
0赞 Matt 10/29/2023
这不是一个很好的答案,但你的问题已经足够令人沮丧了,我会尝试一下。使用 sed 和 awk 或任何其他正则表达式来检查并将您关心的每个值更改为小写。它可能必须仔细检查并找到重复项,并引起您的注意,以便先手动修复。
0赞 T.J. Crowder 10/29/2023
FWIW,我建议不要替换.请改用您自己的函数。使用现代工具(例如 Matt 提到的那些工具,还有许多其他工具),您可以轻松地使用函数名称更改所有出现的document.getElementByIddocument.getElementById

答:

2赞 Quentin 10/29/2023 #1

获取可能具有所需名称或 ID 的所有元素的列表,然后筛选它们以找到第一个匹配的元素。

const getElementCaseInsensitivelyByNameOrId = (nameOrId) => {
  // Start by getting a list of prospective elements.
  const prospectiveElements = document.querySelectorAll("[id], [name]");

  // Convert to an array for access to the methods on array.prototype
  const arrayProspectiveElements = [...prospectiveElements];

  // Lower case the search term
  const searchTerm = nameOrId.toLowerCase();

  // Perform the search
  const firstMatch = arrayProspectiveElements.find(element => element.id?.toLowerCase() === searchTerm || element.name?.toLowerCase() === searchTerm);

  return firstMatch;
};

const foo = getElementCaseInsensitivelyByNameOrId("FOO");
const bar = getElementCaseInsensitivelyByNameOrId("BAR");
const sirNotAppearingInThisDocument = getElementCaseInsensitivelyByNameOrId("sirNotAppearingInThisDocument");

console.log({
  foo,
  bar,
  sirNotAppearingInThisDocument
});
<div id="Foo">Foo</div>
<input name="bAR" value="bAR">

或者,更简洁地说:

const getElementCaseInsensitivelyByNameOrId = (nameOrId) => {
    const t = nameOrId.toLowerCase();
    return [...document.querySelectorAll("[id], [name]")].find(e => e.id?.toLowerCase() === t || e.name?.toLowerCase() === t);
}