Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Обработка выбора элемента списка (https://javascript.ru/forum/events/83301-obrabotka-vybora-ehlementa-spiska.html)

Igal 12.11.2021 12:17

Обработка выбора элемента списка
 
Есть сайт https://zakrepi.ru/categories/instrument-rybolova? на открывающейся странице есть список "Показывать по". Когда на форме мышкой изменяю значение страница обновляется и количество товара меняется. Но! нигде ни могу найти какая функция при этом вызывается и как вообще они это сделали если <select> не запечатан в <form>.

Нужно скриптом (он будет подставлен перед </body>) изменить количество отображаемого товара на странице.

На данный момент перепробовал функции имитации нажатия мышкой: https://askdev.ru/q/kak-imitirovat-s...ascript-19669/
принудительно устанавливая значение в списке перед вызовом функции имитации нажатия мышкой. Ничего не получилось.

ksa 12.11.2021 12:34

Цитата:

Сообщение от Igal
и как вообще они это сделали если <select> не запечатан в <form>

Могли просто использовать событие change на этом select...

Igal 12.11.2021 12:39

Цитата:

Сообщение от ksa (Сообщение 541368)
Могли просто использовать событие change на этом select...

Они могли бы так сделать? или я могу это изменить?
Дело в том, что я уже 2-й день парюсь и не могу понять как они вообще это сделали!? Где та функция которую они вызывают? Если найду функцию, то вызвать ее из скрипта проблем не будет!

рони 12.11.2021 12:56

Цитата:

Сообщение от Igal
Нужно скриптом (он будет подставлен перед </body>) изменить количество отображаемого товара на странице.

const event = new Event("change", {bubbles: true}),
      select = document.querySelector('[data-set-pagination]');
      select.value = 24;
      select.dispatchEvent(event);

Igal 12.11.2021 13:04

Цитата:

Сообщение от рони (Сообщение 541370)
const event = new Event("change", {bubbles: true}),
      select = document.querySelector('[data-set-pagination]');
      select.value = 24;
      select.dispatchEvent(event);

НЕТ! Не получается. Значение в списке меняется (и 24 и 36 ставится), а количество отображаемого товара остается "по умолчанию" 12.

рони 12.11.2021 13:26

Igal,
браузер какой?

Igal 12.11.2021 13:26

Цитата:

Сообщение от рони (Сообщение 541372)
Igal,
браузер какой?

Crom

Igal 12.11.2021 13:27

Цитата:

Сообщение от рони (Сообщение 541372)
Igal,
браузер какой?

Chrome

Igal 12.11.2021 13:34

Цитата:

Сообщение от рони (Сообщение 541372)
Igal,
браузер какой?

Подождите, я не прав! Загружаю текст страницы в 1С, добавляю скрипт, отправляю на формирование DOM дерева. А 1С, по описанию работает на IE, вот только какой версии не известно.

рони 12.11.2021 14:32

Igal,
как вариант ...
var event = document.createEvent("Event");
      event.initEvent("change", true, true);
      var select = document.querySelector('[data-set-pagination]');
      select.value = 24;
      select.dispatchEvent(event);

ksa 12.11.2021 14:34

Цитата:

Сообщение от Igal
Дело в том, что я уже 2-й день парюсь и не могу понять как они вообще это сделали!? Где та функция которую они вызывают?

В браузере смотрел?
Есть ли какие-то обработчики на select?

Igal 12.11.2021 14:39

Цитата:

Сообщение от рони (Сообщение 541377)
Igal,
как вариант ...
var event = document.createEvent("Event");
      event.initEvent("change", true, true);
      var select = document.querySelector('[data-set-pagination]');
      select.value = 24;
      select.dispatchEvent(event);

Проверил. Результат тот же.

Igal 12.11.2021 14:43

Цитата:

Сообщение от ksa (Сообщение 541378)
В браузере смотрел?
Есть ли какие-то обработчики на select?

Искал по все возможным контекстам. Текст вручную приводил в порядок. Вытащил тексты всех скриптов отдельно. Перечитал как работать со списками. Я, в принципе понять не могу как можно обработать изменение на форме, если нет <form> и из <select> или <option> действие не назначено.

ksa 12.11.2021 14:47

Igal, JS событийный язык... Должно быть какое-то событие. Именно на него и реагируют, меняя количество элементов на странице.

Igal 12.11.2021 14:51

Цитата:

Сообщение от ksa (Сообщение 541381)
Igal, JS событийный язык... Должно быть какое-то событие. Именно на него и реагируют, меняя количество элементов на странице.

Абсолютно согласен. Я по тому и обращаюсь к гуру, что у меня мысли закончились - все до чего свои мозги дотянулись перебрал. Если можете посмотреть, адрес страницы в начале темы (это сайт магазина в Тюмени).

ksa 12.11.2021 15:02

Цитата:

Сообщение от Igal
Если можете посмотреть, адрес страницы в начале темы (это сайт магазина в Тюмени).

Неее. Я на сторонние ресурсы не хожу. :)

voraa 12.11.2021 15:30

Там все события привязаны к body и какому то родительскому div.
Сделано судя по всему так. Там нет реакции именно на change для этого select.
Есть реакция на любой change для всех select, есть реакция на input для всех инпутов. Потом идет ajax запрос со всеми параметрами и возвращается html текст, который вставляется в соответствующий div
В этом html все - и левая колонка, и селекты для сортировки и количества и сами товары.
Возвращается <div class="grid-container">.... </div>
Обращение к серверу идет из app.js. Но он минимизирован - сказать откуда точно - не могу

Igal 13.11.2021 10:59

Цитата:

Сообщение от ksa (Сообщение 541384)
Неее. Я на сторонние ресурсы не хожу. :)

Можно зайти через 2gis Тюмень, компания называется "крепыж сеть магазинов". 2Gis точно безопасен.
Проблема оказалась в браузере! Через манифест хрома проверил варианты. Выкладываю те которые отработались.

Сам манифест:
{
"manifest_version": 3
,"name": "Pars"
,"short_name": "Pars"
,"version": "1.0"

,"content_scripts": [
{"matches": ["https://zakrepi.ru/*"],"js": [ "zakrepi.js" ]}
]
}

Файл zakrepi.js
Вариант 1:
var lv_sort=document.querySelector("nav.sort-wrap");
if (lv_sort!=null) { // Если нужный нам узел есть
const lv_event = new Event('change', {bubbles: true}), lv_select = document.querySelector('[data-set-pagination]');
lv_select.value = 24;
lv_select.dispatchEvent(lv_event);
}

Вариант 2:
var lv_event = document.createEvent('Event');
lv_event.initEvent('change', true, true);
var lv_select = lv_sort.querySelector('[data-set-pagination]');
lv_select.value = 36;
lv_select.dispatchEvent(lv_event);


Огромное человеческое спасибо Рони


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