2008-10-14 6 views
6

Ich schreibe nur ein kleines Ajax-Framework für die Wiederverwendbarkeit in kleinen Projekten und ich habe ein Problem gefunden. Grundsätzlich bekomme ich beim Senden der Anfrage einen 'NS_ERROR_ILLEGAL_VALUE' Fehler und ich habe keine Ahnung was passiert.Wie umgehen Sie einen 'NS_ERROR_ILLEGAL_VALUE' Fehler mit Ajax?

Die HTML-Seite (getrimmt, sondern zeigt den Fehler)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title>Ajax Test</title> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

     <script type="text/javascript"> 

      var COMPLETE = 4; 
      var OK = 200; 

      function GetXMLHttpRequestObject() 
      { 
       var XMLHttpRequestObject = false; 

       if(window.XMLHttpRequest) 
       { 
        if(typeof XMLHttpRequest != 'undefined') 
        { 
         try 
         { 
          XMLHttpRequestObject = new XMLHttpRequest(); 
         } 
         catch (e) 
         { 
          XMLHttpRequestObject = false; 
         } 
        } 
       } 
       else if (window.ActiveXObject) 
       { 
        try 
        { 
         XMLHttpRequestObject = new ActiveXObject('Msxml2.XMLHTTP'); 
        } 
        catch (e) 
        { 
         try 
         { 
          XMLHttpRequestObject = new ActiveXObject('Microsoft.XMLHTTP'); 
         } 
         catch (e) 
         { 
          XMLHttpRequestObject = false; 
         } 
        } 
       } 
       else 
       { 
        XMLHttpRequestObject = false; 
       } 
       return XMLHttpRequestObject; 
      } 

      //The Main Ajax Object 
      function AjaxRequest(p_RequestMethod, p_DestinationURL) 
      { 
       this.XMLHttpRequestObject = GetXMLHttpRequestObject(); 

       this.RequestedMethod = p_RequestMethod; 
       this.DestinationURL = p_DestinationURL; 

       this.XMLHttpRequestObject.open(this.RequestMethod, this.DestinationURL); 

       this.OnStateChange = function(Callback) 
       { 
        this.XMLHttpRequestObject.onreadystatechange = Callback; 
       } 

       this.Send = function(p_Content) 
       { 
        this.XMLHttpRequestObject.send(p_Content); 
       } 

       this.GetState() 
       { 
        return this.XMLHttpRequestObject.readyState; 
       } 

       this.GetResponseText = function() 
       { 
        return this.XMLHttpRequestObject.responseText; 
       } 

       this.GetResponseStatus = function() 
       { 
        return this.XMLHttpRequestObject.status; 
       } 

       this.GetResponseStatusText = function() 
       { 
        return this.XMLHttpRequestObject.statusText; 
       } 
      } 

      var Request; 

      function GetData() 
      { 
       Request = new AjaxRequest('POST', 'http://www.kalekold.net/ajax/Ajax.php'); 
       Request.OnStateChange = StateChange; 
       Request.Send(); 
      } 

      function StateChange() 
      { 
       window.alert("State: " + Request.GetState()); 
       window.alert("Response: " + Request.GetResponseStatus()); 
       window.alert("Response Text: " + Request.GetResponseStatusText()); 

       if(Request.GetState() == COMPLETE && Request.GetResponseStatus() == OK) 
       { 
        Result = Request.GetResponseText(); 
        window.alert(Result); 
       } 
      } 
     </script> 

    </head> 
    <body> 
     <form> 
      <textarea name="TextArea" rows="10" cols="80"></textarea><br /> 
      <input type="button" value="Load" onClick="GetData();"> 
     </form> 
    </body> 
</html> 

Die PHP-Datei:

<?php 
$XML = <<< PROLOG 
<?xml version="1.0" encoding="iso-8859-1"?> 
PROLOG; 

$XML .= "<results>"; 
    $XML .= "<result>"; 
     $XML .= "<FirstName>Gary</FirstName>"; 
     $XML .= "<SecondName>Willoughby</SecondName>"; 
     $XML .= "<Age>35</Age>"; 
    $XML .= "</result>"; 
    $XML .= "<result>"; 
     $XML .= "<FirstName>Sara</FirstName>"; 
     $XML .= "<SecondName>Gostick</SecondName>"; 
     $XML .= "<Age>35</Age>"; 
    $XML .= "</result>"; 
$XML .= "</results>"; 

header("Content-Type: text/xml"); 
echo $XML; 
?> 

Der vollständige Fehler:

uncaught exception: [Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIXMLHttpRequest.open]" nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)" location: "JS frame :: http://www.kalekold.net/ajax/ :: AjaxRequest :: line 63" data: no] 

Line 0 

Ich kann einfach nicht sehen wo geht es schief, irgendwelche Ideen?

Antwort

6

Die Ausnahme "Komponente Fehlercode zurückgegeben: 0x80070057 (NS_ERROR_ILLEGAL_VALUE)" wird durch einen ungültigen Wert verursacht, der in den Aufruf der offenen Methode übergeben wird.

Blick durch Ihren Code fand ich falsch geschrieben:

 
this.RequestedMethod = p_RequestMethod; 
this.DestinationURL = p_DestinationURL; 

this.XMLHttpRequestObject.open(this.RequestMethod, this.DestinationURL); 

See this.RequestedMethod Eigenschaft auf p_RequestMethod gesetzt und this.RequestMethod wird in den Aufruf von „offenen“ Methode übergeben.

Anstatt den eigenen Wrapper zu erstellen, würde ich Open-Source XMLHttpRequest.js - Standardkonforme browserübergreifende XMLHttpRequest-Objektimplementierung empfehlen, die auch einige 20 Bugs der nativen XMLHttpRequest-Objektimplementierungen des Browsers behebt.

+0

Danke, ich werde einen Blick darauf werfen. Ich werde einen anderen Rahmen verwenden, aber ich würde mich selbst als Lernerfahrung rollen. Der obige Code ist nur ein kombinierter Ausschnitt der Hauptquelle. Ich war müde, als ich nach dem Problem suchte. Noch einmal Danke. –

+0

Haben Sie Rechtschreibfehler korrigiert? –

+0

Ja, Rechtschreibung war das Problem. –

1

Diese Fehlermeldung ist eine der "Macken" des FireFox XMLHttpRequest-Objekts. Das gleiche Problem in IE wird verschiedene Symptome haben.

Sie wollen nicht mit all diesen Macken umgehen, jetzt da es viele gute Bibliotheken gibt.

Zum Beispiel in Netscape und FX Aufruf XMLHttpRequestObject.responseText oder XMLHttpRequestObject.status löst einen "NS _..." Fehler für alle Verbindungsprobleme. IE gibt stattdessen den Netzwerkfehlercode des Betriebssystems zurück - es wird kein Fehler ausgegeben. Wenn Sie selbst damit umgehen, müssen Sie die Fehlerbehandlung für beide implementieren.

Ich würde jQuery empfehlen. Prototype ist auch ausgezeichnet.

+0

Ich benutze jetzt jQuery für Ajax. Es ist ziemlich toll. –

Verwandte Themen