Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.08.2018, 13:15
Аватар для selevo
Кандидат Javascript-наук
Отправить личное сообщение для selevo Посмотреть профиль Найти все сообщения от selevo
 
Регистрация: 13.03.2013
Сообщений: 132

в консоли строка работает (елемент находит),а при выполнении в теле документа - нет
Пытаюсь заполнить данные карты на 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


Как так,почему и что делать ?
Изображения:
Тип файла: jpg 2018_08_07_14_3054.jpg (286.0 Кб, 3 просмотров)
Тип файла: jpg 2018_08_07_14_3251.jpg (296.5 Кб, 3 просмотров)

Последний раз редактировалось selevo, 07.08.2018 в 14:32.
Ответить с цитированием
  #2 (permalink)  
Старый 07.08.2018, 13:30
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,787

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

В строке 5 querySelector не может найти на странице элемент, удовлетворяющий селектору, поэтому возвращает null.
Ответить с цитированием
  #3 (permalink)  
Старый 07.08.2018, 14:24
Аватар для selevo
Кандидат Javascript-наук
Отправить личное сообщение для selevo Посмотреть профиль Найти все сообщения от selevo
 
Регистрация: 13.03.2013
Сообщений: 132

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


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

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

Последний раз редактировалось selevo, 07.08.2018 в 14:31.
Ответить с цитированием
  #4 (permalink)  
Старый 07.08.2018, 14:46
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,787

Сообщение от selevo
тут явно указан элемент cardNum в коллекции input
Вот это поворот.
Действительно, к элементу можно обратиться по его имени, я ошибся.

Сообщение от selevo
а почему эти строки все находят при запуске их в консоли а?
Вероятно скрипт начинает срабатывать до того, как эти элементы появятся на странице.
Ответить с цитированием
  #5 (permalink)  
Старый 07.08.2018, 14:49
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

По имени или по 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>
Ответить с цитированием
  #6 (permalink)  
Старый 07.08.2018, 15:01
Аватар для selevo
Кандидат Javascript-наук
Отправить личное сообщение для selevo Посмотреть профиль Найти все сообщения от selevo
 
Регистрация: 13.03.2013
Сообщений: 132

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

Может ...
А как сделать скрипт подождал секунд 5 перед запуском ?
Ответить с цитированием
  #7 (permalink)  
Старый 07.08.2018, 15:08
Аватар для selevo
Кандидат Javascript-наук
Отправить личное сообщение для selevo Посмотреть профиль Найти все сообщения от selevo
 
Регистрация: 13.03.2013
Сообщений: 132

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


но этот вариант слегка напрягает
как сделать так чтобы он сам определял загрузились ли данные ?
Ответить с цитированием
  #8 (permalink)  
Старый 07.08.2018, 15:10
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,787

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


Сообщение от selevo
А как сделать скрипт подождал секунд 5 перед запуском ?
Оберните его в setTimeout.
Ответить с цитированием
  #9 (permalink)  
Старый 07.08.2018, 15:13
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,787

Сообщение от selevo
как сделать так чтобы он сам определял загрузились ли данные
Можно воспользоваться MutationObserver, можно написать скрипт, который каждый N-миллисекунд будет проверять появился ли на странице необходимый эл. или нет.
Первый вариант предпочтительнее.
Ответить с цитированием
  #10 (permalink)  
Старый 07.08.2018, 16:11
Аватар для selevo
Кандидат Javascript-наук
Отправить личное сообщение для selevo Посмотреть профиль Найти все сообщения от selevo
 
Регистрация: 13.03.2013
Сообщений: 132

мастер!
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна раскрывающаяся таблица 7Lexus Элементы интерфейса 26 15.08.2014 15:15
Предполагается наличие ';' в IE7- FINoM (X)HTML/CSS 5 25.08.2012 16:05
Код в консоли хрома работает, а если вписать в сайт - то нет across Javascript под браузер 4 15.08.2012 20:38
Работа с radiobutton djsadd Элементы интерфейса 2 06.04.2011 08:37
JS меню работает на обычной html странице, а на юкозовском движке нет. adware Я не знаю javascript 10 16.05.2009 16:48