jquery ajax GET请求执行两次

我有以下ajax请求,只需点击一下button即可执行:

<a href="javascript:test()"><img src="css/images/test.png"></a> function test(){ console.debug("*"); $.ajax({ type: "GET", dataType: "json", url: '/path/to/url', success: function(data){ console.debug("**"); }, error: function(jqXHR, status, error){ console.debug("*** " + status + " : " + error + " : " + jqXHR.status); }, cache: false }); } 

请求响应大约需要30秒才能返回。 但是,请求由服务器接收并执行两次,正如apache日志所看到的那样。 请求的时间戳是30秒,但请求是相同的(例如?_ = 1363692320782)。 点击响应函数被调用一次,错误callback被调用一次(正好在初始请求后60秒),尽pipeapache响应是200。

这个问题已经在手机应用程序中的三星Galaxy S2,Android版本2.3.5被转载。

更新 – 从下面的评论添加Apache日志条目

 1.2.3.4 - - [19/Mar/2013:14:07:59 +0000] "GET /pcapi/records/dropbox/08342hjg9gpqm7g/?_=1363702072225 HTTP/1.1" 200 11139 "-" "Mozilla/5.0 (Linux; U; Android 2.3.5; en-gb; GT-I9100 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" 1.2.3.4 - - [19/Mar/2013:14:08:29 +0000] "GET /pcapi/records/dropbox/08342hjg9gpqm7g/?_=1363702072225 HTTP/1.1" 200 11139 "-" "Mozilla/5.0 (Linux; U; Android 2.3.5; en-gb; GT-I9100 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" 

更新 – adb logcat

 I/Web Console(16747): * at file:///android_asset/www/js/mobile.js:1769 I/Web Console(16747): *** error : : 0 at file:///android_asset/www/js/mobile.js:1779 

更新 – TCP / IP监视器

通过TCP / IP监视器发出请求会显示两个请求都以200响应发送。

Solutions Collecting From Web of "jquery ajax GET请求执行两次"

我在Android 2.3.5上运行我的应用程序时遇到了这个问题。 我只能断定webview在超时后重试请求。 我无法find影响超时时间的方法。

最后,我重写了代码,使得初始请求在服务器上分离出一个asynchronous进程,并立即返回。 然后,从页面上的setTimer,我将检查服务器进程的状态(再次,立即返回)。 当状态为“完成”时,页面将移动到下一步。

我希望有帮助。 我当然明白你对此的失望。 我花了一两天的时间与它斗争。

编辑:这可能是发送给我的asynchronous解决scheme的文章。 我相信这里所说的问题是一回事:

Android中的XmlHttpRequest发贴问题

如果你在这里定义的URLpathurl: '/path/to/url'是一个文件夹,而不是一个特定的文件,请尝试添加一个像这样的url: '/path/to/url/'的尾部的斜线。

当一个文件没有被指定时,会发生什么情况是Apache Web服务器用一个新的URL(尾部的斜线)发送一个301redirect到AJAX客户端,所以客户端向正确的URL发出一个新的请求。

看到类似的问题发布在这里: jQuery $ .ajax()执行两次?

请参阅Apache文档参考: http : //httpd.apache.org/docs/2.0/mod/mod_dir.html#directoryslash

怎么样使用beforeSend:complete: AND .ajaxSend() + ajaxSuccess() ,也尝试与cache: true

 $(document).ajaxSend(function (event, jqxhr, settings) { console.log("triggered ajaxSend !"); if ( submission_active == true ) { jqxhr.abort(); } submission_active = true; }); $(document).ajaxSuccess(function (event, xhr, settings) { console.log("triggered ajaxSuccess !"); submission_active = false; }); $.ajax({ type: "GET", dataType: "json", timeout: 30000, cache: false, url: '/path/to/url', success: function(data){ console.debug("**"); }, beforeSend: function(xhr, opts){ if(submission_active == true){ xhr.abort(); } submission_active = true; }, complete: function(){ submission_active = false; } error: function(jqXHR, status, error){ console.debug("*** " + status + " : " + error); } }); 

点击事件被触发两次。 以下代码修复了这个问题。

 $('.selector').unbind('click').bind('click', function () { //... // Ajax code //... }); 

我试过这个在我的手机网站开发唯一的问题是在我的forms,然后在我的JavaScript声明

 $("#button_submit").onclick(function(){ //ajax request here }); 

如果你使用的是Ajax,也不要忘了去除表单属性,如动作和方法

我希望它可以帮助你^ _ ^

  <a href="javascript:test()"> 

那是你的问题。 如果你要使用jQuery,使用他们的CSSselect器!!!!!!!! 该href:JavaScript的东西跨浏览器/设备越野车。

听起来更像事件传播的问题。 我看到了类似的症状(尽pipe在ios上),并且触发了“点击”事件的“触发事件”和“触发事件”。 你有没有尝试过这样的事情:

 $("a").click(function (e) { e.preventDefault(); alert('Clicked'); test(); }); 

希望这可以帮助!
干杯
JD

你面临的问题通常被称为“弹跳”,它也面临着电子开关,当你按下并释放一个button时,开关被触发两次,所以你需要为function设置一个延迟或者解除绑定点击完成。

你可以使用本·阿尔曼的油门脚本来消除你的点击,这是非常有用的,以防止发生多个阿贾克斯调用,结合延迟,你的问题应该是固定的

http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/

  var debounceClick = $.debounce(test, 1000); function test() { console.debug("*"); $.ajax({ type: "GET", dataType: "json", url: '/path/to/url', success: function(data){ console.debug("**"); }, error: function(jqXHR, status, error){ console.debug("*** " + status + " : " + error + " : " + jqXHR.status); }, cache: false }); } 

现在从链接调用debounceClick函数来解决你的问题。

另外,你也可以使用简单的普通JavaScript而不用油门插件来实现你的结果:

  var timeout; function test(){ console.debug("*"); $.ajax({ type: "GET", dataType: "json", url: '/path/to/url', success: function(data){ console.debug("**"); }, error: function(jqXHR, status, error){ console.debug("*** " + status + " : " + error + " : " + jqXHR.status); }, cache: false }); } function click() { if(timeout) { clearTimeout(timeout); } timeout = setTimeout(test, 1000); } 

在这个例子中,将click()函数绑定到你的链接。

我面临同样的问题,我是提交button绑定点击事件和Ajax运行两次。 而不是绑定一个事件,我用下面的buttononClick方法

 <button onclick"myProcess()"></button> 

它解决了我的问题。