Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   в консоли строка работает (елемент находит на странице),а на странице нет (https://javascript.ru/forum/misc/74777-v-konsoli-stroka-rabotaet-element-nakhodit-na-stranice-na-stranice-net.html)

selevo 07.08.2018 13:15

в консоли строка работает (елемент находит),а при выполнении в теле документа - нет
 
Вложений: 2
Пытаюсь заполнить данные карты на aliexpress через тампермонкей
в консоли строки заполняют поле карты, а при запуске из скрипта не работают.

// работает в консоли но здесь TypeError: Cannot set property 'value' of undefined
document.getElementsByTagName('input')['cardNum'].value =111;

    // работает в консоли но здесь TypeError: Cannot set property 'value' of null
 document.querySelector('#j-payment-method > div.checkout-payment.checkout-container.payment-content.form > ul > li:nth-child(1) > div.checkout-payment-form.checkout-spring > div > div:nth-child(1) > input[type="text"]:nth-child(2)').value=111


Как так,почему и что делать ?

Nexus 07.08.2018 13:30

getElementsByTagName возвращает HTMLCollection, не hash-таблицу (ассоциативный массив, в js - object), также у коллекции нет свойства "cardNum", поэтому в строке 2 ошибка.

В строке 5 querySelector не может найти на странице элемент, удовлетворяющий селектору, поэтому возвращает null.

selevo 07.08.2018 14:24

а почему эти строки все находят при запуске их в консоли а?


тут явно указан элемент cardNum в коллекции input
document.getElementsByTagName('input')['cardNum'].value =111;
и это работает вообще и в данном случае проверено на этом коде в консоли

а то что querySelector не может найти на странице элемент
это я написал в первом сообщении как и то сто он находит запуском этой же строки в консоли

Nexus 07.08.2018 14:46

Цитата:

Сообщение от selevo
тут явно указан элемент cardNum в коллекции input

Вот это поворот.
Действительно, к элементу можно обратиться по его имени, я ошибся.

Цитата:

Сообщение от selevo
а почему эти строки все находят при запуске их в консоли а?

Вероятно скрипт начинает срабатывать до того, как эти элементы появятся на странице.

Dilettante_Pro 07.08.2018 14:49

По имени или по id
<input type="text" name="cardNum" >
<script>
document.getElementsByTagName('input')['cardNum'].value =111;
</script>


<input type="text" id="cardNum" >
<script>
document.getElementsByTagName('input')['cardNum'].value =111;
</script>

selevo 07.08.2018 15:01

тоже думал что раньше
поставил на всякий случай запускаться после загрузки всей страницы (в конце страницы)
результат такой же

Может ...
А как сделать скрипт подождал секунд 5 перед запуском ?

selevo 07.08.2018 15:08

В общем вот так заработало
setTimeout("document.getElementsByTagName('input')['cardNum'].value ='111'", 3000)


но этот вариант слегка напрягает
как сделать так чтобы он сам определял загрузились ли данные ?

Nexus 07.08.2018 15:10

selevo, в tampermonkey, по-моему, можно выбрать когда скрипт будет запущен, убедитесь, что он запускается после загрузки DOM.
Откройте исходный код страницы (ctrl+u) и попробуйте найти в нем нужный вам input (поиск на странице: ctrl+f).
Если элемента на странице нет, значит он подгружается асинхронно и нужно откладывать запуск вашего скрипта до появления на странице нужного элемента.
В противном случае попробуйте запускать ваш скрипт после полной загрузки страницы:
window.addEventListener('load',function execute(){
    //тут ваш скрипт
});
if(document.readyState==='complete')
    execute();


Цитата:

Сообщение от selevo
А как сделать скрипт подождал секунд 5 перед запуском ?

Оберните его в setTimeout.

Nexus 07.08.2018 15:13

Цитата:

Сообщение от selevo
как сделать так чтобы он сам определял загрузились ли данные

Можно воспользоваться MutationObserver, можно написать скрипт, который каждый N-миллисекунд будет проверять появился ли на странице необходимый эл. или нет.
Первый вариант предпочтительнее.

selevo 07.08.2018 16:11

мастер!


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