2012-10-29 67 views
0

好的。這幾天讓我感到沮喪。我確信我是個白癡,面前有一個解決方案,但這是我的問題。跨瀏覽器AJAX和setTimeout()在IE中可用,但在Chrome/Firefox中失敗

當按下保存按鈕時,我有一系列AJAX調用來處理和保存網頁中的數據。這在IE中工作了很多年(在我被僱用之前已經設置好了)並且沒有任何問題。我們現在需要支持多種瀏覽器,即IE,Firefox,Chrome和Safari。

我看時,我嘗試按在Firebug保存按鈕是我得到的第一個AJAX調用,我得到的200 OK響應,並參加了毫秒的時間,但是它使紡紗:

Continues to spin forever
17秒是因爲我跨過服務器端代碼。

AJAX成功處理程序方法從來沒有被調用,整個事情崩潰了。我嘗試了幾種不同的方法,但我沒有發現它們的差異。 這是原始代碼。

編輯5: 這裏是更新的代碼。我簡化了它並取出了Step()方法和所有超時。這只是導致問題的AJAX調用。

function SubmitForm() { 
     $.blockUI({ message: waitMessage, css: { padding: 5} }); 

     var settingsXml = GetSettingsXml(); 
     ajaxParameters = "customerId:'" + customerId + "', connectionId:" + connectionId + ", settingsXml:'" + settingsXml + "', securityToken:'" + securityToken + "'"; 

     AjaxCall("EmailMarketingSettings.aspx", "Validate", ajaxParameters, function (result) { 
      alert("It works!") 
     }, function (result) { 
      alert("It's broken!"); 
     }); 
    } 

Validate()將使其對return語句,但代碼不會返回到客戶端的成功方法。

我錯過了什麼?編輯: 這是請求的AjaxCall方法。

function AjaxCall(pageName, methodName, parameters, onSuccessCallback, onFailureCallback) { 
    $.ajax({ 
     type: "POST", 
     url: pageName + "/" + methodName, 
     data: "{" + parameters + "}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     timeout: 120000, 
     success: function (resp) { 
      result = resp.d; 
      if (result.Success) { 
       if (onSuccessCallback != null && typeof (onSuccessCallback) == "function") { 
        onSuccessCallback(result); 
       } else { 
        $.unblockUI(); 
       } 
      } else if (onFailureCallback != null && typeof (onFailureCallback) == "function") { 
       onFailureCallback(result.Message); 
      } else { 
       alert(result.Message); 
       $.unblockUI(); 
      } 
     }, 
     error: function (req, errorType, errorThrown) { 
      var errorMessage = ""; 
      if (errorType == "timeout") { 
       errorMessage = "A timeout has occured" 
      } else if (req.responseText.length > 0) { 
       errorMessage = (req.responseText.substring(0, 1) == "{" ? eval("(" + req.responseText + ")").Message : req.responseText); 
      } else { 
       errorMessage = req.status; 
      } 
      if (onFailureCallback != null && typeof (onFailureCallback) == "function") { 
       onFailureCallback(errorMessage); 
      } else { 
       alert("An error has occured: " + errorMessage); 
       $.unblockUI(); 
      } 
     } 
    }); 
} 

編輯2: 一旦請求被髮送我打的錯誤處理程序之前,我的服務器端代碼都返回任何東西。 AJAX調用並不等待任何要返回的東西,它只是以「error」的errorType和errorThrown的空字符串出錯。

EDIT 3:從提琴手

火狐 原始數據:

HTTP/1.1 200 OK 緩存控制:私人,最大年齡= 0 內容類型:應用/ JSON;字符集= UTF-8 服務器:Microsoft-IIS/7.5 X供電,通過:ASP.NET 日期:星期三,2012年10月31 15點30分01秒GMT 的Content-Length:178

{「d 「:{」 __類型 「:」 CoreMotives.Web.MethodResult」, 「成功」:真, 「註釋」: 「」, 「消息」: 「」, 「ElapsedMilliseconds」:0 「子測試」:NULL, 「NextStepAdditionalParameters」日期null, 「值」:空}}

IE:

HTTP/1.1 200 OK 緩存控制:私人,最大年齡= 0 內容類型:應用/ JSON; charset = utf-8 服務器:Microsoft-IIS/7.5 X-Powered-By:ASP。NET 日期:星期三,2012年10月31 15點29分53秒GMT 的Content-Length:178

{ 「d」:{ 「__類型」: 「CoreMotives.Web.MethodResult」, 「成功」:真」評論「:」「,」消息「:」「,」ElapsedMilliseconds「:0,」SubTests「:null,」NextStepAdditionalParameters「:null,」Value「:null}}

雖然。 AJAX調用在服務器端代碼返回任何內容之前命中錯誤處理程序。

編輯4: 從Fiddler鏈接到.saz文件。 http://tinyurl.com/ckmatsk

那裏應該只有2個條目。

+0

所以它不是那麼跨瀏覽器,它是...? – Christian

+0

AjaxCall函數在哪裏?你在做同步aJAX嗎? –

+0

@dystroy我認爲它是'AjaxCall(...)'? – Christian

回答

0

哇...這一切努力的東西這麼愚蠢......

我想通了什麼我的問題是由於此主題:JQuery Ajax Firefox Error

的SubmitForm()方法未能返回false所以瀏覽器的默認行爲正在接管。只要我將onclick改爲:

onclick =「return SubmitForm();」

from:

onclick =「SubmitForm();」

並使SubmitForm()返回false。它開始在Chrome和Firefox上工作。

感謝任何人正在研究它。希望這可以幫助未來的人,雖然我懷疑有很多人和我一樣愚蠢......

相關問題