Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.11.2022, 14:24
Интересующийся
Отправить личное сообщение для ronaldo Посмотреть профиль Найти все сообщения от ronaldo
 
Регистрация: 03.10.2022
Сообщений: 15

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

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

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

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

Как правильно написать выражение в круглых скобках?
Ответить с цитированием
  #2 (permalink)  
Старый 18.11.2022, 15:29
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,743

Вроде все правильно. А в документе есть такие элементы?
Ответить с цитированием
  #3 (permalink)  
Старый 18.11.2022, 15:47
Интересующийся
Отправить личное сообщение для ronaldo Посмотреть профиль Найти все сообщения от ronaldo
 
Регистрация: 03.10.2022
Сообщений: 15

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

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

Frames?
Как их выбрать?
Ответить с цитированием
  #4 (permalink)  
Старый 18.11.2022, 17:04
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,743

Не знаю, что именно у вас не работает. Может пример приводите один, а у себя пишете другое.
Все работает
<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>
Ответить с цитированием
  #5 (permalink)  
Старый 18.11.2022, 17:15
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

ronaldo, найти элемент можно только тогда, когда он есть на странице. Если у тебя скрипт выполняется раньше чем загрузятся элементы - то и будет 0. Тебе надо либо перенести скрипт вниз, либо отложить исполнение до загрузки:
addEventListener('DOMContentLoaded', () => {
  // ...
})
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 21.11.2022, 14:18
Интересующийся
Отправить личное сообщение для ronaldo Посмотреть профиль Найти все сообщения от ronaldo
 
Регистрация: 03.10.2022
Сообщений: 15

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

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:?
Ответить с цитированием
  #7 (permalink)  
Старый 21.11.2022, 19:03
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

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;
  },
  []
)
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 22.11.2022, 14:45
Интересующийся
Отправить личное сообщение для ronaldo Посмотреть профиль Найти все сообщения от ronaldo
 
Регистрация: 03.10.2022
Сообщений: 15

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

При этом:
"SecurityError: Blocked a frame with origin "https://www....com" from accessing a cross-origin frame."
Ответить с цитированием
  #9 (permalink)  
Старый 22.11.2022, 16:03
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,583

Цитата:
Если эти фреймы ведут не на другую страницу
__
Цитата:
Если ты используешь юзерскрипты - то тебе надо чтоб @match захватывал собственно адрес фрейма.
__________________
29375, 35
Ответить с цитированием
  #10 (permalink)  
Старый 23.11.2022, 10:55
Интересующийся
Отправить личное сообщение для ronaldo Посмотреть профиль Найти все сообщения от ronaldo
 
Регистрация: 03.10.2022
Сообщений: 15

Уточняю:

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обработать кейс в задаче на совпадение по массиву? dc65k Элементы интерфейса 5 27.05.2020 19:14
datalist и частичное совпадение VanillaNinja Элементы интерфейса 5 23.02.2016 14:39
проверить на совпадение нескольких атрибутов alexmixaylov jQuery 15 18.02.2016 00:16
Поиск в массиве, частичное совпадение фонарик Общие вопросы Javascript 25 04.04.2013 07:43
Как проверить два обьекта на совпадение? abc_ua jQuery 2 16.03.2011 08:40