我遇到一个非常奇怪的问题,click会有两次连接动作我使用jquery的动态载入js代码功能,根据需要来加载相应的js程序通常这个载入工作算是正常,但有时却出现异常重新加载页面后,刚出问题的位置就不一定会再出问题总之很随机比如以下代码
当点击对应的对象时,会触发去加载js文件,并执行文件里的函数 $('#project').click(function(){
if(typeof(global_js.project) == 'undefined'){
$.ajax({type:'get',
url:"js/project.js",
dataType:'script',
cache:gim.ajax_cache,
success:function(){
global_js.project=true;
load_project_page();
}});
}else{
load_project_page();
}
});
这时,程序正常工作时,通过firebug看到的过程如图
当出现问题时,出现如下图也就是jquery会加载文件两次,但某个连接会被阻塞
从而导致ajax的success 操作无法处理使用POST或是GET的都有类似情况
如,以下代码是POST数据,有时也会出现提交两次情况
$('#project_business_ul .delete').livequery('click',function(){
d = new Object();
d.t = 'delete';
d.bid=bid;
d.pid=pid;
d.cost=cost;
d.name=escape(name);
$.ajax({type:'post',
url:"project_summary.php",
dataType:'json',
data:{d:JSON.stringify(d)},
success:function(h){
if(h != null) {
switch(h.php_status) {
  case 'ok':

break;
}
}
}});
});
如图
当然实现提交到服务器端的连接只有一次,毕竟对数据的写操作只有一次所以我觉得是jquery ajax的代码有点问题哪位有办法解决吗?

解决方案 »

  1.   

    如果你点快了,第一次的AJAX还没传回结果,又发出了一次AJAX请求,就会导致执行两次了。应该把global_js.project改为一个三态变量,比如0,1,2。global_js.project=0;.click事件里 :
    if(global_js.project==0) {global_js.project=1;AJAX请求(成功后设global_js.project=2并执行JS函数)}
    if(global_js.project==1) {return ;}//直接退出,等待AJAX结果返回。
    if(global_js.project==2) {直接执行JS函数};
      

  2.   

    当然,用布尔型也可以,'undefined'和FALSE,TRUE,也是三态。
      

  3.   

    异步是无顺序的,,你要做这种加载的效果,最好是Key/value成对的异步。
      

  4.   

    早上按您的思路改了下代码,通过故意的点两次(不是双击),从firebug的日志看,应该能解决“这个问题”,但整个网站可是有大几百个click事件触发的操作。如果个个这么改,感觉那太有点笨拙了。难道jquery没有专门处理防止这种意外的点两次的方法吗?
      

  5.   

    ajax请求的时候把按钮disabled="disabled"
    等到success之后才removeAttribute("disabled")
      

  6.   

    这个办法我想过但涉及到click事件的对象可能有a、div、li、tr、td、select、input:button 等等这些对button可以设置disabled属性,当为真时,click事件不再被触发而其它,我刚只试了div和li,即使设置了disabled属性click一样会被触发我在想是否可以在click事件触发后,禁止click事件,等ajax执行完了再启用click事件?在jquery的帮助里,有个bind和unbind,虽然我没写代码试验,但我觉得那是删除事件和添加事件如果我的click事件有alert('a')操作,删除后再加上还得一遍alert('a')有些麻烦不知道可否将事件的function复制到某处留着,ajax操作完之后再复制回来?又一个小发现,我匀速的点鼠标,看日志变化,发现我的鼠标有时会触发 dblclick事件也许就是它造成了我的问题
      

  7.   

    1."script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了"cache"参数。'''注意:'''在远程请求时(不在同一个域下),所有POST请求都将转为GET请求。(因为将使用DOM的script标签来加载)
    [查看你的get传值是不是超出的范围,get传值一般也就Max 1024]
    2.使用ansync:false;设置为同步
      

  8.   


    $('#page_data').click(function(){
    t=$(this);
    if(t.hasClass('disabled')) return;
    t.addClass('disabled');
    $.ajax({type:'post',
    url:"test/test1.php",
    success:function(h){
    t.removeClass('disabled');
    },
    error:function(){
    t.removeClass('disabled');
    }
    });
    });
    通过这个办法可以避免快速两次点击造成的问题,所有有必要判断的功能都得加这个处理代码。忘记说了,我的测试环境是 firefox 3.6.12从昨天到现在的测试过程中,我发好像只有firefox出现这种问题
    我又去看了看jquery的站点发现有1.4.4下载,就下载了个未压缩的版本在出现同样问题时,firebug提示了具体的行号xhr.send( noContent || s.data == null ? null : s.data ); 我就试试其他浏览器会不会有同样的问题opera,chrom,safari,ie ,测试点击了近百次,尚未出现问题,难道会是firefox的问题?
    回samxieyj5,谢谢回复
    cache的值默认是不缓存的,我加的变量也是false,待网站写完了,就可以改为true了
    我现在的问题,不仅是加载js时出现两次连接问题,连click这样的事件‘有时’也出现两次连接就是这个‘有时’,它是随机的现象,让人头痛
      

  9.   

    问题解决了,不是程序的问题,不是点快,不是鼠标的问题。是firefox插件的问题。