Jquery ajax失败后重新绑定当前函数?

Jquery ajax失败后重新绑定当前函数?,jquery,ajax,json,live,Jquery,Ajax,Json,Live,我有一个使用live()绑定的函数: 我使用.die()在第一次单击时从元素中解除所有实时事件的绑定,但是如果AJAX请求返回错误代码(=1.7 //$('.wink back').live(“单击”,函数(事件){//jQuery=1.7 //$this.die(“click”);//jQuery

我有一个使用live()绑定的函数:

我使用.die()在第一次单击时从元素中解除所有实时事件的绑定,但是如果AJAX请求返回错误代码(<200),我需要做的是将整个代码块重新绑定到该元素

我将如何做到这一点?我基本上需要恢复绑定

问候,,
巴里

可以说,你似乎在过早地死去。一旦确定Ajax请求实际上已经成功,删除click事件绑定是否更有意义

$('.wink-back').live( "click", function( event ) {
    var uid = $(this).attr("rel");

    $.ajax({
        type    : "POST",
        cache   : false,
        data    : "data[Wink][recipient_id]=" + uid,
        url     : "/winks/sendWink",
        success : function( data ) {        


            $(this).die( "click" ).addClass("disabled");
            var newData = JSON.parse( data );



        }

    });     
});
考虑到您的问题本质上是希望在单击链接后阻止多个Ajax请求,jQuery提供了许多全局Ajax事件处理程序,可用于任何Ajax操作

关于您的具体问题,您希望在启动新的Ajax请求时禁用单击链接,并且假设成功,删除该元素的单击事件绑定

这是你要怎么做的

首先,我们将为任何Ajax请求设置两个全局事件侦听器,以便在操作完成之前禁用UI;一个用于Ajax请求启动时,另一个用于Ajax请求完成时:

$('#my-Element-Containing-All-WinkBack-Class-Elements').ajaxStart(function() {
  // Show an overlay over the whole page or
  // over your element containing your links with
  // opacity 0 so that any elements cannot be clicked.
}).ajaxStop(function() {
  // Remove the overlay
});
所以我们在这里做的是监听任何启动请求。一开始,我们就使用CSS沿着以下几行添加透明覆盖,以防止在页面(或其他页面区域-根据需要)上再次单击:

.page-overlay {
    z-index: 10000;
    filter: alpha(opacity=0); /*older IE*/
    filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0); /* IE */
    -khtml-opacity: 0;   /*older Safari*/
    opacity: 0;   /*supported by current Mozilla, Safari, and Opera*/
    position: absolute; top:0; left:0; width:100%; height:100%; color:#FFFFFF; text-align:center; vertical-align:middle;
}
请求完成后,通过在.ajaxStop()方法中删除此覆盖,您的页面将重新启用


您的实际点击事件绑定得到了我建议的处理。

编辑从jQuery 1.7开始,建议使用
.on()
对事件做出反应


在确定不再需要绑定之前,不要删除它们

$('.wink-back').on("click", function( event ) {      // jQuery >= 1.7
// $('.wink-back').live("click", function( event ) { // jQuery <  1.7
    var $this = $(this);
    var uid = $this.attr("rel");

    if (!$this.hasClass("disabled")) {
      $this.addClass("disabled");

      $.ajax({
        type    : "POST",
        cache   : false,
        data    : "data[Wink][recipient_id]=" + uid,
        url     : "/winks/sendWink",
        success : function( data ) {        
            var newData = JSON.parse( data );

            if ( newData.Message.code == 200 ) { // success
                $this.off("click");     // jQuery >= 1.7
                // $this.die("click");  // jQuery <  1.7
            } else {
                $this.removeClass("disabled");
            }
        }
      });
    }     
});
$('.wink back')。在(“单击”)上,函数(事件){//jQuery>=1.7
//$('.wink back').live(“单击”,函数(事件){//jQuery<1.7
var$this=$(this);
var uid=$this.attr(“rel”);
如果(!$this.hasClass(“禁用”)){
$this.addClass(“禁用”);
$.ajax({
类型:“POST”,
cache:false,
数据:“数据[Wink][recipient_id]=”+uid,
url:“/winks/sendWink”,
成功:函数(数据){
var newData=JSON.parse(数据);
如果(newData.Message.code==200){//success
$this.off(“单击”);//jQuery>=1.7
//$this.die(“click”);//jQuery<1.7
}否则{
$this.removeClass(“禁用”);
}
}
});
}     
});

使用下面的函数来防止多个ajax请求

jQuery('a.' + selectedTab + '-list-page').die();

jQuery('a.' + selectedTab + '-list-page').live('click', function() {

从某种意义上说是的,但我的目标是防止通过单击事件提交多个AJAX。有没有更好的方法来防止多个“单击”呢?我想知道:假设AJAX请求需要一段时间:如果我滚动页面,在启动覆盖时,我不能仍然单击视口外的链接吗?还有,为什么预处理会很好仅仅因为Ajax请求正在运行就释放任何用户与页面的交互?异步性的全部要点是,我可以在后台发生某些事情时继续进行操作。为了达到相同的效果,我还可以设置async=false,并在请求运行时冻结页面。实际上-这不会总是失败吗?$this.addClass(“disabled”);将需要位于if块内。
jQuery('a.' + selectedTab + '-list-page').die();

jQuery('a.' + selectedTab + '-list-page').live('click', function() {