2012-08-17 108 views
0

我正在使用ajax(通过jquery)与数据库交换数据。由于.ajaxcomplete函数总是基于带有选择器的jquery对象,还有其他方法可以检查这个显式ajax请求是否成功? .ajax不属于像div等任何特定的dom对象。我想在纯Javascript文件中使用Ajax。在这一刻不与特定的html页面关联。 (文档)$ .ajaxComplete()的作品,但不是我想要的jquery ajaxComplete()没有DOM对象

this.replot=function(){ 
    $(this).ajaxComplete(function() {alert('hallo');}); //here is my prob 
    var that=this; 
    var anfrage='anfrage= SELECT '+ this.xvaluecol+', '+this.y1valuecol+ ' FROM '+ this.tablename+ ' WHERE '+this.xvaluecol+' <=\'2010-11-06 15:00:00\' AND '+this.xvaluecol+' >=\'2010-11-06 07:00:00\''; 
    $.ajax({ 
     url : 'getdata.php', 
     dataType : 'json', 
     data: anfrage, 
     type : 'post', 
     success : function(json) { 
      if(String(json[0][0]).search('error')==-1) 
      { 
       that.data1=json; 
       that.xaxismin=json[0][0]; 
       that.xaxismax=json[json.length-1][0]; 
       that.yaxsismin=parseInt(that.find_min(json)); 
       that.yaxismax=parseInt(that.find_max(json)); 
       console.log(json); 
       console.log("yaxismin="+that.yaxismin); 
       console.log("yaxismax="+that.yaxismax); 
       //c=new Date((that.xaxismin)); 
       //c.setMinutes(c.getMinutes()+1441+60); 
       //(c.toLocaleString()); 
       that.update(); 
       $.jqplot(that.divid,[that.data1,that.data2],that.options).replot(); 
      } 
      else 
      { 
       alert('Plot nicht moeglich Fehlercode: '+json[0][1]); 
      } 
     } 
    }) 
} 
+0

它看起来并不像你在这里需要一个全球性的'ajaxComplete'处理程序。您是否尝试在调用'$ .ajax()'时指定'complete'处理程序? – 2012-08-17 09:51:47

回答

0

当定义你的Ajax调用,您可以指定一个“完整”的回调。在所有ajax调用和成功/错误回调之后调用此回调。

$.ajax({ 
    complete: function(){ alert('hello'); } 
}); 

$ .ajax从jQuery 1.5开始也返回promise对象。如果您在使用jQuery的更高版本,你也可以这样做:

var jqXhr = $.ajax({ ... your code }).always(function(){ alert('hello'); }); 
//Or 
jqXhr.always(function(){ alert('hello'); }); 
+0

好吧,我会试着用完整的标签。 thx – simmi91 2012-08-17 10:01:07

+0

使用完全回调的区别在于它现在只针对这个ajax调用。如果页面上有多个不同的ajax调用,则必须将其添加到它们中的每一个。 – Flater 2012-08-17 10:10:52

1

我倾向于使用ajaxStop超过ajaxComplete。不知道所有的差异,但我认为它是相似的。

您绑定ajaxComplete的元素并不重要。代码下面的两个片段做同样的:

$("#some_element").ajaxComplete(function() { 
    alert($(this).html()); 
}); 

$(document).ajaxComplete(function() { 
    alert($("#some_element").html()); 
}); 

所以我觉得你的问题可以通过使用$(document)来解决。

+0

第二次发生在每个ajax调用中,第一次只调用#some_element或不是? – simmi91 2012-08-17 09:59:51

+0

ajaxStop总是为注册的每个处理程序触发。放置文档或选择器无关紧要,它会在ajax调用后触发。 $(document)或$(selector)唯一真正的区别在于,使用'$(this)'来调用函数的上下文是不同的。我从来没有遇到任何其他根据事件绑定的原始选择器而改变的东西。 – Flater 2012-08-17 10:02:55

+0

Ajax调用永远不会被绑定到项目上,因为没有任何关于Ajax调用需要它与现有项目相关的信息。 – Flater 2012-08-17 10:04:58

0

您可以为jQuery中的ajax请求设置全局事件处理程序。你可以添加一个动态属性(比如'id')并标识一个特定的请求。

$.ajaxSetup({ 
    success: function(data, textStatus, jqXHR) { 
     console.log(jqXHR.id + " success"); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     console.log(jqXHR.id + " failed"); 
    }, 
    complete: function(jqXHR, textStatus, errorThrown) { 
     console.log(jqXHR.id + " completed"); 
    } 
}); 

$.ajax({ 
    url: "/" 
}).id = "request1"; 

$.ajax({ 
    url: "/" 
}).id = "request2"; 

$.ajax({ 
    url: "sdddqwdqwdqwd.com" 
}).id = "request3"; 

演示:http://jsfiddle.net/diode/3fX8b/