InnerHTML a display:none bug v MSIE

Nedávno jsem narazil na zajímavý bug v Internet Exploreru. Měl jsem div, do kterého jsem jeho obsah vkládal pomocí javascriptové funkce InnerHTML a tento obsah jsem pak potřeboval pomocí javascriptu skrýt či zobrazit. Začal jsem klasicky tím, že jsem mu měnil style na display=block / none podle toho, jak bylo potřeba. Vnitřní div měl navíc absolutní pozicování a Z-index, který ho zobrazoval jako okno nad textem stránky.

V opeře i firefoxu vše fungovalo jak mělo, divná věc se ovšem děla v internet exploreru. Pokud jsem totiž v MSIE div skryl pomocí display:none, explorer místo něj stejně nechal jednořádkovou mezeru a odsunul text za ním o řádek níž, zatímco pokud tam div byl, zobrazil se s absolutní pozicí nad textem a text za ním zůstal kde je.

Lámal jsem si s tím hlavu nějakou dobu, zkoušel jsem různé nastavení CSS, googloval všemožně až se zdálo, že tenhle bug nijak opravit nelze. Nakonec jsem to vyřešil šalamounsky a to tak, že jsem neposlušnému divu místo display:block/none nastavil pozici někam mimo stránku a bylo po starostech.

Zdrojový kód příkladu:

<html>
	<body>
		<script type="text/javascript">
			function vlozInnerDiv() {
				var innerDiv = '<div id="innerDiv" style="position:absolute;background-color:yellow;">div vložený přes innerHTML</div>';
				document.getElementById('test').innerHTML = innerDiv;
			}

			function ukaz() {
				//document.getElementById('innerDiv').style.display="block";
				document.getElementById('innerDiv').style.top="auto";
			}

			function schovej() {
				//document.getElementById('innerDiv').style.display="none";
				document.getElementById('innerDiv').style.top="-200";
			}
		</script>

		<a href="#" onclick="vlozInnerDiv();">vlož div přes innerHtml</a><br />
		<a href="javascript:void()" onmouseover="ukaz();" onmouseout="schovej();">ukaz</a><br /><br />
		
		První řádek textu..<br />
		Druhý řádek textu. Řádky by měly být těsně u sebe<br />
		Třetí řádek. Pod ním zkušební div<br />
		
		<div id="test">
			<div id="innerDiv" style="position:absolute; background-color:yellow; ">div v kódu</div>
		</div>
		
		Čtvrtý řádek - nad ním zkušební div<br />
		Pátý řádek
	</body>
</html>

Žádné příbuzné články.

This entry was posted in Webdesign. Bookmark the permalink. Follow any comments here with the RSS feed for this post. Trackbacks are closed, but you can post a comment.

2 Comments

  1. Kobi napsal:

    A co použít visibility?

  2. ziki napsal:

    Kobi: visibility jsem taky zkoušel, ale narazil jsem s ní na nekompatibilitu v některém z prohlížečů.. bohužel už si teď nevzpomínám v kterém..

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>