В var лежит блок html, внутри блока запрос querySelector('#text') не находит элемент
В переменной лежит блок html, но внутри блока не ищет элемент по запросу querySelector('#text'), хотя он там есть. Можете подсказать в чём проблема?
(ЗАПРОСЫ) var open_submit_button = document.getElementById('submit-button'); open_submit_button.removeAttribute("disabled"); var submit_button = open_submit_button.querySelector('#text'); // вывод элемента 1 console.log('Элемент 1: open_submit_button - ' + open_submit_button); console.log(open_submit_button); // вывод элемента 2 console.log('Элемент 2: submit_button - ' + submit_button); // выдаёт null console.log(submit_button); (ОТВЕТЫ В КОНСОЛИ) Элемент 1: open_submit_button - [object HTMLElement] <ytd-button-renderer id="submit-button" class="style-scope ytd-commentbox style-primary" button-renderer is-paper-button> <a class="yt-simple-endpoint style-scope ytd-button-renderer" tabindex="-1"> <paper-button role="button" tabindex="0" animated aria-disabled="false" elevation="0" id="button" class="style-scope ytd-button-renderer style-primary" aria-label="Оставить комментарий" style> <yt-formatted-string id="text" class="style-scope ytd-button-renderer style-primary">Оставить комментарий</yt-formatted-string> </paper-button> </a> </ytd-button-renderer> Элемент 2: submit_button - null null --------- КОНЕЦ КОНСОЛИ --------- |
у вас там где id= какой-то не понятный символ после равно.
сотрите везде равно и на печатайте с клавиатуры <ytd-button-renderer id="submit-button" class="style-scope ytd-commentbox style-primary" button-renderer is-paper-button> <a class="yt-simple-endpoint style-scope ytd-button-renderer" tabindex="-1"> <paper-button role="button" tabindex="0" animated aria-disabled="false" elevation="0" id="button" class="style-scope ytd-button-renderer style-primary" aria-label="Оставить комментарий" style> <yt-formatted-string id="text" class="style-scope ytd-button-renderer style-primary">Оставить комментарий</yt-formatted-string> </paper-button> </a> </ytd-button-renderer> <script> var open_submit_button = document.getElementById('submit-button'); //open_submit_button.removeAttribute("disabled"); var submit_button = open_submit_button.querySelector('#text'); // вывод элемента 1 console.log('Элемент 1: open_submit_button - ' + open_submit_button); console.log(open_submit_button); // вывод элемента 2 console.log('Элемент 2: submit_button - ' + submit_button); // выдаёт null console.log(submit_button); </script> |
О, благодарю! И как такую вещь только нашли? Этот блок кода с неподвластной мне страницы считывается. Случайно не знаете как эту ошибку можно обойти? Можно попробовать перерисовать другим скриптом прямо на странице, наверное...
|
тут видно что шрифт черный, значит что-то не так.
как вы этот блок получаете? |
Что значит чёрный? Цвет или защита какая-то подразумевается?
Получаю блок так (первая строка поста): var open_submit_button = document.getElementById('submit-button'); через расширение для браузера Tampermonkey. |
Попробовал получить элемент и по id и по тегу:
var submit_button1 = open_submit_button.querySelector("#text"); var submit_button2 = open_submit_button.querySelector("yt-formatted-string"); И всё равно в переменных null... Даже не знаю, что за фигня. Вот снова этот блок в котором пытаюсь найти элементы и в этот раз багов в блоке вроде нет, но не находятся элементы. <ytd-button-renderer id="submit-button" class="style-scope ytd-commentbox style-primary" button-renderer="" is-paper-button=""> <a class="yt-simple-endpoint style-scope ytd-button-renderer" tabindex="-1"> <paper-button role="button" tabindex="0" animated="" aria-disabled="false" elevation="0" id="button" class="style-scope ytd-button-renderer style-primary" aria-label="Оставить комментарий" style=""> <yt-formatted-string id="text" class="style-scope ytd-button-renderer style-primary">Оставить комментарий</yt-formatted-string> </paper-button> </a> </ytd-button-renderer> (оригинал) <ytd-button-renderer id="submit-button" class="style-scope ytd-commentbox style-primary" button-renderer="" is-paper-button=""><a class="yt-simple-endpoint style-scope ytd-button-renderer" tabindex="-1"><paper-button role="button" tabindex="0" animated="" aria-disabled="false" elevation="0" id="button" class="style-scope ytd-button-renderer style-primary" aria-label="Оставить комментарий" style=""><yt-formatted-string id="text" class="style-scope ytd-button-renderer style-primary">Оставить комментарий</yt-formatted-string></paper-button></a></ytd-button-renderer> |
<ytd-button-renderer id="submit-button" class="style-scope ytd-commentbox style-primary" button-renderer="" is-paper-button=""> <a class="yt-simple-endpoint style-scope ytd-button-renderer" tabindex="-1"> <paper-button role="button" tabindex="0" animated="" aria-disabled="false" elevation="0" id="button" class="style-scope ytd-button-renderer style-primary" aria-label="Оставить комментарий" style=""> <yt-formatted-string id="text" class="style-scope ytd-button-renderer style-primary">Оставить комментарий</yt-formatted-string> </paper-button> </a> </ytd-button-renderer> <script> var open_submit_button = document.getElementById('submit-button'); var submit_button2 = open_submit_button.querySelector("yt-formatted-string"); console.log(submit_button2); </script> работает вроде |
На той странице это не работает. Возможно блокируется чем-то такой вариант получения данных. Решения пока не нашёл...
|
дайте ссылку я гляну
|
Вот страница
https://www.youtube.com/watch?v=gEIK9Tkw3KU Вот весь код который пытаюсь применить. (пишу его в расширении Tampermonkey браузера Chrome) // ==UserScript== // @name test 23 // @namespace YouTube // @version 0.1 // @description try to take over the world! // @author You // @match [url]https://www.youtube.com/*[/url] // @grant none // ==/UserScript== // [url]https://www.youtube.com/watch?v=gEIK9Tkw3KU[/url] (function() { 'use strict'; window.onload = function() { create_button (); // Создаёт кнопку div1.onclick = function () { div1_onclick(); } var div1; // Создаёт кнопку function create_button () { div1 = document.createElement('div'); div1.innerHTML = 'кнопка'; div1.style.zIndex = 9999; div1.style.marginTop = "42px"; div1.style.color = "red"; div1.style.fontSize = "15px"; div1.style.background = "lime"; div1.style.position = "fixed"; div1.style.cursor = "pointer"; document.body.appendChild(div1); } //------ end function create_button function div1_onclick (){ window.scrollTo(0,600); // прокручивает окно для загрузки нужного элемента var elem1; get_elem(); // ожидает загрузки нужного элемента на странице // innercount - счётчик попыток function get_elem(innercount = 0){ elem1 = document.getElementById('placeholder-area'); if (elem1 == null) { // Ограничение на количество попыток поиска элемента. if (innercount > 10 && innercount < 20) { window.scrollTo(0,900); // прокрутить окно ещё немного } if(innercount > 20) { // если прокрутка не помогла, то остановка поиска alert("элемент не найден"); return; } innercount++; // количество попыток поиска console.log('innercount - ' + innercount); // запускается, пока не появится нужный элемент setTimeout(get_elem, 1000, innercount); console.log("IF: elem1 = " + elem1); // элемент появился } else { console.log("ELSE: elem1 = " + elem1); elem1.click(); // активирует загрузку блока для последующего поиска в нём var open_submit_button = document.getElementById('submit-button'); // HTML-блок var submit_button1 = open_submit_button.querySelector("#text"); // null... var submit_button2 = open_submit_button.querySelector("yt-formatted-string"); // null... // (ДРУГОЙ ПУТЬ) // var submit_button_3 = document.getElementsByTagName("yt-formatted-string > ytd-button-renderer"); // collection хрень // var submit_button_3 = document.querySelectorAll("yt-formatted-string > #text"); //Node хрень var submit_button3 = document.getElementsByTagName("yt-formatted-string"); // куча элементов //var inner_search = submit_button3.querySelector("#text"); // is not a function... var inner_search = submit_button3.querySelectorAll("#text"); // is not a function... console.log('Элемент 0: open_submit_button - ' + open_submit_button); console.log(open_submit_button); console.log('Элемент 1: submit_button1 - ' + submit_button1); console.log(submit_button1); console.log('Элемент 2: submit_button2 - ' + submit_button2); console.log(submit_button2); console.log('Элемент 3: submit_button3 - ' + submit_button3); console.log(submit_button3); console.log('Элемент 4: inner_search - ' + inner_search); console.log(inner_search); } } //---------- end function get_elem }; //------------div1.onclick = function() }; //------ end window.onload = function() })(); |
глянул, в консоле работает.
|
И нет "null" и "is not a function..."? Я просто озадачен... А как запускаете? Может расширение у меня глючит или ещё что, даже не знаю как быть...
|
Alexoner
просто в консол выполнил, глянул только селекторы open_submit_button.querySelector("#text"); open_submit_button.querySelector("yt-formatted-string"); , может у вас ошибка в другом месте? |
А вы какой код в консоли выполняли, можете выложить? Пока у меня не срабатывает.
|
document.getElementById('submit-button').querySelector("yt-formatted-string"); |
Запустил вашу строку в консоли. Ответ:
Uncaught TypeError: Cannot read property 'querySelector' of null at <anonymous>:1:41 (anonymous) @ VM27285:1 |
А нет, работает. Странно.
В коде вряд ли есть ошибки, так как в итоге HTML-блок в переменной появляется (что в начальном посте и описано), а вот внутри этого блока элемент найти не удаётся. Благодарю за ответы. Буду думать дальше как быть... |
Решение нашлось: запуск внутреннего поиска с задержкой в одну секунду.
Не знаю почему так работает, ведь в переменной HTML-блок уже был, но видимо для внутреннего поиска он как бы ещё не успевает появиться. При запуске с задержкой он видимо появляется и всё работает. Благодарю за помощь в поиске решения. setTimeout(search1, 1000); function search1(){ var submit_button = open_submit_button.querySelector('#text'); } |
Alexoner,
просто блок подгружается динамически, и window.onload тут не помогает. Либо таймаут, либо отслеживание появления через MutationObserver, или промис какой нибудь |
Благодарю за полезную информацию.
|
Часовой пояс GMT +3, время: 07:20. |