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 захватывал собственно адрес фрейма"? |
ronaldo,
Уточняю: ты используешь пользовательские скрипты(tempermonkey, greasemonkery и т.д.) или просто хакеришь? Во втором случае ничего сделать нельзя - это вопрос безопасности браузера, не даст он тебе лезть на чужой сайт. В первом случае "обойти" тоже ничего нельзя, но можно запустить свой скрип уже внутри фрейма, а дельше делать то что тебе надо. Можно даже наладить общение меж твоими скриптами через postMessage либо GM_setValue. Приер: есть сайт domain1.com, в нём iframe domain2.com. Ты можешь сделать юзерскрипт: // ==UserScript== // @name hrefs // @match *://domain1.com // @match *://domain2.com // ==/UserScript== var hrefs = Array.from( document.querySelectorAll('a'), a => a.href ); if (location.hostname === 'domain1.com') { console.log('hrefs domain1', hrefs); window.onmessage = ({data}) => { console.log('hrefs domain1 from domain2', JSON.parse(data)); }; } if (location.hostname === 'domain2.com') { console.log('hrefs domain2', hrefs); window.top.postMessage(JSON.stringify(hrefs), '*'); } |
Часовой пояс GMT +3, время: 02:23. |