querySelector,通配符是否匹配?


133

有没有一种方法可以使用querySelector或进行通配符元素名称匹配querySelectorAll?我看到属性查询中支持通配符,但不支持元素本身。

我要解析的XML文档基本上是属性的平面列表,我需要查找名称中包含某些字符串的元素。

我意识到,如果需要的话,XML文档可能需要进行重组,但这不会发生。

除了返回使用显然不推荐使用的XPath(IE9删除了它)之外,任何解决方案都是可以接受的。


“名称”是指标签名称?
kennytm 2012年

1
@JaredMcAteer的答案非常值得被接受为答案。请考虑。
RBT

Answers:


345

[id^='someId']将匹配以开头的所有ID someId

[id$='someId']将匹配所有以结尾的ID someId

[id*='someId']将匹配所有包含的ID someId

如果你正在寻找的name属性刚刚替补idname

如果您在谈论元素的标签名称,我不相信有一种使用方法 querySelector


4
谢谢,我的意思是标签名称。
埃里克·安德森

嗯,我做不到document.querySelectorAll(“ div。[id $ ='foo']”))
SuperUberDuper

4
在那里的周期可能搞乱它document.querySelectorAll("div[id$='foo']")IE8只有部分QSA的支持,我想他们只支持CSS2.1选择,所以这些选择将在IE8不工作,但IE9 +会工作。
JaredMcAteer'2

这个答案救了我一命!谢谢!!
梅纳斯

28

我正在搞乱/沉思于涉及querySelector()的一类代码,并在这里结束,并且使用标签名和querySelector()对OP问题进行了可能的解答,并以@JaredMcAteer来回答我的问题,也就是类似RegEx与香草Javascript中的querySelector()匹配

希望以下内容有用并适合OP或其他所有人的需求:

// basically, of before:
var youtubeDiv = document.querySelector('iframe[src="http://www.youtube.com/embed/Jk5lTqQzoKA"]')

// after     
var youtubeDiv = document.querySelector('iframe[src^="http://www.youtube.com"]');
// or even, for my needs
var youtubeDiv = document.querySelector('iframe[src*="youtube"]');

然后,例如,我们可以获取src内容,等等。

console.log(youtubeDiv.src);
//> "http://www.youtube.com/embed/Jk5lTqQzoKA"
console.debug(youtubeDiv);
//> (...)

12

将tagName设置为显式属性:

for(var i=0,els=document.querySelectorAll('*'); i<els.length;
          els[i].setAttribute('tagName',els[i++].tagName) );

我自己需要一个XML文档,其嵌套标签以结尾_Sequence。有关更多详细信息,请参见JaredMcAteer答案。

document.querySelectorAll('[tagName$="_Sequence"]')

我没有说这会很漂亮:) PS:我建议使用tag_nametagName,因此在读取“计算机生成的”隐式DOM属性时不会遇到干扰。


8

我只是写了这个简短的脚本;似乎有效。

/**
 * Find all the elements with a tagName that matches.
 * @param {RegExp} regEx  regular expression to match against tagName
 * @returns {Array}       elements in the DOM that match
 */
function getAllTagMatches(regEx) {
  return Array.prototype.slice.call(document.querySelectorAll('*')).filter(function (el) { 
    return el.tagName.match(regEx);
  });
}
getAllTagMatches(/^di/i); // Returns an array of all elements that begin with "di", eg "div"

querySelectorAll返回的对象不一定在所有浏览器上都支持过滤器(因为它并不总是一个常规的javascript数组)。确保在生成脚本之前(如果脚本是动态生成的)或使用条件语句在生产中检查此断言。
德米特里

很好的答案...这是我找到的关门比赛。可悲的是,我正在使用自定义元素,而像这样的功能仍然是手动工作。
codepleb

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.