提问人:SATO Yusuke 提问时间:10/29/2023 更新时间:10/29/2023 访问量:45
模拟 IE7 的 getElementById 的行为
Emulate behavior of getElementById of IE7
问:
背景
我有一个当前在 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()
答:
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);
}
评论
document.getElementById
document.getElementById
document.getElementById