IE Unbekannter Laufzeitfehler (IE Problem (AJAX))

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • IE Unbekannter Laufzeitfehler (IE Problem (AJAX))

    Mahlzeit!

    Ich hab ein "kleines" Problem mit dem IE(7) beim aufruf per AJAX.

    In meinem Projekt läuft die gesamte Datenübertragung dynamisch per AJAX ab. Hab dementsprechend nur die index.php in die dynamisch andere dateien mit content und klassen includiert werden.

    Jedenfalls hab ich in der index.php ein div bereich in dem immer die daten angezeigt werden sollen. innerhalb dieses divs kommen noch tabellen die verschieden funktionen erfüllen. z.b. eine tabelle für navigation, eine für die daten usw.

    Die daten kommen aus einer mysql db. da diese daten wie gesagt mit einer tabelle dargestellt werden bekommt jeder datensatz im <tr> tag die datensatz id mit

    Bsp:

    Quellcode

    1. $out.= '<tr id="tbl'.$ds['id'].'">';


    Im firefox klappt wie üblich alles bestens. die daten werden per klick auf einen link

    Quellcode

    1. $out.= '<td><a href="javascript:shownfo('.$ds['id'].')">'.$ds['title'].'</a></td>';


    sofort angezeigt in einer unsichtbaren spalte unterhalb jedes datensatzes

    Quellcode

    1. $out.= '<tr id="tab'.$ds['id'].'" style="visibility:hidden"></tr>';


    die natürlich auf visible gesetzt wird sobald man auf den link klickt.

    wie schon gesagt funzt die ganze sache im ff ohne größere probleme... nur halt im ie nicht :-/

    hab mal versucht was passiert wenn ich die daten in einem div anzeigen lasse welches in der index.php fest drin steht. und siehe da... es geht.

    also liegt der fehler im ie daran das er nicht auf das dynamisch erzeugte element mit der id="tab+Nummer des DS" zugreifen kann...

    JS Funktionen (AJAX)

    Quellcode

    1. function createRequestObject() {
    2. var ro;
    3. if (window.XMLHttpRequest){
    4. ro = new XMLHttpRequest();
    5. } else if (window.ActiveXObject){
    6. try {
    7. ro = new ActiveXObject("Microsoft.XMLHTTP");
    8. } catch (E) {
    9. try {
    10. ro = new ActiveXObject("MSXML2.XMLHTTP");
    11. } catch (E) {
    12. ro = new XMLHttpRequest()
    13. }
    14. }
    15. }
    16. return ro;
    17. }
    18. function handleResponse() {
    19. if((http.readyState == 4) && (http.status == 200)) {
    20. var response = http.responseText;
    21. var update = new Array();
    22. if(response.indexOf('|' != -1)) {
    23. update = response.split('|');
    24. document.getElementById(update[0]).innerHTML = update[1];
    25. }
    26. }
    27. }
    Alles anzeigen


    Quellcode

    1. function shownfo(uid) {
    2. if (document.getElementById('tab'+uid).innerHTML != '') {
    3. document.getElementById('tab'+uid).innerHTML = '';
    4. document.getElementById('tab'+uid).style.visibility = "hidden";
    5. } else {
    6. document.getElementById('tab'+uid).style.visibility = "visible";
    7. http.open('get', 'scripts/rpc.php?act=nfo&id='+uid);
    8. http.onreadystatechange = handleResponse;
    9. http.send(null);
    10. }
    11. }
    Alles anzeigen


    hat jemand ein lösungsvorschlag?

    thx schonmal

    Mfg da BendIt
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!
  • kann ich jetzt so nicht bestätigen.
    Habe mal ein sehr einfaches Beispiel gemacht:

    Quellcode

    1. <html><head><script type="text/javascript">
    2. <!--
    3. var req = window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");
    4. function ajax() {
    5. req.onreadystatechange = function() {
    6. if ((req.readyState == 4) && (req.status == 200)) {
    7. document.getElementById('j').innerHTML = req.responseText;
    8. }
    9. }
    10. req.open('GET', 'status.php');
    11. req.send(null);
    12. }
    13. function test() {
    14. alert(document.getElementById('test').innerHTML);
    15. }
    16. //-->
    17. </script></head>
    18. <body onload="ajax()">
    19. <div id="j">Loading...</div>
    20. </body>
    21. </html>
    Alles anzeigen


    status.php

    Quellcode

    1. <a href="#" onclick="test()">klick mich</a><div id="test">Test</div>


    funktioniert ausgezeichnet. Ist denn auf deiner Seite alles fertig geladen? D.h. zeigt der Browser auch wirklich "Fertig" in der Statusbar an?
    Hunderprozentigen Zugriff auf den XML Baum hast du nämlich erst, wenn die Seite wirklich fertig ist.

    Vielleicht ist auch ein Felhler im XML Baum... kontrolliere mal mit dem Validator, ob du vielleicht irgendwas vergessen hast. Der Firefox ist auch nicht immer restriktiv und erlaubt manche Fehler (was ja auch nicht unbedingt schlecht ist).
  • Hm komische Sache :?

    IE 6 mag absolut nicht. Der meldet jetzt : "Automatisierungsserver kann Objekt nicht erstellen"

    bzw http ist NULL oder kein Objekt.

    Habs eben nochmal mit der anderen Variante probiert ein XML Objekt zu erstellen:

    Quellcode

    1. if(navigator.appName.search("Microsoft") > -1) {
    2. if((ro = new ActiveXObject("Microsoft.XMLHTTP")));
    3. else if ((ro = new ActiveXObject("MSXML2.XMLHTTP")));
    4. } else {
    5. ro = new XMLHttpRequest();
    6. }


    das mag er auch nicht... im IE 7 lief es vorhin noch mit dem nativ implementierten XMLHttpRequest Objekt... ich hasse IE >:-/

    aber um deine Frage zu beantworten: Nein er lädt die Seite nicht vollständig. er bricht mit den oben genannten fehlern ab... jedenfalls im IE 6... die 7 will ich mir hier nicht installieren... und der der validator mag die seite auch nicht prüfen...


    [edit] ach ja, was vlt noch erwähnenswert wäre: IE meckert nur rum wenn er auf die seite zugreift die online ist. bei der exakten kopie die bei mir offline unter xampp rennt sagt er kein ton^^[/edit]

    [edit2] der script debuger von MS meldet einen fehler bei

    Quellcode

    1. document.getElementById(update[0]).innerHTML = update[1];
    wenn ich,wie oben beschrieben, versuche auf ein element in der tabelle zuzugreifen...[/edit2]
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!
  • wie sieht es denn mit meinem Script aus? Läufts das auf deinem Server?

    Die Meldung http ist kein Objekt ist berechtigt, falls du es mit createRequestObject() nur lokal instantiierst. http muss global sein, damit du in handleResponse() darauf zugreifen kannst.

    "BendIt" schrieb:

    Nein er lädt die Seite nicht vollständig. er bricht mit den oben genannten fehlern ab... jedenfalls im IE 6... die 7 will ich mir hier nicht installieren...

    Hast du denn auch onload Aufrufe?

    "BendIt" schrieb:

    der validator mag die seite auch nicht prüfen

    Hast du die Seite online? Ich denke, dass es an ungültigem HTML Code liegt. Ein Tag nicht geschlossen und das Parsen kann fehlschlagen.
  • Das Script läuft lokal tadellos. online geht es im ff natürlich auch... nur im ie halt nicht.

    http ist im script global deklariert, sprich außerhalb der funktionen

    Quellcode

    1. var http = createRequestObject();


    im body onload steht der aufruf "show(0);"

    Quellcode

    1. function show(cat) {
    2. switch (cat) {
    3. case 0:
    4. closesubs();
    5. document.getElementById('ajax').style.visibility = "visible";
    6. http.open('get', 'scripts/rpc.php?act=show&what='+cat);
    7. http.onreadystatechange = handleResponse;
    8. http.send(null);
    9. break;
    10. ...
    Alles anzeigen


    Die Seite ist online, und der validator ging jetzt drüber, lag am zeichensatz utf-8.

    Fehler:

    # Error Line 29 column 59: document type does not allow element "UL" here; assuming missing "LI" start-tag.

    <ul id="subanzeige" class="navi" style="visibility:hidden;"></ul>


    # Error Line 29 column 64: end tag for "UL" which is not finished.

    ...anzeige" class="navi" style="visibility:hidden;"></ul>

    ( <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> --- steht im header )

    ich bezweifel nur das es an den fehlern liegt, oder?


    was mich auch stutzig macht ist, das es lokal ausgeführt sowohl in ff als auch im ie ohne probleme funzt... und das deutet ja eher auf ein software problem als auf ein browser problem hin...
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!
  • Entwarnung ;)


    hab eben die Einstellungen beim IE 6 geprüft. Sicherheitsstufe geschaut und gesehen das die ausführung von ActiveX deaktiviert war... ergo kann auch kein XMLHttpRequest Objekt erstellt werden... umgestellt auf "Eingabeaufforderung" und siehe da, er fragt ob er das ActiveX ausführen darf... 2 mal mit JA bestätigt und
    voir là: funzt ohne fehler... zumindest der Start.

    Damit lädt er die seite fertig!

    Leider bleibt der Laufzeitfehler bestehen :(

    Zeile: 53
    Zeichen: 13
    Fehler: Unbekannter Laufzeitfehler
    Code: 0
    URL: http://meineDomain.de/projekt/

    Da ich einen JS fehler vermute hab ich in meine JS Datei geschaut... problem dabei... die angegebene Stelle ist ne leerzeile...

    Da imho der IE "ein wenig" unpräzise ist mit seinen Angaben wo der Fehler ist, bzw die Angaben eher relative als absolut sind, fehlt mir wiedermal die Möglichkeit die Fehlerstelle zu lokalisieren und dem problem auf den grund zu gehen...

    allerdings ist mir eins aufgefallen: ich habe in meiner handleresponse funktion zum debuggen ein: alert(update); drin. um eben zu prüfen ob eine reaktion erfolgt... also ob die korrekten daten geladen werden. Meine feststellung dabei war, das nach klick auf den link in der tabelle (wo der laufzeitfehler auftritt) die richtigen daten in dem alert angezeigt werden... nach klick auf ok kommt der laufzeitfehler

    Quellcode

    1. function handleResponse() {
    2. if((http.readyState == 4) && (http.status == 200)) {
    3. var response = http.responseText;
    4. var update = new Array();
    5. if(response.indexOf('|' != -1)) {
    6. update = response.split('|');
    7. alert(update);
    8. document.getElementById(update[0]).innerHTML = update[1];
    9. }
    10. }
    11. }
    Alles anzeigen



    das lässt, wie oben schon gesagt, vermuten das IE nicht auf die dynamisch erzeugte tabelle und deren ID´s im tag zugreifen kann...

    hab ich schon erwähnt das ich IE hasse?

    Also 1 Problem gelöst, 1 offen!


    Danke schonmal für die hilfe donut^^ ;)
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!
  • ja hab ich, aber die sind alle abgearbeitet schon bevor man auf den link klickt...

    ich werd jetzt mal ne command queu funktion einbauen, das sollte zumindest das "überschneiden" mehrere ajax requests verhindern...

    dachte nur das es evtl nen workaround für diesen "bug" gibt...


    trotzdem thx für deine hilfe :)
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!
  • Problem erkannt

    Nach einigem suchen hab ich die wurzel allen übels festnageln können ;)

    Der o.g. Fehler tritt im IE immer dann auf, wenn versucht wird per innerHTML den Inhalt einer Tabelle zu ändern. Da der <TR> Tag u.a. im IE Schreibgeschützt ist, resultiert daraus der Fehler! MS hat bei der entwicklung dieses Verhalten beabsichtigt...

    siehe -> http://support.microsoft.com/kb/239832/de
    lösung (evtl) -> http://forum.de.selfhtml.org/archiv/2006/3/t126287/

    Also, niemals versuchen dynamisch Tabellen mit innerHTML zu verändern... jedenfalls nicht im IE :roll:

    So Long, da BendIt
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!
  • Problem entgültig gelöst :=)

    Also, da wie im vorherigen Posting beschrieben, die Tags <tr> usw schreibgeschützt sind, hab ich die sache folgendermaßen gelöst, so dass es auch im IE funzt *freu*

    ich greife nicht mehr auf das <tr> tag zu mit innerHTML, sondern auf ein <td>. Das <tr> setz ich eben nur auf visible bzw hide. in das <td> </td> wird dynamisch eine neue tabelle erzeugt... somit funzt die ganze sache...

    klingt etwas verwirrend? ist es eigentlich nicht...

    wer das gleiche problem hat bitte melden, dann post ich den betreffenden code...
    hab nur atm kein bock ;)

    so long da BendIt
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!