我有以下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响应发送的。
答案 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,我将检查服务器进程的状态(再次,立即返回)。当状态为“完成”时,页面将继续进行下一步。
我希望有所帮助。我当然明白你对此感到沮丧。我花了几天时间与它斗争。
编辑:这可能是我向异步解决方案发送的文章。我相信这里陈述的问题是同一个:
答案 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>
它解决了我的问题。