Nemrég szükségem volt rá, hogy egy bizonyos javascriptet úgy futtassak le egy usercontrolokat bőven tartalmazó MS-AJAXos ASPX oldalon, hogy MINDENKÉPPEN ő legyen a legutolsó.
Teljesen függetlenül attól, hogy esetleg itt-ott RegisterStartupScript metódusok vagy bármi egyéb megoldások az oldal részeiben most vagy később garázdálkodnak-e, én azt szeretném, ha nem borítanák meg a rendet.
Hosszas guglizás és kísérletezés után találtam egy többé-kevésbé kielégítő megoldást.
Azért csak többé-kevésbé, mert IE és FF esetében az elvárt módon működik, de sajnos opera alatt nem (mást meg sem mertem próbálni :)).
A kulcs az alábbi függvény:
function AddOnload(myfunc)
{
if (window.addEventListener)
window.addEventListener('load', myfunc, false);
else if (window.attachEvent)
window.attachEvent('onload', myfunc);
}
Ami ugye (kompatibilitási okokból kétféleképpen) feliratkozik az oldal onload eseményére.
Ezt próbáltam különböző módokon meghívni, hogy a kívánt eredményt kapjam.
Az első változat így nézett ki:
<html>
<head>
<script type="text/javascript">
function mymessage()
{
alert("onload event");
}
...
...
alert('inline');
AddOnload(function() { alert('TheLastOne'); });
</script>
</head>
<body onload="mymessage()">
... ...
</body>
</html>
IE-re már jó is volt. Először megjelent az inline kód, utána az online attribútumban megadott végül pedig az ominózus utolsó. FF esetében már sajnos nem ez volt a sorrend. Ott gyakorlatilag inline
függvényhívásként működött a dolog, szerintem helytelenül. Azután eltoltam a feliratkozást az oldal végére, ez a FireFoxot is rávezette arra, hogy mit is akarok tulajdonképpen. Mint említettem Operában továbbra sem jó ez a megoldás, de több időt nem szántam rá.
Őszintén szólva az IE és a FF a 99.9%-át lefedi felhasználóknak, tehát ennyiben hagytam a dolgot.
1 <html>
2 <head>
3 <script type="text/javascript">
4 function mymessage()
5 {
6 alert("onload event");
7 }
8
9 function AddOnload(myfunc)
10 {
11 if (window.addEventListener)
12 window.addEventListener('load', myfunc, false);
13 else if (window.attachEvent)
14 window.attachEvent('onload', myfunc);
15 }
16 </script>
17
18 </head>
19 <body onload="mymessage()">
20 ...
21 ...
22 </body>
23
24 <script>
25 alert('inline');
26 AddOnload(function() { alert('TheLastOne'); });
27 </script>
28 </html>
Elég érdekes, hogy melyik böngésző hogyan értelmezte az utasítást.
A fenti kód lett a végső változat, amely FF és IE esetében egyformán utolsónak hívja a kívánt scriptet.
Nincsenek megjegyzések:
Megjegyzés küldése