Function arguments

Status
Niet open voor verdere reacties.

Snarffy

Gebruiker
Lid geworden
23 okt 2009
Berichten
35
Geacht Forum,

Ik heb het volgende probleem:

in een functie met onderstaande naam

function ChangeRowInvisiblebyId(Id,Ide,Gene,Idnr)

heb ik o.a. de onderstaande regels staan:

CellId="Obj"+Idnr;
document.getElementById(CellId).onmousedown=function(){ChangeRowVisiblebyId(Id,Ide,Gene,Idnr);};

De bedoeling is dat het event onmousedown na een volgende activering een andere functie aan gaat roepen (t.w. ChangeRowVisiblebyId) met dezelfde argumenten (Id,Ide,Gene,Idnr). Dit is niet het geval omdat niet de waarde van de variablen Id, Ide,Gene en Idnr overgenomen worden maar de naam van de variablen ('Id', 'Ide' enz dus). Kan iemand mij vertellen hoe dit op te lossen ?

Met vriendelijke Groet

Snarffy
 
Dit is niet het geval omdat niet de waarde van de variablen Id, Ide,Gene en Idnr overgenomen worden maar de naam van de variablen
hmm, daar heb ik nog nooit van gehoord. Neem bijvoorbeeld dit (test!) script:
HTML:
<html>
<body>
<script>

function ChangeRowInvisiblebyId(Id,Ide,Gene,Idnr)
{
   document.onmousedown = function()
                          {
                             alert(Id + "\n" + Ide + "\n" + Gene + "\n" + Idnr);
                          }
}


ChangeRowInvisiblebyId('x','y','z','o');
</script>
</body>
</html>
(dingestest.html)
het werkt gewoon goed, ik zie gewoon x, y, z en o verschijnen.



:thumb:
 
Kijk dit is mijn scriptje:

<SCRIPT LANGUAGE="JavaScript">
function ChangeRowInvisiblebyId(Id,Ide,Gene,Idnr)
{
<![CDATA[
var CellId="Obj"+Idnr;
alert (document.getElementById(CellId).onmousedown);
document.getElementById(CellId).onmousedown=function(){ChangeRowVisiblebyId(Id,Ide,Gene,Idnr);};
alert (document.getElementById(CellId).onmousedown);
]]>
}
</SCRIPT>


en de output van de alerts is:

function onmousedown()
{
ChangeRowInvisiblebyId('23','28','10','1215')
}

function(){ChangeRowVisiblebyId(Id,Ide,Gene,Idnr);}
 
Ja, natuurlijk. Dit komt hierdoor:

[JS] document.getElementById(CellId).onmousedown=function(){ChangeRowVisiblebyId(Id,Ide,Gene,Idnr);};[/JS]
--> onmousedown is nu een object (zoals alle dingen in Javascript). Maar, specifieker, het is een fucntie-object.

Als je een functie object alert, dan krijg je de code van het functie-object te zien. In jou geval dus
[JS]function onmousedown()
{
ChangeRowInvisiblebyId('23','28','10','1215')
}

function(){ChangeRowVisiblebyId(Id,Ide,Gene,Idnr);}[/JS]
Ik weet dus niet waarom je er 2x een alert() in hebt, maar die kan je weghalen.




:thumb:
 
Functie argumenten

Bedankt voor je snelle antwoorden.

Ik heb deze functie als voorbeeld gemaakt met twee alerts, de eerste alert laat zien hoe het object er uitziet vlak na de aanroep en de tweede laat hetzelfde object zien nadat ik het gewijzigd heb.
 
Okay.

Nou, helemaal goed, maar ik snap nogsteeds je probleem niet. Nouwja, ik snap het wel, maar ik snap niet waarom dit zo is.

Kan je anders a). een voorbeeld online zetten of b). een standalone demo posten?


:thumb:
 
Bedoel je dit ?

ik heb onderstaand scripje als voorbeeld gemaakt en dit blijkt te werken, probleem zit hem dus niet in de verschillen welke de alerts laten zien. (ook hier zie je verschillen in de alerts)

Ik zal het probleem van m'n originele script dus ergens anders moeten zoeken, bedankt voor de moeite !

Gr Snarffy

HTML:
<HTML>
<HEAD>
[JS]<SCRIPT LANGUAGE="JavaScript">
function ChangeRowInvisiblebyId(Id,Ide,Gene,Idnr)
{

var Idenum=parseInt(Ide)-1;
var CellId="Obj"+Idnr;
alert (document.getElementById(CellId).onmousedown);
for(i=Idenum;i>Id;i--)
{
document.getElementById(i).style.display = "none";
}
document.getElementById(CellId).onmousedown=function(){ChangeRowVisiblebyId(Id,Ide,Gene,Idnr);};
alert (document.getElementById(CellId).onmousedown);
}
</SCRIPT>
[/JS]

[JS]<SCRIPT LANGUAGE="JavaScript">
function ChangeRowVisiblebyId(Id,Ide,Gene,Idnr)
{
var Idnum=parseInt(Id)+1;
var CellId="Obj"+Idnr;
alert (document.getElementById(CellId).onmousedown);

for(i=Idnum;i<Ide;i++)
{
document.getElementById(i).style.display = "block";
}
document.getElementById(CellId).onmousedown=function(){ChangeRowInvisiblebyId(Id,Ide,Gene,Idnr);};
alert (document.getElementById(CellId).onmousedown);
}
</SCRIPT>[/JS]

HTML:
</HEAD>
<BODY>
<TABLE>
<TR id='1'>
<TD id="Obj1215" onMouseDown="ChangeRowInvisiblebyId(1,4,10,1215)">
TEST</TD>
</TR>
<TR id='2'>
<TD>
ROW2
</TD>
</TR>
<TR id='3'>
<TD>
ROW3
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
 
Het werkt hier inderdaad ook goed!

Echter - het kan iets efficienter. Het idee is als volgt: je 2 functies (invisible en visible) doen hetzelfde, alleen de een zet de display op block, de andere op none. Neem als voorbeeld deze functie:
[JS]function changeDisplay(id,ide,gene,idnr)
{
var nID, cellid, i, tmp;

nID = parseInt(id) + 1;
cellid = 'Obj' + nID;

for(i=nID;i<ide;i++)
{
tmp = document.getElementById(i).style;
tmp.display = (tmp.display == "none") ? "block" : "none";
}

document.getElementById(cellid).onmousedown = function()
{
changeDisplay(id,ide,gene,idnr);
}
}[/JS]
En je html blijft hetzelfde, behalve de naam:
HTML:
<TD id="Obj1215" onMouseDown="changeDisplay(1,4,10,1215)">
Wat dit doet is precies hetzelfde als die van jou; echter, het switched de 'block' en 'none' om met deze regel(s):
[JS] tmp = document.getElementById(i).style;
tmp.display = (tmp.display == "none") ? "block" : "none";[/JS]
Uitleg: tmp is even de style-property van die row. Dan zeg je, zet deze display op "block" als ie nu "none" is, en anders op "block".


:thumb:


[edit]firefox geeft een error, maar ik weet niet precies waarom. Het werkt wel, maar hij kent een paar rows niet - komt denk ik door de html / functieaanroep. Code werkt verder goed :)[/edit]
 
Laatst bewerkt:
Vegras, bedankt voor je antwoord. Ik ga met jouw oplossing aan de slag !

Gr Snarffy
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan