querySelector,通配符元素匹配?

IT技术 javascript dom domparser selectors-api
2021-02-05 09:29:23

有没有办法使用querySelectoror进行通配符元素名称匹配querySelectorAll

我试图解析的 XML 文档基本上是一个简单的属性列表

  • 我需要找到名称中包含某些字符串的元素。
  • 我看到在属性查询中支持通配符,但不支持元素本身。

除了返回使用明显已弃用的 XPath(IE9 删除它)之外的任何解决方案都是可以接受的。

6个回答

[id^='someId']将匹配所有以someId.

[id$='someId']将匹配所有以someId.

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

如果您正在寻找该name属性,只需idname.

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

第三方编辑

例子

  • 查找所有 aria-label 开头的节点 Important_foo
  • 对于找到的每个节点,将其 aria-label 记录到控制台

代码

var nodeList = document.querySelectorAll('[aria-label^="Important_foo"]');
nodeList.forEach(node=> { console.log(node.getAttribute("aria-label"))});
嗯我不能做 document.querySelectorAll("div.[id$='foo']")
2021-03-15 09:29:23
这里是 CSS 规范的主要网站w3.org/Style/CSS/specs.en.html和关于属性选择器的最新信息w3.org/TR/selectors-4/#attribute-selectors
2021-03-15 09:29:23
谢谢,我的意思是标签名称。
2021-04-08 09:29:23
这段时间可能搞砸了document.querySelectorAll("div[id$='foo']")IE8 只支持部分 QSA,我认为他们只支持 CSS2.1 选择器,所以这些选择器在 IE8 中不起作用,但 IE9+ 会起作用。
2021-04-08 09:29:23
我想知道为什么 API 不是更接近于正则表达式的方式,即 [id='^someId'] 将匹配所有以 someId 开头的 id。我确信这是有原因的,但我不知道为什么。一个问题当然是如何区分 id 何时实际上是 ^someId。作为一个粗略的想法,也许它会类似于 [id=^'someId'] ,即 ^ 字符在字符串之外?
2021-04-09 09:29:23

我正在搞乱/思考涉及 querySelector() 的单行代码 & 最后到这里,& 使用标签名称和 querySelector() 对 OP 问题有一个可能的答案,感谢@JaredMcAteer 回答我的问题,也就是 RegEx 之类的与 vanilla 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);
//> (...)
谢谢: document.querySelectorAll("a[href*=' adamt.nl/product']" ); 也为我工作(所以使用 href 而不是 src)。真主!
2021-03-15 09:29:23

将 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_nameover tagName,这样在读取“计算机生成”的隐式 DOM 属性时就不会遇到干扰。

我刚刚写了这个简短的脚本;似乎工作。

/**
 * 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"
非常好的答案......这是我发现的与我的问题最接近的匹配。遗憾的是,我正在使用自定义元素,而像这样的功能仍然是手动工作。
2021-03-17 09:29:23
querySelectorAll 返回的对象不一定支持所有浏览器上的过滤器(因为它并不总是一个常规的 javascript 数组)。确保在生成脚本之前(如果脚本是动态生成的)或使用条件语句在生产中检查此断言。
2021-03-30 09:29:23

我正在寻找regex + not + multiClass选择器,这就是我得到的。

希望这可以帮助寻找相同事物的人!

// contain abc class
"div[class*='abc']" 

// contain exact abc class
"div[class~='abc']" 

// contain exact abc & def(case-insensitively)
"div[class~='abc'][class*='DeF'i]" 

// contain exact abc but not def(case-insensitively)
"div[class~='abc']:not([class*='DeF'i])" 

css 选择器文档:https : //developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors

简单测试:https : //codepen.io/BIgiCrab/pen/BadjbZe