Контент, добавленный jQuery.prepend, не активируется (даже при запуске.on)

Спасибо за любую помощь. Этот сайт был отличным ресурсом.

Моя проблема: когда меню открывается на сайте, над которым я работаю, я также добавляю (к основному элементу) оверлей div и назначаю ему класс, который должен позволять кликать по нему, чтобы закрыть меню и удалить себя. Это сделано для того, чтобы пользователь мог щелкнуть в любом месте за пределами меню, чтобы закрыть его, вместо того чтобы требовать от него нажатия кнопки "Закрыть". Это звучит достаточно просто, но я не могу заставить его работать.

Я знаю, что существуют проблемы "связывания", так как я добавляю контент в DOM, поэтому я использовал.on() вместо.click(), полагая, что это позволит моему триггерному событию быть привязанным к недавно созданному div. Я также пробовал.bind(), но, честно говоря, я просто угадываю код на данном этапе, так как я не понимаю разницу между ними. Я не хочу использовать плагин для чего-то, что кажется таким простым, поэтому я надеюсь, что произошла легкая ошибка, которая сразу же станет очевидной для тех из вас, у кого больше опыта, то есть для всех вас.;) Вот моя функция jQuery. Все работает, как я хочу, за исключением того, что нажатие на "#the-overlay" ничего не делает.

    $('.the-toggle').on("click", function(){
    $(".the-menu").slideToggle();
    $(".icon-chevron-sign-down").toggleClass("icon-rotate-180");

    if ($('#the-overlay').length) {
        $('#the-overlay').remove();
    }
    else {
        var content = '<div id="the-overlay" class="the-toggle"></div>';
        $('body').prepend(content);

        var docHeight = $(document).height();
        $("#the-overlay").height(docHeight);    
    }
});

Пожалуйста, извините, если мой вопрос как-то нарушает правила. Я искал ответ, чтобы избежать повторов, но все, что я мог найти, указывали, что моя проблема будет решена с помощью.on() или устаревшего.live().

Спасибо.

2 ответа

Решение

Использовать синтаксис делегирования:

$(document.body).on("click",'.the-toggle', function(){...});

Пожалуйста, замените ваш код с кодом ниже. Это будет работать.

$(document).ready(function(e) {
    theToggle();
});
function theToggle(){
    $('.the-toggle').on("click", function(){
        $(".the-menu").slideToggle();
        $(".icon-chevron-sign-down").toggleClass("icon-rotate-180");

        if ($('#the-overlay').length) {
            $('#the-overlay').remove();
        }
        else {
            var content = '<div id="the-overlay" class="the-toggle"></div>';
            theToggle();
            $('body').prepend(content);             
            var docHeight = $(document).height();
            $("#the-overlay").height(docHeight);    
        }
    });
}
Другие вопросы по тегам