2013-08-07 32 views
0

我正在使用以下JS代碼來調用Web處理程序。 此代碼完全調用處理程序JUST IN IE而不是FF。Ajax方法在FF中不工作

$.ajax({ type: "GET", 
      url: "../MasterPages/AHMHandler.ashx?T=1", 
      dataType: "HTML", 
      success: function (msg) { 
       document.getElementsByName('cartId')[0].value = msg; 
       } 
      , 
      error: function (e) { 
       return false; 
      } 
     }); 
     Sleep(2000); 

我的代碼有什麼問題?

+0

什麼是錯誤的FF? – Amit

+0

我不明白爲什麼它不應該在FF中工作。請提供更多信息。 –

+0

艾米特,無論在Fiddler或FireBug中看到任何錯誤! 在IE中,它成功調用處理程序,並遍歷所有服務器端代碼並​​返回。 但是使用FF既不能處理處理程序也不能使用Ajax調用的錯誤函數。 有什麼想法? –

回答

1

在你的代碼中看到Sleep()的調用,以及你對alert()的評論,我會說你的問題是對Ajax代碼的工作方式缺乏瞭解。

當您創建一個Ajax調用時,它被異步調用。這意味着進行了調用,然後當前函數的其餘部分繼續運行而不停止等待ajax代碼運行。

ajax success函數將被最終調用,但只有當http請求完成時纔會被調用。 與此同時,您當前的功能將繼續運行

這裏的要點是,如果您在執行ajax調用後運行的相同函數中具有代碼,則不能依賴於給定的事件序列。

Sleep()可能會使它看起來工作,因爲一些瀏覽器可能會看到睡眠時間作爲運行ajax成功函數的機會,所以你的代碼似乎運行在正確的順序。把一個alert()更有可能使它工作,因爲alert()通常需要更多的時間才能被清除,所以ajax函數有更多的機會運行。

但是你不應該依靠他們中的任何一個來讓你的執行順序正確。

你應該做的是把你想要運行的代碼放在success函數中的ajax調用之後。這是確保在ajax調用完成後運行的唯一方法。

希望有所幫助。

[編輯] OP的評論後,進一步澄清:

Spudley,睡眠功能是我自己的功能,以保持瀏覽器被重定向像2秒。函數Sleep(毫秒){var start = new Date()。getTime(); for(var i = 0; i < 1e7; i ++){if((new Date()。getTime() - start)> milliseconds){break; }}}

只是ref,像這樣的睡眠函數在Javascript中是一個非常糟糕的主意。你應該使用setTimeout()來處理那種事情。

但是,重點仍然是相同的 - 你的代碼在$.ajax()之後運行,它將阻止你的ajax成功函數的執行。如果您之後正在做重定向,那麼成功功能可能永遠不會有機會運行。

alert()的確會使其工作,由於success功能會發現一個插槽中時,警報被清除,Sleep被調用之前運行,但你不應該依賴於這個。

答案保持不變:您應該在success函數中放入要在ajax調用之後運行的代碼。

這裏有一個你的代碼所做的更改:

$.ajax({ type: "GET", 
     url: "../MasterPages/AHMHandler.ashx?T=1", 
     dataType: "HTML", 
     success: function (msg) { 
      document.getElementsByName('cartId')[0].value = msg; 
      setTimeout(function() { //this instead of your Sleep function 
       //this is where you need to do your redirect, or whatever else you're doing after the ajax completes. 
      }, 2000); 
     } 
     , 
     error: function (e) { 
      return false; 
     } 
}); 
//don't put **any** code here after the ajax call! put it in the success function. 
+0

,感謝您的詳細回覆。 我認爲你的解決方案很好,但我的按鈕有PostBackUrl,我需要將表單發佈到支付網關。我可以在Javascript中自己而不是在我的按鈕中執行此回發嗎? –

+0

我真的不知道你的意思。我對你的按鈕的工作方式一無所知,因爲你沒有在問題中包含任何代碼。但是,如果它是'Sleep()'後面的代碼,那麼你就可以像以前一樣完成它了;我的答案只是改變你把它放在你的腳本中。 (如果你需要比這更詳細的答案,你可能會考慮把它作爲一個單獨的問題發佈到SO上,因爲它會離原來的問題太遠) – Spudley

+0

其實我已經發布了幾天前這樣的帖子,但是找不到任何解決方案。這裏是前一個: http://stackoverflow.com/questions/18064830/jquery-get-call-and-ajax-is-not-working-for-calling-ashx-handler –