2013-03-19 130 views
16

我有一个是在按钮的点击执行以下的AJAX请求:jquery的AJAX GET请求执行两次

<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)。点击响应函数被调用一次,错误回调被调用一次(正好在初始请求后60秒),尽管apache响应是200.

此问题已在Samsung Galaxy S2,android版本2.3中复制。 5在phonegap应用程序中。

更新 - 加入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" 

更新 - 亚行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响应。

+0

浏览器日志怎么样,发生了多少请求? – Gajotres 2013-03-19 12:37:16

+0

@Gajotres在桌面浏览器中不会发生这种情况,在weire内部运行时只会看到一个请求。 – gmh04 2013-03-19 13:29:40

+0

你对我的猜测有多容易,并增加或减少服务器返回的时间大大超过或短于30秒?我很好奇你是否仍然会看到你得到的30秒超时。我问,因为30秒是各种事情的相当常见的默认超时值... – 2013-03-21 13:15:31

回答

6

我打这个确切的问题与Android 2.3.5运行我的应用。我只能断定webview在超时后重试请求。我无法找到影响超时时间的方法。

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

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

编辑:这可能是我向异步解决方案发送的文章。我相信,这里所说的问题是同一个:

XmlHttpRequest double posting issue in Android

+0

是的,在这个时候, '解决方案'是为了避免30秒的响应时间。无论是在您描述的方法还是等同的方法中,或者在重新修改服务器端应用程序。 – gmh04 2013-03-28 09:16:33

6

如果您在此处定义的网址路径url: '/path/to/url'是文件夹而不是特定文件,请尝试添加像这样的尾部斜杠url: '/path/to/url/'

未指定文件时会发生什么情况:Apache Web服务器使用新URL(带有斜线)向AJAX客户端发送301重定向,以便客户端向正确的URL发出新请求。

看到类似的问题在这里发布:jQuery $.ajax() executed twice?

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

+0

URL是我们的服务器端应用程序,而不是目录。 – gmh04 2013-03-19 13:33:54

+1

是的,我知道。我的意思是你的URL包含文件名?例如,您的URL是“www.domain.com/folder/index.php”还是“www.domain.com/folder /”?如果它不包含文件名,则尝试将追加斜杠附加到URL。 – 2013-03-19 13:37:16

+0

ok是的,该网址有一个斜线 – gmh04 2013-03-19 13:50:49

2

我已经试过这一个在我的移动网站开发的唯一的问题是在我的表格,然后在我的JavaScript的,我宣布

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

,也不要忘了删除窗体属性,如动作和方法,如果您正在使用AJAX

我希望它能帮助你^ _^

3

有关使用beforeSend:complete:.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); 
    } 
}); 
+0

如果超时时间少于响应时间,则会收到超时和单个请求。如果超时大于响应时间但小于响应时间* 2,则会收到超时和两个请求。如果超时大于响应时间* 2,则出现错误和两个请求。 – gmh04 2013-03-22 10:29:41

+0

注意:在第三种情况下,错误在初始请求后非常短的60秒。 – gmh04 2013-03-22 10:37:31

+0

不是很相关,但我会检查在任何情况下,您从/ path/to/url脚本获得的JSON响应都是有效的JSON,因为空响应不会被视为有效,并且会引发错误或可能会产生不可预测结果,至少要确保你发送并清空(但有效)JSON,如null或{}(返回'json_encode = array();'就可以满足PHP) – 2013-03-22 15:50:27

2

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

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

该事件已被触发一次 – gmh04 2013-03-26 09:50:18

0

你面对的通常被称为问题“反弹”它也面临着电子开关,当你按下和释放按钮开关被触发两次,所以你需要或者设定的延迟功能或取消绑定它,一旦你完成你的点击。

你可以使用本Alman的油门脚本去抖你的点击,它在防止发生多个AJAX调用非常有用的,结合起来,与延迟,你的问题应该是固定的

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); 
      } 

在本例中,点击()函数绑定到你的链接。

+0

但该事件仅发射一次 – gmh04 2013-03-26 09:49:47

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

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

1

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

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

希望这有助于!
欢呼
jd

0

我面临同样的问题,我绑定点击事件上的提交按钮和ajax运行两次。 代替结合的事件中,我使用onClick方法上的按钮等下面

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

和它解决了我的问题。