Uncaught Exception im REQUEST

  • Uncaught Exception im REQUEST

    Hi,

    ich habe jetzt schon in vielen Foren etwas über diesen beschissenen UNCAUGHT EXCEPTION Fehler gelesen. Leider hat mir das alles nicht genützt.
    Die tolle FF Fehlerkonsole bringt folgendes:

    Fehler: uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIXMLHttpRequest.open]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: http://localhost/x/js/ajax.js :: updatethis :: line 37" data: no]


    Ich schildere mal eben was passiert:

    Da existiert die Hauptseite (HANS), in der eine andere per AJAX und RICO Effekt geladen wird. Auf dieser Seite HANS, gibt es zudem eine IFRAME. Über ein Klick in HANS wird die Iframe mit der URL beladen. In dieser IFRAME (bzw. der URL) wird nun in HANS ein AJAX Request + RICO EFFEKT ausgeführt, der den genannten Fehler bringt (außerhalb der IFRAME funktioniert dieser!).
    Mein Aufruf in der IFRAME ist der selber wie sonst in HANS auch:

    <script type="text/javascript">
    parent.updatethis('ad','','','Home');
    </script>


    Nun der AJAX Code:


    Quellcode









    Vielleicht habt ihr eine Idee?
  • hi,

    das passiert weil versucht wird zwei ajax requests nahezu zeitgleich auszuführen.
    Eine der beiden Funktionen solltest du zeitversetzt aufrufen (1 Sekunde sollte reichen).

    Am besten du nutzt dazu setTimeout()
    http://de.selfhtml.org/javascript/objekte/window.htm#set_timeout

    Hier ist auch ein Workaround beschrieben:
    [coderwiki]HowTos/Ajax-zu-viele-Anfragen[/coderwiki]

    Wenn du aber von vornerein weißt, dass du mehrere AJAX Requests gleichzeitig ausführst, solltest du von Beginn an mit setTimeout() arbeiten
  • Da du ja eigentlich nur einen Ajax Request startest, bin ich mir nun doch unsicher.
    Aber dieser Error beim HttpRequest.open deutet eben meist darauf hin.

    versuchs mit

    Quellcode

    1. window.setTimeout("parent.updatethis('ad','','','Home')", 1000);


    aber in #41 und #45 kann es ja theoretisch auch vorkommen, dass du 2 Requests schickt.
    Könnte man hier ein else if verwenden oder sind zwei erforderlich?
  • Mit dem Timeout führt er exakt das aus was ich möchte, also erstmal wunderbar - dankeschön!
    Allerdings trat der Fehler dann auf sobald ich das nächste mal ein REQUESt gestartet habe. Dies habe ich umgangen indem ich die IFRAME nicht in die mit AJAX reingeladenen Datei gesetzt hatte, sondern außerhalb.

    Das funktioniert jetzt alles, bis auf das Problem dass beim 1. Mal nachdem ich etwas an die IFRAME geschickt habe, eine Seite mit AJAX reingeladen wird, die es nicht gibt (Objekt nicht gefunden blabla Fehler). Schick ich dann erneut den Request ab, gehts wieder...

    Jemand eine Idee dieses Problem zu umgehen?
  • hi, ich weiß nicht ob ich das jetzt richtig verstehe ;)

    also das aktuelle problem tritt nur beim ersten starten des requests auf.
    Es laden quasi 3 Seiten

    Du klickst auf den Link link.html
    -> link.html lädt
    In der link.html befindet sich ein iframe namens frame.html
    -> frame.html lädt
    die frame.html lädt dann im übergeordneten fenster den ajax request
    -> ajax.html lädt

    muss grad weg.. einzige idee spontan: ein weiter setTimeout()
  • Weitere TimeOut()s im Code oder beim AJAX-Aufruf?

    Sozusagen, ich schildere es aber noch einmal:

    Die MainSite "HANS" existiert. Auf dieser wird per Klick ein AJAX Request gestartet, was auf HANS eine erneute Seite in ein DIV lädt. In dieser reingeladenen Seite rufe ich per Klick eine IFRAME auf, über welche ich dann in HANS erneut den AJAX Request zum aktualisieren ausführe.

    Verständlich? :)
  • ja, verstanden. Aber macht das Sinn *gg*
    Request1 lädt Request2 und Request2 lädt immer Request3
    dann könntest du doch genausogut Request2 und Request3 von Request 1 aufrufen...

    oder mehrere Daten über eine Einleitung schicken und dann mit split ausplitten und verteilen

    [coderwiki]HowTos/Ajax-Inhalte-mit-PHP-nachladen[/coderwiki]

    Quellcode

    1. var update = new Array();
    2. var response = req.responseText;
    3. if(response.indexOf('||' != -1)) {
    4. update = response.split('||');
    5. for(i=0; i<update.length; i+=2)
    6. document.getElementById(update[i]).innerHTML = update[i+1];
    7. }
  • Okay, mal was zum Sinn ;)

    Ich habe eine Hauptseite (HANS). In HANS wird per Klick eine Page in ein DIV geladen (eine Art EinAusblend Funktion mit Aktualisierung durch AJAX). In dieser reingeladenen Page, stehen Daten aus der Datenbank. Für jeden Eintrag gibts eine Löschfunktion, klick man dort drauf - wird in der Iframe eben die Löschfunktion aufgerufen und kurz danach auf HANS eben der Teil nachgeladen (bzw. aktualisiert) damit der Eintrag gleich rausfällt und man sich eben nicht wundert wieso der immer noch dort steht.

    Ich wollte das auch schon mit AJAX anstatt der Iframe lösen, allerdings kam dann ständig der uncaught exeption Fehler ;) Mit der Iframe verhindere ich dies, allerdings gibts dort das Problem wie oben beschrieben:

    Das funktioniert jetzt alles, bis auf das Problem dass beim 1. Mal nachdem ich etwas an die IFRAME geschickt habe, eine Seite mit AJAX reingeladen wird, die es nicht gibt (Objekt nicht gefunden blabla Fehler). Schick ich dann erneut den Request ab, gehts wieder...
  • wenn du alles einzeln machen magst, dann musst du eben mit einer globalen ajax queue (die könnte in HANS platziert werden) arbeiten

    aber warum "löschst und liest" du denn nicht gleichzeitig?

    * HANS ist die Hauptseite
    * nach event (klick oder onLoad) wird eine liste in LISTDIV geladen (z.B. liste.php)
    * diese Liste enthält links zum Löschen
    * ein Klick auf den Löschen-Link startet einen AJAX Request um irgendwelche Details nachzuladen, um dem Benutzer zu ermöglichen die Löschung zu überdenken (z.B. confirm.php?id=1)
    * das Bestätigunsfeld wird in das seperate CONFIRMDIV geladen
    * Jetzt klickt der Benutzer auf "Ja, wirklich löschen"
    * Der Klick startet einen AJAX Request an liste.php?del=1
    * liste.php löscht den eintrag und sendet die aktuelle Liste zurück ins LISTDIV


    Nach dem Vorgehen sind keine dutzend gleichzeitiger Requests nötig

    Warum die letzten beide Punkte blau sind?
    Weil man sie anders lösen kann (wenn auf weitere Rückfragen verzichtet werden kann). Ich würd den AJAX Request nur zum löschen verwenden und das Listenelement einfach aus der Liste ausblenden (style.display=none) - dazu brauch jede Zeile natürlich eine id
  • Ich versuche morgen früh einmal, das ganze ohne die IFRAME zu tätigen. Allerdings denke ich wird das etwas schwierig.

    Denn ich schicke den AJAX Request ab, welcher die Seite in dem DIV aktualisiert (mit ?id=jeweiligeID) Dann wird die Seite schon aktualisiert und erst dann der PHP Code ausgeführt, dann müsste ich sie erneut laden lassen...? Oder ich lasse es beim AJAX Request einfach ausblenden (auch eine Gute Idee!).

    Danke schonmal für deine Hilfe.