2012-03-14 73 views
0
触发Ajax调用越来越元

可能重复:
How to know which element in body triggered AJAX request in jQuery从全球jQuery的处理程序

是否有可能得到触发从jQuery的全球处理器,即Ajax调用的元素。 $(document).ajaxSend和$(document).ajaxComplete事件?所以我只能从这两个位置处理禁用/启用按钮。我目前只是禁用正在执行该按钮的onclick事件调用的按钮,然后在调用完成时将其重新启用。

但我越来越懒,想找一个更“优雅”的方法。我可以从FF中的ajaxSend中看到event.target.activeElement,但在Chrome中它不起作用。

更新:我基本上只想从2个位置做到这一点,而不是每次我想让按钮正确处理ajax调用时添加额外的代码。

+0

@Matt应该取消删除他的答案 - 这是正确的! – Alnitak 2012-03-14 16:26:28

+0

还有什么其他答案? – sean 2012-03-14 16:31:10

+0

啊,你不能看到它,因为你的代表太低。 – Alnitak 2012-03-14 16:33:36

回答

0

只有事件处理程序函数根据提供给它的第一个参数知道哪个事件和元素触发了它。

如果该处理程序随后启动了AJAX调用,那么要知道为什么会发生此调用的唯一方法是自行传递事件和元素信息。

考虑您的使用情况下,代码禁用按钮,然后重新启用它再也不艰巨:

$('#button').on('click', function() { 
    var self = this; 

    self.disabled = true; 
    $.ajax(...) 
    .done(function() { 
     self.disabled = false; 
    } 
}); 

,这将是易于重构,如果需要的。

+0

嗯,FF下的event.target.activeElement在$(document).ajaxSend()中实际上指向触发该调用的元素,但不包含指向body的IE和Chrome – sean 2012-03-14 16:51:58

0

最近我得到的是设置上下文进行Ajax调用

$.ajax({ 
    context: this, 
}); 

其中$(这)实际上是从哪里AJAX调用,并且然后通过访问此背景下按钮点击事件的按钮时从ajaxSend和ajaxComplete

$(document).ajaxSend(function (event, request, settings) { 
    if (settings.context != undefined && 
     settings.context.length && 
     settings.context[0].nodeType) { 
     $(settings.context).attr("disabled", true); 
    } 
}); 

设置的包装将是

$.fn.extend({ 
     post: function (url, data, callback, type) { 
      if (jQuery.isFunction(data)) { 
       type = type || callback; 
       callback = data; 
       data = undefined; 
      } 

      return jQuery.ajax({ 
       type: 'post', 
       url: url, 
       data: data, 
       success: callback, 
       dataType: type, 
       context: this.length == 0? undefined:this 
      }); 
     } 
    }); 

,现在我可以调用$(button).post(url,callback)。不应太难替换所有现有的电话。 :)