jQuery: отменить привязку события, связанного с live () - PullRequest
3 голосов
/ 21 февраля 2012

У меня есть неупорядоченный список с пятью элементами списка, каждый со ссылкой внутри него:

<ul>
    <li><a href="#">Link 1</a></li>
    <li><a href="#">Link 2</a></li>
    <li><a href="#">Link 3</a></li>
    <li><a href="#">Link 4</a></li>
    <li><a href="#">Link 5</a></li>
</ul>

Ссылки имеют функцию щелчка, связанную с live():

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

Внутри этой функции есть запрос get, который извлекает некоторую информацию.

Итак, когда щелкают по любой из этих ссылок, я хочу, чтобы клики по любой из других ссылок ничего не делали до тех пор, пока get не будет завершен. Я думал, что смогу сделать это, отменив событие click с помощью die():

$("a").live("click", function(){
    $("a").not(this).die("click");
    ...
});

Но это не работает. Я не получаю никаких ошибок - это просто не предотвращает событие click. Что я делаю не так?

1 Ответ

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

Проблема в том, что вы пытаетесь использовать live и die для другого набора элементов. Для правильного функционирования вы должны применить live и die к одному и тому же селектору / набору элементов.

$('a').live('click', function () { ... });
$('a').die(); // Ok! 
$('a').each(function () {
  $(this).die();  // Doesn't work.  
});

Звучит так, будто вы хотите временно отключить эту функцию, хотя до завершения определенной операции. Если это так, то вы можете сделать это с помощью переключателя handle / dontHandle.

(function() {
  var doHandle = true;
  $('a').live('click', function() {
    if (!doHandle) {
      return;
    }

    // Don't handle any events until the 'get' is complete
    doHandle = false;
    doGet(this, function() { 
      // Call back for when the get is complete.  Start handling again
      doHandle = true; 
    });
})();
...