You are not logged in.

  • Login

1

Friday, February 16th 2007, 1:21pm

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:

PHP Quellcode

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


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

PHP Quellcode

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


sofort angezeigt in einer unsichtbaren spalte unterhalb jedes datensatzes

PHP 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)

JavaScript Code

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


JavaScript Code

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


hat jemand ein lösungsvorschlag?

thx schonmal

Mfg da BendIt

2

Friday, February 16th 2007, 4:08pm

kann ich jetzt so nicht bestätigen.
Habe mal ein sehr einfaches Beispiel gemacht:

HTML Code

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


status.php

HTML Code

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).

3

Friday, February 16th 2007, 5:09pm

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:

JavaScript Code

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


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

JavaScript Code

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

4

Friday, February 16th 2007, 6:15pm

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.

Quoted from ""BendIt""

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?

Quoted from ""BendIt""

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.

5

Friday, February 16th 2007, 6:58pm

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

JavaScript Code

1
var http = createRequestObject();


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

JavaScript Code

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


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...

6

Saturday, February 17th 2007, 3:11pm

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

JavaScript Code

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



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^^ ;)

7

Saturday, February 17th 2007, 4:27pm

Hast du vielleicht noch irgendwelche andere JavaScript Funktionen dabei laufen? Z.B. welche die über setTimeout aufgerufen werden.
Vielleicht schnappt sich eine andere Funktion das update weg, während der Browser auf die Eingabe vom Alert Fenster wartet....

Naja, klingt strange. Die IE Fehlermeldungen sind wirklich das letzte.

8

Saturday, February 17th 2007, 4:37pm

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 :)

9

Wednesday, February 21st 2007, 11:53am

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

10

Thursday, February 22nd 2007, 10:46am

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

Danke

Unregistered

11

Thursday, February 3rd 2011, 9:47am

Danke

Danke

Social bookmarks