Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   querySelector частичное совпадение (https://javascript.ru/forum/events/84699-queryselector-chastichnoe-sovpadenie.html)

ronaldo 18.11.2022 14:24

querySelector частичное совпадение
 
Добрый день.

Хочу выбрать все элементы "а", но те, у которых значение их атрибута href содержит, например example.com:

var el2 = document.querySelectorAll('a[href*="example.com"]');

но пока el2.length=0.

Как правильно написать выражение в круглых скобках?

voraa 18.11.2022 15:29

Вроде все правильно. А в документе есть такие элементы?

ronaldo 18.11.2022 15:47

Такие элементы есть.

Только обратил внимание.
Необходимые элементы А - это ссылки на внешние сайты.
Наверное из-за этого el2.length=0.

Frames?
Как их выбрать?

voraa 18.11.2022 17:04

Не знаю, что именно у вас не работает. Может пример приводите один, а у себя пишете другое.
Все работает
<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>

Aetae 18.11.2022 17:15

ronaldo, найти элемент можно только тогда, когда он есть на странице. Если у тебя скрипт выполняется раньше чем загрузятся элементы - то и будет 0. Тебе надо либо перенести скрипт вниз, либо отложить исполнение до загрузки:
addEventListener('DOMContentLoaded', () => {
  // ...
})

ronaldo 21.11.2022 14:18

При загруженной необходимой странице
если выполнять эту строки в Инструментах разработчика

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:?

Aetae 21.11.2022 19:03

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;
  },
  []
)

ronaldo 22.11.2022 14:45

Да - это фреймы, которые ведут на другой сайт.

При этом:
"SecurityError: Blocked a frame with origin "https://www....com" from accessing a cross-origin frame."

Aetae 22.11.2022 16:03

Цитата:

Если эти фреймы ведут не на другую страницу
__
Цитата:

Если ты используешь юзерскрипты - то тебе надо чтоб @match захватывал собственно адрес фрейма.

ronaldo 23.11.2022 10:55

Уточняю:

Указанную SecurityError можно обойти, если применить :
"надо чтоб @match захватывал собственно адрес фрейма"?


Часовой пояс GMT +3, время: 18:45.