ugrás a tartalomhoz

Javascript függvény tervezése

zoliky · 2008. Jún. 14. (Szo), 15.18
Szeretnek egy fuggvenyt letrehozni:

function myf(rowNum)
{
   // kod
}
A fuggvenyt ket esetben fogom meghivni:

1. Az elso esetben szeretnek egy egesz szamot kuldeni a "rowNum" valtozo segitsegevel.
myf(4);
2. A masodik esetben a fugvenynek szeretnek atadni tobb egesz szamot, peldaul igy:
myf(1,2,3,4);
Kesobb a tobb erteku sort felbontom split()-el.

Azt szeretnem kerdezni, hogy mind a ket esetben a "rowNum" valtozo tomb kell legyen ? Akkor is ha egy erteket tarol? En valtozo kent szeretnem atadni mindig az ertekeket:
var rowNum = 1;
myf(rowNum);

vagy

var rowNum = 1,2,3,4;
myf(rowNum);
Velemenyetek szerint, hogy kene csinalni a fugvenyt?

Koszonom!
 
1

Tömb vagy arguments

Török Gábor · 2008. Jún. 14. (Szo), 15.55
Attól függ, mit fog a függvényed csinálni? Lehet, hogy érdemesebb két függvényre bontani, bármi. Egyfelől jó megoldás, ha a változó számú argumentumot egy tömbbe burkolod, vagy másik járható út, hogy a függvényen belül elérhető arguments változóból ki tudod mazsolázni az átadott paramétereket.
2

Ha arguments...

Ustak · 2008. Jún. 14. (Szo), 19.50
Ha az argumentset választod, vigyázz vele, mert egy speciális tömb, nincsenek benne az ismert metódusok (bár van length értéke). Ha mégis használni akarod, a .call vagy .apply metódusokkal "ellophatod" az Array metódusait. Pl:

function fuggvenyOpcionalisOpciokkal() {
 var opciok={};
 var egyebek=arguments;
 //lopjuk el a "slice"-t az Array.prototype-tól
 var slice=Array.prototype.slice; 
 if (typeof arguments[arguments.length-1]== 'object') {
    opciok=arguments[arguments.length-1];
    egyebek=slice.call(arguments,1); //hívás!
 }
 //ide meg egyéb kód
}
//hívás:
fuggvenyOpcionalisOpciokkal(1,3,4,{opcio:'izé'});
fuggvenyOpcionalisOpciokkal(1,3,5);
fuggvenyOpcionalisOpciokkal(1,{opcio:'megintizé'});
3

[gondolkodik]

toxin · 2008. Jún. 14. (Szo), 21.41
nem egyszerűbb tömböt csinálni belőle?

               var args = [];
               for (var i=0;i<arguments.length;i++) args.push(arguments[i]);
üdv Csaba
4

De!

Ustak · 2008. Jún. 14. (Szo), 21.53
viszont akkor is érdekes hogy az arguments tömb nem teljesen tömb :)
5

nem oldhato meg igy ? :

zoliky · 2008. Jún. 16. (H), 00.30
Ha peldaul egyetlen egy szamot kuldok at, helyes igy tombot csinalni belole ? :
var rowId = [this.id]; // tomb keszitese

function myf(rowId)
{
  for (var i=0; i<rowId.length; i++)
  {
    alert(rowId);
  }
}
6

Talan ez jobb megoldas!

zoliky · 2008. Jún. 16. (H), 12.07
Talan jobb ha nem adok at tombot a fuggvenynek. Egy "for" ciklusba rakom eloszor a tombot es ha szukseg van ra meghivom a fuggvenyt tobszor:
init: 
{
  // Simulate cookie
  var tomb = [1,2,3,4]
  for (var i=0; i<tomb.length; i++)
  {
       Accordion.expandCollapse(tomb[i]);
  }
}

expandCollapse: function(rowID)
{
   // Itt mar azt csinalok az ertekel amit akarok
}
Meg nem probaltam ki de azt hiszem jobb megoldas nincs. A szkript elvileg elenorzi, hogy melyik tablazat sorokat (TR) kell becsukni.
Mondjuk az ismetlodes elege sok, de azert szamitogep, hogy elvegeze :)
7

Most nem értem....

Ustak · 2008. Jún. 16. (H), 19.34
Akkor ez most valami lenyíló menü, vagy harmonika lesz? Akkor javasolnám a jquery JavaScript függvénykönyvtárat, vagy egy másikat (Prototype) amivel két sorból meg tudod oldani az ilyen problémákat :-)
8

első hozzászólásbeli

toxin · 2008. Jún. 16. (H), 20.38
megoldással mi volt a gond?

             Accordion = {
                init: function()  
                 {  
                   // Simulate cookie  
                   var tomb = [1,2,3,4]  
                   this.expandCollapse(tomb);
                   tomb = 3;
                   this.expandCollapse(tomb);
                 },
                   
                expandCollapse: function(){  
                    var params = [];
                    for (var i=0;i<arguments.length;i++) params.push(arguments[i]);  
                    // Itt mar azt csinalok a params-al amit akarok
                    for (var i=0;i<params.length;i++){
                        alert(params[i]);
                    };
                }
            }            
            Accordion.init();
???

természetesen nem muszáj valódi tömböt fabrikálni a függvényparamétereket tartalamazó arguments (array like object)-ből
            Accordion = {
                init: function()  
                 {  
                   // Simulate cookie  
                   var tomb = [1,2,3,4]  
                   this.expandCollapse(tomb);
                   tomb = 3;
                   this.expandCollapse(tomb);
                 },
                   
                expandCollapse: function(){  
                    for (var i=0;i<arguments.length;i++){
                        alert(arguments[i]);
                    };
                }
            };            
            Accordion.init();
                       
        
ha ennyi is elég

üdv Csaba