querySelector, подстановочный элемент соответствует? - PullRequest
87 голосов
/ 03 января 2012

Есть ли способ сопоставить имя элемента с подстановочными знаками, используя querySelector или querySelectorAll?Я вижу поддержку подстановочных знаков в запросах атрибутов, но не для самих элементов.

XML-документ, который я пытаюсь проанализировать, представляет собой простой список свойств, и мне нужно найти элементы, в именах которых есть определенные строки.

Я понимаю, что XML-документ, возможно, нуждается в реструктуризации, если мне это нужно, но этого просто не произойдет.

Любое решение, кроме возврата к использованию явно устаревшего XPath (IE9уронил) приемлемо.

Ответы [ 5 ]

245 голосов
/ 03 января 2012

[id^='someId'] будет соответствовать всем идентификаторам, начинающимся с someId.

[id$='someId'] будет соответствовать всем идентификаторам, заканчивающимся на someId.

[id*='someId'] будет соответствовать всем идентификаторам, содержащим someId.

Если вы ищете атрибут name, просто замените id на name.

Если вы говорите о названии тега элемента, я не думаю, что есть способ использовать querySelector

15 голосов
/ 19 июня 2014

Я возился с однострочниками, включающими querySelector (), и закончил здесь, и у меня есть возможный ответ на вопрос OP с использованием тегов names & querySelector (), с кредитами @JaredMcAteer для ответа на МОЙ вопрос, иначе Подобные RegEx совпадения с querySelector () в ванильном Javascript

Надеемся, что следующее будет полезно и соответствует потребностям ОП или всем остальным:

// 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);
//> (...)
10 голосов
/ 31 мая 2012

Установить 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_name вместо tagName, чтобы вы не сталкивались с помехами при чтении неявных атрибутов DOM, созданных компьютером.

4 голосов
/ 18 августа 2015

Я только что написал этот короткий сценарий;похоже на работу.

/**
 * 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"
0 голосов
/ 20 апреля 2019

Есть способ сказать, что это не так. Просто сделай то, чего никогда не будет. Хорошая ссылка селектора CSS: https://www.w3schools.com/cssref/css_selectors.asp, который показывает: not селектор следующим образом:

:not(selector)  :not(p) Selects every element that is not a <p> element

Вот пример: div, за которым следует что-то (кроме тега z)

div > :not(z){
 border:1px solid pink;
}
...