Преобразование скрипта Jquery в Javascript

Мне нужно преобразовать следующий скрипт jquery в javascript

<script type = "text/javascript">

  window.addEventListener("load", function() {
    jQuery(function($) {
      $('select.ddlVarianti').on('change', function() {
        var optionSelected = $(this).find("option:selected");
        var tagliaSelected   = optionSelected.text();
        window.dataLayer = window.dataLayer || [];
        dataLayer.push({
          'event':'GAevent',
          'eventID':'13',
          'eventCategory':'product',
          'eventAction':'taglia',
          'eventLabel': tagliaSelected,
        });

      });
    });
  });
</script>

Это то, что я сделал

  document.querySelector('select.ddlVarianti').addEventListener('change', function() {
    var optionSelected = document.querySelector(this).querySelector("option:selected");
    var tagliaSelected   = optionSelected.text();
    window.dataLayer = window.dataLayer || [];
    dataLayer.push({
      'event':'GAevent',
      'eventID':'13',
      'eventCategory':'product',
      'eventAction':'taglia',
      'eventLabel': tagliaSelected,
    });

  });

но у меня следующая ошибка..

Не удалось выполнить «querySelector» для «Документа»: «[объект HTMLSelectElement]» не является допустимым селектором.

Спасибо за любое предложение

Пожалуйста, покажите HTML, связанный с этим. В частности, есть ли один элемент select.ddlVarianti или более одного?

T.J. Crowder 01.10.2022 12:21
document.querySelector(this) — это код, вызывающий проблему. Вы не можете передать объект элемента в querySelector.
T.J. Crowder 01.10.2022 12:21

Для начала поменяйте это 'change', function() на это 'change', function({ target }). Затем измените это document.querySelector(this).querySelector("option:selected"‌​); на это target.querySelector("option:checked");

Robert 01.10.2022 13:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
104
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я вижу три проблемы (возможно, только две):

  1. document.querySelector(this) передает объект элемента в querySelector. Вы не можете этого сделать, он принимает строки, определяющие селекторы CSS. Чтобы просмотреть элемент, на который ссылается this, используйте this.querySelector("selector string"). Но если вы хотите получить выбранный вариант из HTMLSelectElement, вы можете вместо этого использовать его массив selectedOptions.

  2. option:selected зависит от jQuery. Чтобы найти первое выбранное option в select, вы можете вместо этого использовать "option:checked". Но см. № 1, вам не нужно делать это таким образом.

  3. Код jQuery ожидает события windowload, а затем, избыточно, ждет, пока DOM не будет готов (что и будет; load не срабатывает до тех пор, пока это не произойдет). Ваш код ничего не делает, чтобы ждать, пока все будет готово. В наши дни, если вы используете type = "module", в этом нет необходимости, так что это может быть хорошо. Если нет, вы можете подумать об этом (модули полезны) или использовать defer для элемента script.

Вы не сказали, есть ли только один элемент или несколько, но если мы предполагаем несколько, прокрутите результат querySelectorAll, чтобы настроить обработчики:

for (const element of document.querySelectorAll("select.ddlVarianti")) {
    element.addEventListener("change", function () {
        const optionSelected = this.selectedOptions[0];
        if (optionSelected) {
            const tagliaSelected = optionSelected.text;
            window.dataLayer = window.dataLayer || [];
            dataLayer.push({
                event: "GAevent",
                eventID: "13",
                eventCategory: "product",
                eventAction: "taglia",
                eventLabel: tagliaSelected,
            });
        }
    });
}

Живой пример:

for (const element of document.querySelectorAll("select.ddlVarianti")) {
    element.addEventListener("change", function () {
        const optionSelected = this.selectedOptions[0];
        if (optionSelected) {
            const tagliaSelected = optionSelected.text;
            console.info(`tagliaSelected = ${tagliaSelected}`);
            /*
            window.dataLayer = window.dataLayer || [];
            dataLayer.push({
                event: "GAevent",
                eventID: "13",
                eventCategory: "product",
                eventAction: "taglia",
                eventLabel: tagliaSelected,
            });
            */
        }
    });
}
<div>
    <select class = "ddlVarianti">
        <option value = "A">Option A</option>
        <option value = "B">Option B</option>
        <option value = "C">Option C</option>
        <option value = "D">Option D</option>
    </select>
</div>
<div>
    <select class = "ddlVarianti">
        <option value = "1">Option 1</option>
        <option value = "2">Option 2</option>
        <option value = "3">Option 3</option>
        <option value = "4">Option 4</option>
    </select>
</div>

Другие вопросы по теме