JQuery - AJAX |Два ajax поста на одной странице |После / POST проблема / вопрос - PullRequest
1 голос
/ 15 февраля 2011

Я нахожусь в странной ситуации. И я не могу решить это логически.

Проблема: (все должно быть сделано без обновления страницы!):

  • jQuery создает AJAX POST на сервере, чтобы добавить контент в базу данных. (Напишите что-нибудь.) ... (и это работает!)
  • Теперь этот элемент отображается (и имеет кнопку удаления)
  • Теперь, если я щелкну на ЭТОМ элементе, чтобы удалить его (создание нового JQuery AJAX POST) ...
  • ничего не происходит

Есть ли у AJAX ограничения, или я должен что-то проверить / отредактировать / узнать?

Firebug возвращает этот новый элемент и осматривает его - я должен быть в состоянии удалить его при создании. (Удаление работает только после обновления страницы.)

Пожалуйста, помогите!

EDIT.1: УДАЛЕНА ССЫЛКА.

EDIT.2: вот старый (ошибочный) код: (Все в функции «готово к документу»)

//////////// COMMON: $ ('. list> *'). addClass ('delete'); var valDel = 0; $ ('. delete'). attr ('value', function () {valDel ++; return + valDel;});

/////////////// WRITE:

$(function() {
    $("form.form #submit_btn").click(function() {

    //SOMETHING ON CLICK....+

        var name = $('#name').val();  
        var comment = $('#comment').val();
        var email = $('#email').val();

        var i = 0;
    $.ajax({
        type: "POST",
        data: "ime="+ime+"&komentar="+komentar+"&email="+email,
        cache: false,
        success: function(){

        //SOMETHING ON SUCCESS....+

            $('.list >*').addClass('delete');
            $('.delete').attr('value', function() {i++;    return ''+i;}); // FIX: add again incremented values

        }
    });
    return false;
    });
}); 
/////////////////////// DELETE:


$(function() {
    $(".delete").click(function() {    // THE FIX: ...).live('click', function(){...
        $(this).addClass('toBeDeleted');
        var valx = $(this).attr("value");
        var string = 'valx='+ valx;

        $.ajax({
            type: "POST",
            data: string,
            cache: false,
            success: function(){

            $('.toBeDeleted').hide( function() { 
                $(this).remove();
                var reValDel = 0;$('.list >*').attr('value', function() {reValDel++;    return +reValDel;});
            });

          }
         });
        return false;
    });
});

Ответы [ 5 ]

7 голосов
/ 15 февраля 2011

Я подозреваю, что когда вы динамически добавляете элементы dom после создания нового элемента, обработчики событий click не добавляются.Вы должны использовать jQuery 'live', чтобы привязать события кликов к элементам.

При просмотре вашего источника вы должны изменить это:

$(".delete").click(function() {...

на

$(".delete").live("click", function() {...
1 голос
/ 15 февраля 2011

Вы можете использовать .live() или .delegate() для достижения желаемого эффекта. делегат - это отличный способ справиться с подобными вещами, поскольку он уменьшает активное число прослушивателей событий на странице.

1 голос
/ 15 февраля 2011

Я вижу по вашему коду, вы звоните $(".delete").click(function() {...}); только один раз. Когда вы используете селектор типа $(".delete"), вы получаете коллекцию подходящих объектов. Если вы добавляете новый соответствующий объект, вы должны снова запустить $(".delete").click(function() {...});, чтобы обновить коллекцию объекта, к которому вы привязываете событие click() ... или вы можете слушать всех остальных и использовать .live()

jQuery live ()

Этот метод является разновидностью базовый метод .bind () для прикрепления обработчики событий для элементов. когда .bind () называется, элементы, которые объект jQuery ссылается на обработчик прилагается; элементы, которые получают введено позже нет, поэтому они будут потребовать еще один вызов .bind (). За Например, рассмотрим HTML:

<body>
  <div class="clickme">
    Click here
  </div>
</body>

Чтобы привязать простой обработчик кликов к этому элемент:

$('.clickme').bind('click', function() {
  // Bound handler called.
});

Когда элемент нажимается, обработчик называется. Однако предположим, что после этого другой элемент добавлено:

$('body').append('<div class="clickme">Another target</div>');

Этот новый элемент также соответствует селектор .clickme, но так как это было добавлено после вызова .bind (), клики по нему ничего не сделают.

Метод .live () обеспечивает альтернатива этому поведению. Связывать обработчик кликов для целевого элемента используя этот метод:

$('.clickme').live('click', function() {
  // Live handler called.
});

А потом добавить новый элемент:

$('body').append('<div class="clickme">Another target</div>');

Затем щелчок по новому элементу также вызовет обработчик.

Чтобы отсоединить обработчики кликов от всех, которые были связаны с помощью .live (), используйте метод .die ():

$('.clickme').die('click');
1 голос
/ 15 февраля 2011

Как вы связываете событие click с кнопкой? Если вы не используете функцию jquery live, вам нужно будет перепривязать событие click. Активное событие будет связывать обработчик кликов со всеми существующими и будущими элементами на странице. http://api.jquery.com/live/

0 голосов
/ 15 февраля 2011

Вы пытаетесь использовать функцию .click() для элемента, который был только что добавлен в DOM при первом вызове Ajax?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...