Мне нужно преобразовать следующий скрипт 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]» не является допустимым селектором.
Спасибо за любое предложение
document.querySelector(this) — это код, вызывающий проблему. Вы не можете передать объект элемента в querySelector.
Для начала поменяйте это 'change', function() на это 'change', function({ target }). Затем измените это document.querySelector(this).querySelector("option:selected"); на это target.querySelector("option:checked");



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я вижу три проблемы (возможно, только две):
document.querySelector(this) передает объект элемента в querySelector. Вы не можете этого сделать, он принимает строки, определяющие селекторы CSS. Чтобы просмотреть элемент, на который ссылается this, используйте this.querySelector("selector string"). Но если вы хотите получить выбранный вариант из HTMLSelectElement, вы можете вместо этого использовать его массив selectedOptions.
option:selected зависит от jQuery. Чтобы найти первое выбранное option в select, вы можете вместо этого использовать "option:checked". Но см. № 1, вам не нужно делать это таким образом.
Код 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>
Пожалуйста, покажите HTML, связанный с этим. В частности, есть ли один элемент
select.ddlVariantiили более одного?