Opera-Problem mit Methode .innerHtml

Manuel Hegemann

Erfahrenes Mitglied
Hallo zusammen,

ich rufe auf einer Seite per body onLoad eine AJAX Funktion auf, diese schreibt mir per .innerHtml dann entsprechenden Inhalt auf die Seite.
Dies funktioniert auch im Firefox und im IE6 und IE7 sehr gut.

Nur im Opera kommt kein Inhalt. Der Ladebalken wird angezeigt und nach erfolgtem Laden verschwindet auch der Ladebalken, jedoch erscheint kein Inhalt.

Ich hole mir das DIV in dem alles angezeigt wird per getElementById().

Gibt es da irgendwelche bekannten Probleme mit dem Opera oder mache ich irgendwas falsch?

Vielen Dank im Voraus für Eure Hilfe.

BigManu
 
Im Normalfall macht der Opera da keine Probleme , kann sich aber um den guten alten Renderbug handeln.

Der Opera rendert manchmal falsch so das Elemente einfach sichtbar bleiben obwohl sie eigentlich gar nicht mehr da sind. Fährt man dann mit der Maus rüber oder verkleinert das Fenster kurz mal verschwinden diese Reste dann.

Das passiert mir allerdings meist nur wenn ich HTML Inhalt irgendwo rauswerfe , überprüfe nochmal die CSS Eigenschaften etc ab ob der Container angezeigt wird.
 
Hallo,

erstmal Danke für die Antwort.
Das Problem ist aber, dass nichts angezeigt wird, nicht, dass eine Anzeige nicht verschwindet... Der Container is da, kein Problem.
Verstehe es einfach nicht.

Viele Grüße,
BigManu
 
Naja soviel kann man da nun auch nicht sagen , da wir ja den Code von Dir gar nicht kennen.

Die Fragen die sich da stellen erstmal kommt alles korrekt bei dem Server an. Schickt er alles korrekt zum Clienten zurück. Wenn auf PHP Seite ein Fehler erzeugt wird , dann wird die Fehlermeldung meist angezeigt dann.
Irgendwelche Fehler im Opera ?

Was mich halt verwundert ist das es im IE 6.0 / 7.0 geht und im FF aber im Opera nicht mehr.

An innerHTML kann es nicht liegen behaupte ich nun einmal, der Request wird erfolgreich beendet , also entweder kommt nur nen leerer String zurück im Opera (was nicht erklären würde warum es im FF und IE geht) oder da ist irgendwas nicht sichtbar :/.

Was anderes kann ich da nun auch nicht sagen leider.
 
Ok... vielleicht könnt ihr ja tatsächlich mit dem Code etwas mehr anfangen:

JavaScript:
Code:
function getDir(changeDir, chmod, windowId, columnId, sessname, sessid) {
	var loaderDiv = document.getElementById('loader_' + windowId);
	loaderDiv.style.visibility = 'visible';

	var directoryPanel = document.getElementById('directoryPanelList_' + windowId);
	var newDirectoryPanelListWidth = 570;
	
	if(columnId > 2) {
		var factor;
		
		if(chmod.substring(0, 1) != 'd') {
			factor = columnId;
		} else {
			factor = columnId + 1;
		}

		newDirectoryPanelListWidth = 190 * factor;
	}

	if(newDirectoryPanelListWidth > directoryPanel.offsetWidth) {
		directoryPanel.style.width = newDirectoryPanelListWidth + 'px';
		//Scroll to the new opened directory list
		document.getElementById('directoryPanelListContainer_0').scrollLeft = newDirectoryPanelListWidth;
	}
	
	try {
		req = new XMLHttpRequest();
	} catch (e) {
		try {
			req = new ActiveXObject('Msxml2.XMLHTTP');
		} catch (e){
			try {
				req = new ActiveXObject('Microsoft.XMLHTTP');
			} 
			catch (failed){
				req = null;
			}
		}  
	}

	req.open('POST', '../modules/ajax/getDir.php', 'true');

	req.onreadystatechange = function() {            
		switch(req.readyState) {
			case 4:
				if(req.status!=200) {
					alert('Fehler: ' + req.status); 
				} else {
					var response = req.responseText.split(";;;");
					
					//Get details for chosen folder
					getDetails(changeDir, windowId, columnId, sessname, sessid);

					directoryPanel.innerHTML = response[0];

					if(newDirectoryPanelListWidth <= directoryPanel.offsetWidth) {
						directoryPanel.style.width = newDirectoryPanelListWidth + 'px';
					}

					if(response.length > 1) {
						openSystemPanel(response[1]);
					}
				}
				break;
			default:
				return false;
				break;     
		}
	}

	req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	req.send('changeDir=' + changeDir + '&chmod=' + chmod + '&windowId=' + windowId + '&columnId=' + columnId + '&' + sessname + '=' + sessid);
}

Und die HTML Seite dazu:
HTML:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>myWebAx</title>
<script language="javascript" src="js/functions.js" type="text/javascript"></script>
<script language="javascript" src="js/ajax.js" type="text/javascript"></script>
<script language="javascript" src="js/window_move.js" type="text/javascript"></script>
<link href="css/style.css" rel="stylesheet" type="text/css" />
</head>

<body onLoad="javascript:getDir('', '', '0', '1', '<?php echo session_name(); ?>', '<?php echo session_id(); ?>')">
<div id="directoryPanelListContainer_0" class="directoryPanelListContainer">
	<div id="directoryPanelList_0" class="directoryPanelList">
		
	</div>
</div>
</body>
</html>

Von der JavaScript-Konsole werden weder im IE noch im FF noch im Opera irgendwelche Fehler angezeigt...

Viele Grüße,
BigManu
 
Also Fehler seh ich da schon mal nicht hab das nun auch mal bei mir ausgetestet da läuft es normal.

HTML:
<html>
<head>
<script type="text/javascript">
function getDir(changeDir, chmod, windowId, columnId, sessname, sessid) {
    var loaderDiv = document.getElementById('loader_' + windowId);
    loaderDiv.style.visibility = 'visible';

    var directoryPanel = document.getElementById('directoryPanelList_' + windowId);
    var newDirectoryPanelListWidth = 570;
    
    if(columnId > 2) {
        var factor;
        
        if(chmod.substring(0, 1) != 'd') {
            factor = columnId;
        } else {
            factor = columnId + 1;
        }

        newDirectoryPanelListWidth = 190 * factor;
    }

    if(newDirectoryPanelListWidth > directoryPanel.offsetWidth) {
        directoryPanel.style.width = newDirectoryPanelListWidth + 'px';
        //Scroll to the new opened directory list
        document.getElementById('directoryPanelListContainer_0').scrollLeft = newDirectoryPanelListWidth;
    }
    
    try {
        req = new XMLHttpRequest();
    } catch (e) {
        try {
            req = new ActiveXObject('Msxml2.XMLHTTP');
        } catch (e){
            try {
                req = new ActiveXObject('Microsoft.XMLHTTP');
            } 
            catch (failed){
                req = null;
            }
        }  
    }

    req.open('POST', 'test.php', 'true');

    req.onreadystatechange = function() {
        switch(req.readyState) {
            case 4:
                if(req.status!=200) {
                    alert('Fehler: ' + req.status); 
                } else {
                    var response = req.responseText.split(";;;");

                    //Get details for chosen folder
//                     getDetails(changeDir, windowId, columnId, sessname, sessid);

                    directoryPanel.innerHTML = response[0];getDir

                    if(newDirectoryPanelListWidth <= directoryPanel.offsetWidth) {
                        directoryPanel.style.width = newDirectoryPanelListWidth + 'px';
                    }

                    if(response.length > 1) {
//                         openSystemPanel(response[1]);
                    }
                }
                break;
            default:
                return false;
                break;
        }
    }

    req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    req.send('changeDir=' + changeDir + '&chmod=' + chmod + '&windowId=' + windowId + '&columnId=' + columnId + '&' + sessname + '=' + sessid);
}
</script>
</head>
<body onload="javascript:getDir('','',0,'','','')">
    <div id="loader_0"></div>
    <div id="directoryPanelList_0"></div>
</body>

Pfad hab ich abgeändert , da musst auch nochmal prüfen ob es der richtige Pfad ist bei Dir dann.
open SystemPanel () und getDetails hatte ich nun nicht und hab es auskommentiert. Also an deinen Ajax Request liegt es nicht.

Meine billige PHP datei sah nun so aus.

PHP:
<?php
 echo "hallo welt;;;wie geht es dir";
?>

Also auf den Opera schiebe ich es jetzt nur noch wenn Du die version 8.0 nutzt weil erst die Version 8.1 das richtig abarbeitet alles mit dem Request.

Also deine Funktion selber funktioniert einwandfrei.
 
Hm... es wundert mich halt, weil es im IE und im FF einwandfrei funktioniert... Die Pfade müssen demnach ja alle stimmen... Ich benutze den Opera 9, also daran kann es dann auch net liegen. Puh... echt ne üble Situation ;)

Ich hab mir jetzt mal die Response per alert anzeigen lassen, auch alles ok... Ich verstehe es einfach nicht.

Noch irgendwelche anderen Ideen wo das Problem liegen könnte? Doch ein Renderproblem? Aber wenn es bei dir läuft, liegt es vllt. daran, dass die Response zu groß ist?
 
Ach zu groß , hab da schon komplette Webseiten durchgeprügelt das geht alles ;)
HTML Listen mit 500+ Elementen waren auch schon dabei , also mhm ... .

Ich tippe da fast auf ein CSS Problemchen , dein JS scheint zu funktionieren , dann wird eventuell der Container nicht angezeigt oder verschoben.

Hatten das Spiel mal im Safari und FF , eine Box visibility = hidden , man setzt sie auf Block der Safari zeigte sie an der FF nicht.Was ja vom FF völlig korrekt war aber das war auch ne üble Fehlersuche.

Was den Renderbug angeht , der tritt meist auf wenn man irgendeinen Inhalt einfach durch anderen Inhalt ersetzt oder Inhalt entfernt.

Dann bleibt aber meist nur ein Rest vom alten Inhalt auf dem Bildschirm vorhanden , wenn man dann das Fenster kurz verkleinert und wieder vergrößert verschwindet es wieder.

MfG und viel Erfolg bei der Suche ;)
 

Anhänge

  • renderbug.jpg
    renderbug.jpg
    9,4 KB · Aufrufe: 43

Neue Beiträge

Zurück