3

我有一个分配给日历上的点击事件的功能 - 我需要点击事件,live()因为当您在日历中切换月份时,标准.click()不会将自身绑定到新显示的日期 - 这会根据所选日历日期触发一些 AJAX。

在上一个请求完成之前,我需要防止用户触发更多 AJAX,因此通过立即取消绑定单击侦听器来实现这一点.die('click')。但是,我无法使 eventWrap 单击侦听器$('.eventWrap').live('click')从其自身内部再次恢复生机。

我的问题有解决方案吗?

$('.eventWrap').live('click', function() {
     $('.eventWrap').die('click');

     do ajax stuff

     //bring the .eventWrap click listener back to life
     //$(.eventWrap).live('click'); does not work as I had hoped

}
4

3 回答 3

3

您可以简单地在单击中添加一个类,并且仅在该类不存在时才执行 ajax

$('.eventWrap').live('click', function() {
    if( ! $('.waitingForAjax').length ){
        $('.eventWrap').addClass('waitingForAjax');

         do ajax stuff- use removeClass() within the ajax success handler
    } else{
        alert('Waiting for last ajax to complete');
    }   
});

使用on()而不是live()使用 jQuery 1.7

于 2012-06-04T04:16:04.233 回答
2

根据你的代码

由于 live 已被弃用,因此请使用.on().off()

$('.eventWrap').on('click', function() {
     $('.eventWrap').off('click');

});

要重新绑定该关闭事件,请使用

$('.eventWrap').on('click');

如果在页面加载后附加到 DOM

如果您.eventWrap在页面加载后附加到 dom,那么您应该参加委托事件

 $('#container').on('click', '.eventWrap',function() {
     $('#container').off('click', '.eventWrap');
});

取消绑定该事件

     $('#container').off('click', '.eventWrap');

这里#container指向.eventWrap页面加载时属于 DOM 的容器,您可能有一些其他选择器来指向.eventWrap.

但更好的是使用重构

    function offmyevent() {
       $('#container').off('click', '.evetWraooer');
    }


    function offmyevent() {
       $('#container').on('click', '.evetWraooer');
    }

   $('#container').on('click', '.eventWrap',function() {
         offmyevent();
         callMyAjax();
   });

所以对于ajax调用问题

function callMyAjax() {
  $.ajax({
      url: '',
      data: '',
      method: '...',
      success: function() {
         onmyevent(); // 
     }
  })
于 2012-06-04T04:09:37.020 回答
1

要打开on()off()事件处理程序,您还需要传递函数。

$("#container").on("click", ".eventWrap", eventWrapClicked);

function eventWrapClicked(){
    $("#container").off("click", ".eventWrap", eventWrapClicked);

   //Do your AJAX -- on success, reapply the clickhandler.
   // $("#container").on("click", ".eventWrap", eventWrapClicked);
}
于 2012-06-04T04:18:46.133 回答