如何将 querySelectorAll() 函数添加到 IE <= 7 的 Element?
Posted
技术标签:
【中文标题】如何将 querySelectorAll() 函数添加到 IE <= 7 的 Element?【英文标题】:How to add querySelectorAll() function to Element for IE <= 7? 【发布时间】:2013-05-04 21:46:33 【问题描述】:使用this article 中的代码,我已成功将querySelectorAll
添加到IE7 中的document
。
但我需要在元素而不是document
上使用它,像这样:
var containers = document.querySelectorAll('.container'); // Works
for (var i=0; i<=containers.length; i++)
var container = containers[i];
container.querySelectorAll('a[data-type="people"]'); // Fails
// ...
有没有办法将querySelectorAll
添加到 IE7 中的元素,而不仅仅是添加到 document
?
【问题讨论】:
为什么不试试Sizzle library。它与 jQuery 使用的选择器引擎相同。 我需要保持代码很小,不需要不必要的功能。 ;-) 【参考方案1】:非常有趣的问题。
我倾向于为此使用库,例如 jQuery,下面提到的库之一,Closure 或 any of several others。或者只是使用Sizzle(jQuery 在 v1.9 分支中使用的选择器引擎)。
但回答你实际提出的问题:
你不能在 IE7 上扩展元素原型(很遗憾),所以除非你想通过预处理器函数运行所有元素实例以将 querySelectorAll
添加到它们(Prototype 和 MooTools 的工作方式,例如),你必须有一个单独的函数来传递元素。
这是编写该函数的一种方法:
var qsaWorker = (function()
var idAllocator = 10000;
function qsaWorker(element, selector)
var needsID = element.id === "";
if (needsID)
++idAllocator;
element.id = "__qsa" + idAllocator;
try
return document.querySelectorAll("#" + element.id + " " + selector);
finally
if (needsID)
element.id = "";
return qsaWorker;
)();
当然,如果你想在有querySelectorAll
的浏览器中使用qsaWorker
,你会想要这个:
function qsaWorker(element, selector)
return element.querySelectorAll(selector);
那么,总的来说,你可能想要:
var qsaWorker = (function()
var idAllocator = 10000;
function qsaWorkerShim(element, selector)
var needsID = element.id === "";
if (needsID)
++idAllocator;
element.id = "__qsa" + idAllocator;
try
return document.querySelectorAll("#" + element.id + " " + selector);
finally
if (needsID)
element.id = "";
function qsaWorkerWrap(element, selector)
return element.querySelectorAll(selector);
// Return the one this browser wants to use
return document.createElement('div').querySelectorAll ? qsaWorkerWrap : qsaWorkerShim;
)();
您使用它的代码将如下所示:
var containers = document.querySelectorAll('.container');
for (var i=0; i<=containers.length; i++)
var container = containers[i];
var links = qsaWorker(container, 'a[data-type="people"]'); // <== Changed
// ...
但同样,我倾向于使用库...
【讨论】:
以上是关于如何将 querySelectorAll() 函数添加到 IE <= 7 的 Element?的主要内容,如果未能解决你的问题,请参考以下文章
在 Typescript 中,如何使用扩展语法为 querySelectorAll 设置类型
Puppeteer:使用page.querySelectorAll()不是一个函数
querySelectorAll 和 getElementsBy* 方法返回啥?
querySelectorAll 和 getElementsBy* 方法返回啥?