2010-10-13 104 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); 
       } 

      } 
     }); 
相關問題