ugrás a tartalomhoz

IE6 alatt Element.prototype elérése, módosítása....

hub · 2009. Jún. 4. (Cs), 15.50
Sziasztok

Remélem, nem volt már, ha mégis, elnézést. Tehát a problémám:

Javascriptben kellene fejlesztenem, és nem használhatok semmilyen külső library-t (nem auditálják vagymi), így se prototype, se jquery, semmi. Így kellett felismernem, (és a gugli azóta meg is erősített ebben) hogy az IE6 nem engedi az Element prototype-ját piszkálni. Vagyis pl.:

Element.prototype.rejt = function() {
	this.style.display = "none";
} 

Element.prototype.mutat = function() {
	this.style.display = "block";
} 

$("alma").rejt();
$("alma").mutat();
nem működik, csak !IE6 alatt. Találtam pár megoldást, de vagy nem jók, vagy nem kivitelezhető. Próbáltam kilesni a prototype-ból hogy hogyan csinálja, de nem jöttem rá, kicsi vagyok még hozzá. Ha valaki tudna ebben segíteni, fentihez hasonló kis mórickapéldával, azt nagyon megköszönném. Persze, ha teljesen rosszul közelítem meg, és máshogyan kell, annak is örülni fogok.

Üdvözlettel:
Róbert
 
1

Szia!

inf · 2009. Jún. 4. (Cs), 19.40
Szia!

Prototype úgy csinálja, hogy létrehoz egy Element osztályt, és annak a prototype-ját bővíti.
Aztán ha onload van, akkor a prototype-ba írt tulajdonságokat bemásolja a document.getElementsByTagName("*")-ban kapott objektumokra. Legalábbis régebben így csinálta, de gondolom ez a megközelítés azóta sem változott.
Nem hiszem, hogy ezen kívül lenne más megoldás a problémára.

Egyébként ie onload kezelése is érdekes:
document.attachEvent("onreadystatechange",function ()
{
    if (document.readyState=="complete")
    {
        alert("betöltődött");
    }
})

Ha így írod be a kódodat, akkor a body onload előtt fog betöltődni, és a body onload-ban már használhatod a kiegészítéseket.

Amire figyelned kell, hogyha több ilyen kódot helyezel el az onload-ban több attachEventtel, akkor a sorrend teljesen összevissza ie-ben.
A másik dolog, amire még figyelned kell, hogy ezzel a módszerrel a document.createElement-tel létrehozott elementekbe is ugyanúgy be kell másolni a változtatásokat.

if (browsers.ie6)
{
	Element=
	{
		prototype: {},
		applyOnElements: function (elements)
		{
			for (var i=0; i<elements.length; i++)
			{
				var element=elements[i];
				for (var property in this.prototype)
				{
					var value=this.prototype[property];
					if (element[property]!==value)
					{
						element[property]=value;
					}
				}
			}
		},
		applyByLoad: function ()
		{
			//a window ilyenkor kimarad egyébként
			this.applyOnElements(document.getElementsByTagName("*"));
		},
		applyByCreate: function ()
		{
			var args=[];
			for (var i=0; i<arguments.length; i++)
			{
				args[i]=arguments[i];
			}
			this.applyOnElements(args);
		}
	};
	
	document.attachEvent("onreadystatechange",function ()
	{
		if (document.readyState=="complete")
		{
			Element.applyByLoad();
		}
	});
}
2

Köszönöm!

hub · 2009. Jún. 4. (Cs), 20.45
Jónak tűnik, köszönöm előre is, itthon nem tudom kipróbálni, de holnap első dolgom lesz. :)
3

Még jobb

inf · 2009. Jún. 8. (H), 06.40
Szia!
Közben találtam még jobb megoldást a dologra:

<PUBLIC:COMPONENT>
<script type="text/javascript">
for(property in HTMLElement.prototype)
{
	if (HTMLElement.prototype[property]!==Object.prototype[property])
	{
		element[property]=HTMLElement.prototype[property];
	}
}
</script>
</PUBLIC:COMPONENT>

<html>
<head>
<title>IE HTMLElement.prototype</title>

<!--[if IE]>
<style type="text/css">
*{behavior:url(HTMLElement.htc)}
</style>
<![endif]-->

<script type="text/javascript">

if(!("HTMLElement" in window))
{
	window.HTMLElement=function(){};
}

HTMLElement.prototype.foo=function(){
	alert(this.value)
};

</script>

</head>

<body>
<input type="button" onclick="this.foo()" value="click">
</body>
</html> 
szerk:
Nem tudtam megoldani, hogy a htc ne legyen külön fájlban, meg egyébkéntis volt, hogy nem működött a dolog, szóval ez mégiscsak a rosszabb megoldás, és a fenti a jó.