2010-10-13 66 views
2
$(document).ready(function() { 
    $('.raj').click(function() { 
     if (!$(this).hasClass('already')) { 

      $('.infos').html(''); 

      $('.infos').hide("fast"); 

      $.ajax({ 
       type: "POST", 
       dataType: "json", 
       url: "ggg/hhh/rrr.php", 
       success: function (msg) { 
        $('.infos').html(msg['ats']); 
        arr = msg['valid']; 
       } 
      }); 

      $('.infos').show("slow"); 

      if (arr == 1) { 
       $(this).css("cursor", "default"); 
       $(this).addClass('already'); 
       $(this).animate({ 
        opacity: 0.1 
       }, 1000); 
      } 
     } 
    }) 
}) 

当我点击类raj(它是一个图像)的元素,没有任何反应。只有第二次点击后,我的事件才会发生。这是为什么发生?为什么我的活动不是第一次开火?

编辑: 这部分F * cked起来:

if(arr == 1) 
{ 
    $(this).css("cursor", "default"); 
    $(this).addClass('already'); 
    $(this).animate({ 
     opacity: 0.1 
    }, 1000); 
} 

msg['valid']真的是始终为1,所以我不明白这一点。

回答

4

我想知道不应该是这样吗?

$(document).ready(function() { 
    $('.raj').click(function(){ 
     var thisObj = $(this); 
     if(!$(this).hasClass('already')) 
     { 
      $('.infos').html(''); 
      $('.infos').hide("fast"); 
      $.ajax({ 
       type: "POST", 
       dataType: "json", 
       url: "ggg/hhh/rrr.php", 
       success: function(msg) { 
        $('.infos').html(msg['ats']); 
        arr = msg['valid']; 
        $('.infos').show("slow"); 

        if(arr == 1) { 
         thisObj.css("cursor", "default"); 
         thisObj.addClass('already'); 
         thisObj.animate({ 
          opacity: 0.1 
         }, 1000); 
        } 
       } 
      });   

     } 
    })    
}) 

看起来好像是因为某种难以理解的记忆,它被放错了位置。

编辑:

附加信息:ajax调用是异步的。这意味着,第一次没有将arr设置为1,但第二次是因为回调已经触发(我唯一的解释是这样)

+0

试试吧,但是结果的处理必须在ajax调用返回在结果实际完成前你已经检查过结果 – Vinzenz 2010-10-13 21:42:53

+0

@Vinzenz:为什么这里不行'$(this)',我们必须使用'thisObj'? – 2010-10-13 21:44:57

+1

+1另一件需要记住的事情是'$ .ajax'有一个'context:'属性,你可以在回调中设置'this'的值,所以你可以添加'context:this',让'this'引用回调中的元素。 – user113716 2010-10-13 21:48:38

1

尝试运行您的AJAX回调(成功函数)

+0

这是怎么回事?!?!它适用于arr = 1,而不是arr == 1。怎么会这样?!真的,也许我死了? – 2010-10-13 21:31:30

+1

如果arr为1,则'arr == 1'为true,否则为false。 'arr = 1'总是如此。 – Quentin 2010-10-13 21:34:30

1

你知道你的“ARR”在岗位设置功能里面,如果(ARR == 1)语句,你测试之后执行。 ...

您的ajax-request不是同步的,您只配置您想要执行ajax-request的浏览器,但您永远不知道它何时执行。

这就是为什么它第二次工作,从那时起,ajax-request已经被执行。

+0

那我该如何检查?如果我写'if(arr = 1)'not'if(arr = 2'? – 2010-10-13 21:34:41

+0

with arr = 1,你将变量arr设置为1,如果你设置为1,则测试arr == 1。 – some 2010-10-13 21:37:22

+0

你应该将测试移到成功函数中,就像Vinzenz在他的回复中写的那样。这是你第一次测试msg [“valid”] – some 2010-10-13 21:44:43

0

在发送Ajax请求之后,所有从$('.infos').show("slow");开始,但之前已收到回应,因此之前成功功能已运行。

这意味着arr不是第一次设置,并且只是第二次设置,因为您已将其设置为全局设置。

有你需要的响应来从服务器返回的数据要发生的一切发生成功的功能,不要忘记使用var关键字,让您的局部变量。

-1

最好的办法是有萤火虫,并有断点并检查流量。 你可以轻松解决这个方法。

如果这不起作用,请尝试使用live进行点击操作,这样就不会有任何绑定问题。

+2

手动移动引入的延迟可能会使响应时间回来,所以全局将被设置,并且脚本将神秘地开始工作。使用'live'设置点击处理程序也无济于事,因为没有HTML被覆盖,并且脚本在第二次尝试时工作(如果它第一次工作并且此后失败,则'live'更可能是解决方案) – Quentin 2010-10-13 21:38:59

+1

那么插入两条警报消息就会显示出来。第一个就在条件(arr == 1)之前,第二个在ajax调用之前。你会看到他们被调用的顺序错误,这会使它显而易见,为什么它不起作用 – Vinzenz 2010-10-13 21:46:19

0

您应该将您的f-cked部分添加到AJAX请求的'success'属性中。另一方面,arr等于0第一次。

 var that = $(this); 

     $.ajax({ 
      type: "POST", 
      dataType: "json", 
      url: "ggg/hhh/rrr.php", 
      success: function (msg) { 
       $('.infos').html(msg['ats']); 
       arr = msg['valid']; 

       $('.infos').show("slow"); 

       if (arr == 1) { 
        that.css("cursor", "default"); 
        that.addClass('already'); 
        that.animate({ 
        opacity: 0.1 
        }, 1000); 
       } 

      } 
     }); 
相关问题