2010-12-08 5 views
9

Ich habe einen globalen Ajax-Fehlerhandler, der ausgeführt wird, obwohl der xhr.status 200 ist, xhr.statusText ist "OK" und xhr.responseText ist meine JSON-Zeichenfolge. Dies geschieht in Firefox und IE.

$.ajax({ 
    data: { 
     method: "getRequestDetails", 
     loggedInUsername: loggedInUsername, 
     search: search 
    }, 
    success: function(data){ 
     var arrayObject = eval("(" + data + ")")['DATA']; 
     if (arrayObject.length == 0){ 
      alert("That search term returned no results"); 
     } else { 
      callBeforeShow("Results"); 
      $.each(arrayObject, function(index, value){ 
       showJSON(value, "Results"); 
      }); 
      callAfterShow("Results"); 
     } 
    } 
}); 

$(document).ajaxError(function(event, XMLHttpRequest, ajaxOptions, thrownError){ 
    var errorMessage = "Ajax Error\n"; 
    errorMessage += "Type: " + ajaxOptions.type + "\n"; 
    errorMessage += "Requesting Page: " + ajaxOptions.url + "\n"; 
    errorMessage += "Status: " + XMLHttpRequest.status + " - " + XMLHttpRequest.statusText + "\n"; 
    errorMessage += "Error Thrown: " + thrownError 
    alert(errorMessage); 
}); 

In IE dies sagt, dass der XMLHttpRequest nicht bereit ist, und in Firefox gibt diese

"AJAX Fehler" "Typ: POST" "Anfordern Seite: something.CFC" „Status: 200 - OK“ "Fehler ausgelöst: undefined"

Also meine Arbeit um verwenden

$(document).ajaxComplete(function(event, XMLHttpRequest, ajaxOptions, errorThrown){ 
    if (XMLHttpRequest.status != 200){ 
     var errorMessage = "Ajax Error\n"; 
     errorMessage += "Type: " + ajaxOptions.type + "\n"; 
     errorMessage += "Requesting Page: " + ajaxOptions.url + "\n"; 
     errorMessage += "Status: " + XMLHttpRequest.status + " - " + XMLHttpRequest.statusText; 
     alert(errorMessage); 
    } 
}); 

BEARBEITEN * Dies passiert nur gelegentlich. Die meiste Zeit es funktioniert, aber manchmal läuft es $ .ajaxError() * EIDT

{"COLUMNS":["ID","SUMMARY_SPEC","TOTAL_EFFORT","EFFORT_HISTORY","LOG_HISTORY"],"DATA":[[816,"test only","2 Minutes - Last Updated: 09\/12\/2010",{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","EFFORT_DATE","EFFORT_DAYS","EFFORT_HRS","EFFORT_MINS","EFFORT_TOT_HRS"],"DATA":[[816,496,"ruhlet","Tim Ruhle","December, 09 2010 00:00:00",0,0,1,0.0167],[816,497,"ruhlet","Tim Ruhle","December, 08 2010 00:00:00",0,0,1,0.0167]]},{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","LOG_DT","LOG_ENTRY"],"DATA":[]}]]}{"COLUMNS":["ID","SUMMARY_SPEC","TOTAL_EFFORT","EFFORT_HISTORY","LOG_HISTORY"],"DATA":[[816,"test only","2 Minutes - Last Updated: 09\/12\/2010",{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","EFFORT_DATE","EFFORT_DAYS","EFFORT_HRS","EFFORT_MINS","EFFORT_TOT_HRS"],"DATA":[[816,496,"ruhlet","Tim Ruhle","December, 09 2010 00:00:00",0,0,1,0.0167],[816,497,"ruhlet","Tim Ruhle","December, 08 2010 00:00:00",0,0,1,0.0167]]},{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","LOG_DT","LOG_ENTRY"],"DATA":[]}]]}{"COLUMNS":["ID","SUMMARY_SPEC","TOTAL_EFFORT","EFFORT_HISTORY","LOG_HISTORY"],"DATA":[[816,"test only","2 Minutes - Last Updated: 09\/12\/2010",{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","EFFORT_DATE","EFFORT_DAYS","EFFORT_HRS","EFFORT_MINS","EFFORT_TOT_HRS"],"DATA":[[816,496,"ruhlet","Tim Ruhle","December, 09 2010 00:00:00",0,0,1,0.0167],[816,497,"ruhlet","Tim Ruhle","December, 08 2010 00:00:00",0,0,1,0.0167]]},{"COLUMNS":["CC_ID","RECORD_ID","USER_ID","USER_NAME","LOG_DT","LOG_ENTRY"],"DATA":[]}]]} 

Die neueste Version von Firebug erkennt sie als json.

Antwort

1

ah, gut nach Tagen der Suche habe ich verschiedene Einstellungen in $ .ajaxSetup() auskommentiert. Es endete damit, dass ich eine Auszeit gesetzt hatte. Wenn nur eine bessere Fehlermeldung gegeben wäre. Danke für all die Hilfe Jungs, wäre nicht hier, wenn nicht für Sie. Sie stehen alle auf Stimmen !!!

+0

Haben Sie herausgefunden, warum ein Timeout das verursacht? Haben Sie Ihren ursprünglichen ajaxComplete-Handler beibehalten oder eine elegantere Methode gefunden? Ich bekomme auch dieses Problem, und ich verstehe es nicht. – CarlG

+0

Nein, ich habe es nicht herausgefunden. Ich war bereits hinter dem Zeitplan und versuchte es zu beheben, also akzeptierte ich einfach, dass es funktionierte und ich würde wahrscheinlich nie wissen warum. Es tut uns leid –

3

Könnte es sein, dass Sie $.ajax nicht sagen, dass Sie JSON vom Server erwarten? Versuchen Sie, die dataType Option ‚json‘ Einstellung:

$.ajax({ 
    dataType: 'json', 
    data: { ... 
+0

Ich habe wie 10 andere Ajax Aufrufe auf der Seite, einige mit Plain und andere mit Json und sie funktionieren gut ohne diese Erklärung. Aber ich werde es auf jeden Fall versuchen. –

+0

Jetzt macht Firebug dies. Uncaught-Ausnahme: [Ausnahme ... "Komponente hat Fehlercode zurückgegeben: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [NsIXMLHttpRequest.status]" Nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" Speicherort: "JS-Rahmen :: MyUrl.js :: Anonymous :: Zeile 146" Daten: nein]. Zeile 146 ist Zeile 4 in $.ajaxError() –

5

First off, würde ich sehr empfehlen Notwasserung den eval Teil zugunsten von $ .parseJson oder die dataType:'json' Ajax-Option, die automatisch die Parsen Griffe (aus Gründen der Leistung und Sicherheit unter anderem). Wenn Sie weiterhin eval verwenden, wickeln Sie es zumindest einen Versuch zu fangen.

Ich bin nicht ganz sicher von jedem Fall, in dem ajaxError aufgerufen wird, aber ich vermute (aufgrund der "Zufälligkeit" des Fehlers), dass es mit einem Fehler innerhalb der Erfolgsfunktion (wie eval aufgerufen wird) ungültiges Javascript, das Sie in Ihrer Antwort erhalten). Dies würde erklären, warum es aufgerufen wird, selbst wenn eine Antwort von 200 vorliegt.

tldr: Holen eval aus diesem success Rückruf und bestätigen, dass Ihre Antworten in der Tat gültig Json sind, wenn dieser Fehler auftritt.

+0

Dies ist in einem Arbeits-Intranet. Wir verwenden jQuery 1.3.2 und es könnte ein großer Aufwand sein, die neueste Version (die für $ .parseJson() benötigt wird) zu bekommen. Und ich könnte das Javascript JSON.parse() oder was auch immer es ist, nicht verwenden Wir verwenden IE7, das das JSON-Objekt nicht unterstützt. Der Fehler wird trotzdem vor dem EVAL ausgeführt. –

+6

Sie können die JSON-Bibliothek von Douglas Crockfords verwenden: http://www.json.org/js.html – jthompson

+1

Wenn Sie die Fehler, können Sie die JSON-Antwort enthalten, die Sie erhalten? Aufgrund der zufälligen Natur und Fehler, die Sie beschreiben, ich vermute, dass es etwas mit der tatsächlichen Antwort zu tun hat gesendet wird.Auch die Option dataType: 'json' ist in jQuery 1.3 verfügbar. 2. Ich würde sehr empfehlen, es zu verwenden. – nategood

Verwandte Themen