Jquery на изменения не работает - PullRequest
0 голосов
/ 08 января 2019

В настоящее время у меня есть HTML, как это:

<div class="selector-wrapper">
    <label for="product-select-1372104458328-option-0">Style</label><select class="single-option-selector" data-option="option1" id="product-select-1372104458328-option-0">
        <option value="Adjustable">
            Adjustable
        </option>
        <option value="Flex Fit">
            Flex Fit
        </option>
        <option value="Trucker Hat">
            Trucker Hat
        </option>
    </select>
</div>

мой код jquery такой:

$(function() {
    $('.single-option-selector').on('change', function() {
    console.log( 'blahblah' );
    });
});

ожидаемый результат будет для console.log при изменении опции в .single-option-selector, однако это не тот случай, когда я ничего не получаю. Нет ошибок или чего-то еще. Есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 08 января 2019

Поскольку вы упомянули, что разметка генерируется Shopify, очень вероятно , что элемент <select>, который вы выбираете, фактически недоступен во время выполнения (то есть он еще не внедрен в DOM ). В этом случае jQuery молча завершается ошибкой, когда не может найти элемент, к которому привязываются обработчики событий. Вы можете запустить простую проверку, подключив эту строку:

console.log($('.single-option-selector').length);

Мои подозрения подтверждаются, если он возвращает 0, что означает, что во время выполнения ваш скрипт не может найти соответствующий элемент в вашей DOM. Способ преодолеть это - использовать всплывающее окно события: в основном вы присоединяете обработчик события к существующему элементу во время выполнения и просто фильтруете событие, чтобы отлавливать только те, которые испускаются элементами, указанными вашим селектором , т.е.:

$(document).on('change', '.single-option-selector', function () {
    // Your logic here
});

Однако у этого подхода есть недостаток: при прослушивании событий в документе верхнего уровня возникают значительные накладные расходы. Если вы знаете, что существует элемент, который всегда доступен во время выполнения, скажем, заданная структура DOM:

<body>
    <!-- This element is always present at runtime -->
    <section id="content">
        <!-- Contains dynamically injected HTML -->
    </section>
</body>

Затем вы можете обновить селектор, чтобы прослушивать события, всплывающие до #content, а не далее:

$('#content').on('change', '.single-option-selector', function () {
    // Your logic here
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...