querySelector частичное совпадение
Добрый день.
Хочу выбрать все элементы "а", но те, у которых значение их атрибута href содержит, например example.com: var el2 = document.querySelectorAll('a[href*="example.com"]'); но пока el2.length=0. Как правильно написать выражение в круглых скобках? |
Вроде все правильно. А в документе есть такие элементы?
|
Такие элементы есть.
Только обратил внимание. Необходимые элементы А - это ссылки на внешние сайты. Наверное из-за этого el2.length=0. Frames? Как их выбрать? |
Не знаю, что именно у вас не работает. Может пример приводите один, а у себя пишете другое.
Все работает
<body>
<a href="http://example.com">http://example.com</a><br>
<a href="https://example.com">https://example.com</a><br>
<a href="example1.com">example1.com</a><br>
<a href="http://example.com/path/doc.html">http://example.com/path/doc.html</a><br>
<script>
document.querySelectorAll('a[href*="example.com"]')
.forEach(el => el.style.color="green")
</script>
</body>
|
ronaldo, найти элемент можно только тогда, когда он есть на странице. Если у тебя скрипт выполняется раньше чем загрузятся элементы - то и будет 0. Тебе надо либо перенести скрипт вниз, либо отложить исполнение до загрузки:
addEventListener('DOMContentLoaded', () => {
// ...
})
|
При загруженной необходимой странице
если выполнять эту строки в Инструментах разработчика var elems = document.getElementsByTagName("A"); console.log (elems.length); for(var i=0; i<elems.length; i++) console.log(elems[i].getAttribute("href")); и при этом выбирать в выпадающем списке Javascript context: (справа от значка Clear console) разные значения то и вывод будет разный: например по количеству элементов .length. Т.е не все необходимые элементы "A" собираются при простом getElementsByTagName, а собираются при определенном значении Javascript context:. Как в скрипте указать этот Javascript context:? |
ronaldo, оно во фреймах. Если ты используешь юзерскрипты - то тебе надо чтоб @match захватывал собственно адрес фрейма.
Если эти фреймы ведут не на другую страницу, а просто зачем-то сделаны локально, то можно запросить так:
var links = Array.prototype.reduce.call(
document.querySelectorAll('iframe'),
(acc, iframe) => {
try {
acc.push(...iframe.contentWindow.document.querySelectorAll('a'));
} catch (e) {
console.warn('Cant read window, foreign domain!', iframe);
}
return acc;
},
[]
)
|
Да - это фреймы, которые ведут на другой сайт.
При этом: "SecurityError: Blocked a frame with origin "https://www....com" from accessing a cross-origin frame." |
Цитата:
Цитата:
|
Уточняю:
Указанную SecurityError можно обойти, если применить : "надо чтоб @match захватывал собственно адрес фрейма"? |
| Часовой пояс GMT +3, время: 05:07. |