[решено] JQuery, привязка к созданным объектам

Главные вкладки

Аватар пользователя Loac Loac 30 апреля 2009 в 12:11

Такая проблема. На страничку выводится таблица с товаром и ссылочками «удалить», напротив каждой позиции. Каждой ссылке вешается событие onClick, с помощью которого табличка перезагружается, а соответственно и ссылки. После этого они теряют привязки onClick и повторно уже не срабатывают.

Крутил-вертел по-разному и смотрел много примеров. Но что-то никак не выходит.

Примерно таким образом пытаюсь заставить Drupal заново вешать события:

Drupal.behaviors.cart = function (context) {
  $("a.cart-drop-link:not(.processed)", context).addClass('processed').click(function() {
      var mcart = function(data) {
        $('#cart_page_table').html(data.output);
      }

      $.ajax({
        type: 'POST',
        url: this.href,
        dataType: 'json',
        success: mcart,
        data: 'js=1'
      });
      return false;
    });
}

Комментарии

Аватар пользователя Anton L. Safin Anton L. Safin 30 апреля 2009 в 13:21

Суть в том, что после получения через AJAX создаются новые объекты, а .click у вас навешан только на старые. Выхода два - либо принудительно привязывать событие после загрузки данных AJAX через bind(), либо пользоваться специальными плагинами (такими, как livequery).

Аватар пользователя Loac Loac 30 апреля 2009 в 13:34

Хм. Я полагал, что Drupal.behaviors и служит для повторного навешивания.

С bind'om пробовал вот так:

Drupal.behaviors.cart = function (context) {
  $("a.cart-drop-link", context).bind("click", function() {
    ...
  });
}

Однако, выходят теже яйца.

Аватар пользователя Loac Loac 30 апреля 2009 в 13:40

2penexe, дай я тебя расцелую. Ты спас мой мозг Smile

В итоге конструкция выглядит вот так:

Drupal.behaviors.cart = function (context) {
  $("a.cart-drop-link", context).click(function() {
    var mcart = function(data) {
      Drupal.attachBehaviors($('#cart_page_table').html(data.output));
    }

    $.ajax({
      type: 'POST',
      url: this.href,
      dataType: 'json',
      success: mcart,
      data: 'js=1'
    });
    return false;
  });
}

Аватар пользователя gorr gorr 30 апреля 2009 в 13:49
function delete_from_cart() {
      $.ajax({
        type: 'POST',
        url: this.href,
        dataType: 'json',
        success: function(data) {
        $('#cart_page_table').html(data.output);
        $("a.cart-drop-link:not(.processed)", context).addClass('processed').click(delete_from_cart);
      },
        data: 'js=1'
      });
      return false;
}  
Drupal.behaviors.cart = function (context) {
  $("a.cart-drop-link:not(.processed)", context).addClass('processed').click(delete_from_cart);
}

а если так попробовать?

Аватар пользователя Loac Loac 30 апреля 2009 в 14:17

"gorr" wrote:
а если так попробовать?

Так не работает. Событие вешает, но после загрузки аяксом новой таблички, ссылки не реагируют.

Еще javascript выдает ошибку, что не знает, что такое context. Понятное дело, функция его не получает.

$("a.cart-drop-link:not(.processed)", context).addClass('processed').click(function() {

Если передать переменную, то перестает навешиваться даже в самом начале.