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, время: 18:45. |