предотвратить повторную инициализацию событий в плагине jquery tab (режим ajax) - PullRequest
0 голосов
/ 29 сентября 2010

Я надеюсь, что вы можете помочь мне с проблемой;Во-первых, пожалуйста, не беспокойтесь о моих языковых навыках, я из Германии и не говорю по-английски каждый день, к сожалению: - (

Я использую вкладки jquery в режиме AJAX и у меня есть некоторые проблемы, связанные ссобытия щелчка. Пример: я инициализирую на своей первой и второй вкладках такую ​​функцию нажатия на кнопку:

$(".new_message").live("click", function() { alert("test"); });

Теперь представьте себе следующее: пользователь нажимает на первую вкладку икнопка, помеченная классом "new_message", удерживает определенную функцию щелчка. До этого все в порядке, но при выборе второй вкладки, которая имеет ту же кнопку, возникает проблема: javascript предупреждает два раза "тест", но яЯ хотел бы получить его только один раз. Я много искал, чтобы решить эту проблему, все решения, которые я получил, заключались в использовании живой функции, но я так и сделал, и она не работает.

Есть ли возможность сделать эту работуДаже в вкладках ajax? Обратите внимание, что содержимое вкладки javascript не загружалось до тех пор, пока оно не было выбрано. Я не кэширую свои вкладки, поэтому содержимое tab срабатывает снова и снова (поэтому, если вы нажмете на вкладку 1, затем на вкладку 2 и снова на вкладку 1, скрипт трижды выдаст предупреждение «test») ...

Надеюсь, вы его получите, что угодно; o)Ура, бамбук

Ответы [ 2 ]

2 голосов
/ 29 сентября 2010

Вы можете просто проверить, связано ли событие уже, так как это живая привязка:

var bound = false; // this should exist on the containing page and not in each tab

Затем подключите его так:

$(function(){
    if (!bound)
    {
        $(".new_message").live("click", function() { alert("test"); });
        bound = true;
    }
});

Я столкнулся с проблемой при использовании ajax-интерфейса типа мастера, когда события jQuery live () становились связанными, связанными, а затем восстанавливались, когда вы переходили назад и вперед через мастера. Чтобы убедиться, что все живые события будут правильно установлены, вам нужно сначала вызвать метод die (), а затем выполнить повторную привязку.

$("#myClickableThing").die("click").live("click", function () {
    // do work
});

И чтобы добавить его в качестве новой функции jQuery, вы можете попробовать это:

jQuery.fn.resurrect = function (eventType, callback) {
    $(this).die(eventType).live(eventType, callback);
};

Теперь вы можете вызвать воскрешение следующим образом:

$("#myClickableThing").resurrect("click", function() { 
    // do work
});

Я написал в блоге именно об этой проблеме и создал небольшую вспомогательную функцию для ее решения.

0 голосов
/ 29 сентября 2010

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

Пример:

$('#tabs-container')
  .bind(
    'click',
    function(e){
      if($(e.target).is('.new_message')){
        alert('test');
      }
    }
  );
...