Подтвердить что ты не робот

QuerySelector, подстановочный знак?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Я возился с одной строкой, включающей querySelector(), и закончил здесь, и у меня есть возможный ответ на вопрос OP, используя имена тегов и querySelector(), с кредитами на @JaredMcAteer для ответа на МОЙ вопрос, иначе есть RegEx-like совпадает с 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);
//> (...)

Ответ 3

Установите 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

Я просто написал этот короткий script; кажется, работает.

/**
 * 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"

Ответ 5

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

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

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

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

Ответ 6

Это работает для меня:

NSString *nameInWeb = [NSMutableString stringWithFormat:@"document.querySelector('[name$=\"057\"]').name"];

Показать все имена, заканчивающиеся на "057".