Den skal bare have parametrene med! Hvis der ikke er timeout med ser den sådan her ud: onMouseOver="snap ( this, this.parentNode.parentNode, 'xSub0', 'bottom', true, this.parentNode.offsetLeft, 1 )"
de eneste paramere di kan give til en funktion i et settimeoutkald er parametre der pålideligt kan konverteres til en streng og tilbage igen. det vil sige strenge, booleans tal og null.
for at sende en objektreference som parameter må du gemmen den i en global variabel med et unikt navn som funktionen så kan få og finde objektreferencen ud af:
så vi kommer til at lave flere linier plus lidt globalt memory:
i head:
var teller = 0;
function kaldesOnMouseOut( refParam, strParam, strParam2, boolParam, refparam, numParam2 ) { var tal = ++teller; var navn = "global"+tal; window[ navn ] = new Object(); window[ navn ].refParam = refParam; window[ navn ].refParam2 = refParam2; setTimeout( "snap( '" +navn +"', '" +strParam +"', '" +strParam2 +"', " +boolParam +", " +numParam +");" , 500 ); // nu er det kald sat i kø. }
// forrest i funktionen snap skal de parameter så pakkes ud igen: function snap( navn, strParam, strParam2, boolParam, numParam2 ) { var refParam = window[navn].refParam; var refParam2 = window[navn].refParam2; delete window[navn]; // frigiv den ram de brugte // nu har funktionen snap fået fat i alle parametrene. ... og så det du ellers har i funktionen snap.
Ups. jeg kom til at skrive '2' efter numParam, hvor det skulle stå efter nr 2 refParam function kaldesOnMouseOut( refParam, strParam, strParam2, boolParam, refParam2, numParam ) {
betyder det at jeg skal ændre selve js. når jeg skal sætte dette ind. function snap( navn, strParam, strParam2, boolParam, numParam2 ) { var refParam = window[navn].refParam; var refParam2 = window[navn].refParam2; delete window[navn];
så skal der slet ikke ændres i din funktion snap. men til gengæld vil der akkumulere en masse gamle objekter i window fordi vi aldrig frigiver de window[navn] objekter vi laver. Det er en memory leak som gradvist æder din ram. OK hvis funktionen 'kaldesOnMouseOut' kun bliver kaldt et par tusind gange, men det kan crashe browseren hvis den kaldes for mange gange.
er det denne funktions definition du mener: function snap( navn, strParam, strParam2, boolParam, numParam2 ) { begge parametrene refParam og refParam2 bliver fundet igennem navn, så der er fjernet 2 parametre og erstattet med en.
når du skriver et script i <head sektionen bliver de variable og funktioner de definerer lagt i rammens window objekt:
<script type='text/javascript'>
var tal = 25 var streng = "diesellokomotiv";
function lokoNummer() { var lokaltTal = tal; gadVidsthvor = 123456; alert( streng +" #" +lokaltTal ); window['global'+14] = 1234567890; } // de kan adresseres på mange måder: alert( tal +"\n" +window.tal +"\n" +window['tal'] ); lokoNummer(); alert( global14 +"\n" +window.global14 +"\n" +window['global'+14] ); alert( gadVidsthvor ); // 'undefined' i NS, '123456' i IE :( alert( lokaltTal ); // 'undefined' i både NS og IE
</script>
variablen lokaltTal ligger ikke i window objektet, den ligger i funktionens objekt. ved at skrive var foran sikrer vi at den bliver oprettet i 'dette' objekt linien gadVidsthvor = 123456; opretter også en variabel, men der forskellige browsere er lidt ueninge om hvilket objekt den variabel skal placeres i. EcmaScript og Javascript placerer den i funktionens objekt, IE placerer den i vinduets objekt. Det er en af de små forskelle man nemt kan slå sig selv i hovedet med når man programmerer. Når jeg skriver window['global'+14] = ny værdi er det for at være SIKKER på at variablen global14 bliver oprettet i vindues objektet.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.