jquery click не работает с контентом, сгенерированным ajax - PullRequest
74 голосов
/ 19 февраля 2012

Я использую $(".button").on("click", function(){ });

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

Я даже попробовал

$(".button").live("click", function(){ });

или

$(".button").click(function(){ });

Как мне заставить это работать?

РЕДАКТИРОВАТЬ: мой HTML:

<div class="container">
   <ul>
       <li>item1</li>
       <li>item2</li>
       <li>item3</li>
   </ul>
   <input type="button" value="reload" class="button" />
</div>

Ответы [ 4 ]

146 голосов
/ 19 февраля 2012

Должно быть сделано так.

$('body').on('click', '.button', function (){
        alert('click!');
    });

Если у вас есть контейнер, который не изменяется во время запроса ajax, это более производительно:

$('.container').on('click', '.button', function (){
        alert('click!');
    });

Всегда связывайте событие делегата с ближайшим статическим элементом, который будет содержать динамические элементы.

40 голосов
/ 19 февраля 2012

Хорошо, я решил свою проблему с помощью функции .on (), так как мне не хватало одного параметра.

вместо

$(".button").on("click", function() { } );

я использовал

$(".container").on("click", ".button", function() { } );
8 голосов
/ 03 апреля 2013

Вместо:

$(".button").on("click", function() { } );

Я использовал:

$(".container").on("click", ".button", function() { } );

Я использовал это, и это сработало.

3 голосов
/ 19 февраля 2012

Это то, что вы пытаетесь сделать? Обратите внимание, я ставлю $.on() на родителя, но выбираю .button для действия.

.on (события [, селектор] [, данные], обработчик (eventObject))

селектор Строка селектора для фильтрации потомков выбранного элементы, которые запускают событие. Если селектор нулевой или опущен, событие всегда срабатывает, когда достигает выбранного элемента.

http://api.jquery.com/on/

<div id="stuff">
    <button class="button">Click me!</button>
    <p>Stuff</p>
</div>

var $stuff = $('#stuff'),
    ajaxContent = $stuff.html();

$stuff.on('click', '.button', function(){
    $.get('/echo/html/', function(){
        $stuff.empty();
        console.log($stuff.html());
        alert($stuff.html()); // Look behind, #stuff is empty.
        $stuff.html(ajaxContent);
        console.log($stuff.html());
    });
});

http://jsfiddle.net/62uSU/1

Еще одна демонстрация:

var $stuff = $('#stuff'),
    ajaxContent = $stuff.html(),
    $ajaxContent,
    colors = ['blue','green','red'],
    color = 0;

$stuff.on('click', '.button', function(){
    $.get('/echo/html/', function(){
        color++;
        if (color == colors.length) color = 0;
        console.log($stuff.html());
        alert($stuff.html());
        $ajaxContent = $(ajaxContent);
        $stuff.append($ajaxContent).css('color', colors[color]);
        console.log($stuff.html());
    });
});

http://jsfiddle.net/62uSU/2/

...