jquery ajax GET请求执行两次

时间:2013-03-19 12:33:08

标签: android jquery cordova jquery-mobile samsung-mobile

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

<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。

这个问题已经在三星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响应发送的。

9 个答案:

答案 0 :(得分: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

答案 1 :(得分:6)

我在Android 2.3.5上运行的应用程序遇到了这个问题。我只能得出结论,webview在超时后重试请求。我找不到影响超时持续时间的方法。

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

我希望有所帮助。我当然明白你对此感到沮丧。我花了几天时间与它斗争。

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

XmlHttpRequest double posting issue in Android

答案 2 :(得分: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);
    }
});

答案 3 :(得分:2)

我在我的移动网站上尝试了这个,开发唯一的问题是在我的表单中然后在我的javascript上我声明了

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

如果您使用的是ajax

,也不要忘记删除表单属性,如action和method

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

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

这就是你的问题。如果你打算使用jquery,请使用他们的css选择器!!!!!!!!那个href:javascript的东西在浏览器/设备上都是错误的。

答案 6 :(得分:1)

听起来更像是事件传播的问题。我看到了类似的症状(虽然在ios上),它归结为'touchstart'和'touchend'事件都引发了'点击'事件。你尝试过这样的事情:

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

希望这有帮助!
干杯
JD

答案 7 :(得分:0)

您面临的问题通常被称为“弹跳”,它也面临电子开关,当您按下并释放按钮时,开关被触发两次,因此您需要设置延迟功能或取消绑定完成点击后。

你可以使用Ben 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);
            }

在此示例中,将click()函数绑定到链接。

答案 8 :(得分:0)

我遇到了同样的问题,我在提交按钮上绑定了click事件,ajax运行了两次。 我没有绑定事件,而是在按钮上使用了onClick方法,如下所示

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

它解决了我的问题。

相关问题