Avatar billede mtv Nybegynder
13. januar 2001 - 15:35 Der er 3 kommentarer og
1 løsning

Brug af samme værdi

Er der nogen der ved hvordan man kan få dette script til at være ligeglad med om der er flere \"childs\" med samme værdi.
var NS4 = (document.layers)?true:false;
var IE4 = (document.all)?true:false;
   
function _struct(child,childcaption,parent){
this.child = child;
this.childcaption = childcaption;
this.parent    = parent;
}
function _addobject(child,childcaption,parent){
var obj = new _struct();
obj.child = child;
obj.childcaption = childcaption;
obj.parent = parent;
return(obj);
}
function insertEntry(child,childcaption,parent){
    if(child.length > 0 ){       
        for(var i=0;i<this.length;i++)
            if(this.items[i].child == child)
                return;           
        this.items[this.length++] = _addobject(child,childcaption,parent);       
    }
}
function OptionCollection(){
this.length=0;
this.items = new Object();
this.Add=insertEntry
}

function clearSelect(oSelect){
var iCount=0;
if(!oSelect) return;
iCount = oSelect.options.length;
for(var i=0;i<iCount;i++){
    if(IE4)
        oSelect.options.remove(0);
    else if(NS4)
        oSelect.options[0]=null;
}
}
function addOptions(oSelect,olist,parent){
    var elOption;
    var idxSelect=0;   

    //check arguments.
    if((!olist) || (!oSelect))return;       
    if(parent.length <=    0)     return;
                   
    //now looop through all the list items only entering relevant options.
    clearSelect(oSelect);   
   
    //add a blank list
    elBlankOption = new Option();
    elBlankOption.text = \"\";
    if(NS4) oSelect.options[0] = elBlankOption
    else if(IE4) oSelect.options.add(elBlankOption,0)
   
    elBlankOption.value = \"\";
    for(var i=0;i<olist.length;i++){       
        //only the child entries of the parent               
        if(olist.items[i].parent == parent){                                   
            elOption = new Option();
            //now IE and NS have a different way to handle object creation.
            if(NS4){                       
                elOption.value = olist.items[i].child
                elOption.text = olist.items[i].childcaption
                oSelect.options[idxSelect] = elOption               
            }else if(IE4){               
                elOption.value = olist.items[i].child
                elOption.text = olist.items[i].childcaption
                oSelect.options.add(elOption,idxSelect)                   
            }                       
            idxSelect++;
            delete(elOption);
        }           
    }   
}

function clearOptions(szSelect,szForm){
if(szSelect.length <= 0 || szForm.length <=0)
    alert(\"error:clearOption must pass arguments\");   
if(IE4)
clearSelect(document.all.item(szSelect));
else if(NS4)
clearSelect(eval(\'document.\' + szForm + \'.\' + szSelect));
}

function listAllOptions(szSelect,szForm,olist){
    var elOption;
    var idxSelect=0;
    var oSelect = new Object();
           
    //check arguments.
    if(!olist)return;           
   
    if(IE4)
        oSelect = document.all.item(szSelect);
    else if(NS4)
        oSelect = eval(\'document.\' + szForm + \'.\' + szSelect);
   
    if(!oSelect)return;           
                       
    //now looop through all the list items entering all
    clearSelect(oSelect);
    for(var i=0;i<olist.length;i++){                           
        elOption = new Option();
        //now IE and NS have a different way to handle object creation.
        if(NS4){                       
            elOption.value = olist.items[i].child
            elOption.text = olist.items[i].childcaption
            oSelect.options[idxSelect] = elOption               
        }else if(IE4){               
            elOption.value = olist.items[i].child
            elOption.text = olist.items[i].childcaption
            oSelect.options.add(elOption,idxSelect)                   
        }                       
        idxSelect++;
        delete(elOption);                   
    }   
}

function UpdateSelect(szSelect,szForm,szParent,olist){
if(IE4)
addOptions(document.all.item(szSelect),olist,szParent);
else if(NS4)
addOptions(eval(\'document.\' + szForm + \'.\' + szSelect),olist,szParent);
}
Avatar billede jakoba Nybegynder
13. januar 2001 - 15:49 #1
i og med at din datastruktur er bygget på en formodning om at der er en ordensrelation mellen alle childs (  childA < childB ) er der næste nædt til at være en forkel.

Det er et almindeligt problem og løses som regel ved at tilføje et løbenummer som et mere eller mindre skjult felt i databasen. Og så chekker på begge felter når der skal sammenlignes. Det er en af grundene til at alle varer har et \"varenummer\"

Andre gange vælger man at sige \"Det er nok den samme idiot der prøver at melde sig på igen\", og smider så blot dubletten væk. Det afhænger af situationen

mvh JakobA
Avatar billede jakoba Nybegynder
13. januar 2001 - 16:12 #2
I din insertEntry() funktion siger du

for(var i=0;i<this.length;i++)
  if(this.items[i].child == child)
    return;

det er metode nr 2. Hvis den allerede findes så lad være med at idsætte igen.

for at skifte til metode et kunne du evt skrive _struct() og insertEntry() om til:

var lobeNummer = 0;        // ny extra variabel for at sikre at alle child er forskellige.

function _struct(child,childcaption,parent){
this.child = child;
this.nummer = lobeNummer++;  // unikt nummer for denne _struct
this.childcaption = childcaption;
this.parent    = parent;
return this;
}

Jeg har indsat et \"return this;\" i _struct. på den måde bliver
    en-variabel  =  _addobject(child,childcaption,parent);
overflødig og kan erstattes med
    en_variabel =  new _struct(child,childcaption,parent);

function insertEntry(child,childcaption,parent){
if(child.length > 0 ){
//testen er nu overflødig     
//  for(var i=0;i<this.length;i++)
//    if(this.items[i].child == child)
//      return;           
  this.items[this.length++] = new _struct(child,childcaption,parent);       
  }
}

Alle steder hvor du sammenligner to child verdier skal du nu sammenligne (child,nummer) par istederfor.

fx bliver
  if (  childA < childB ) { ... };
til
  if (  ( childA < childB )                      // som før
      ||                                              // eller
        (    ( childA = childB )                // samme child
        &&                                          // og
            ( nummerA < nummerB )        // anderledes nummer.
        )
    )  { ... };

Det nemmeste er nok at lave en funktion til at sammenligne :-))

mvh JakobA

Avatar billede mtv Nybegynder
13. januar 2001 - 17:43 #3
Hejsa Jeg har endnu ikke prøvet det, men umiddelbart er jeg ikke sikker på at det vil virke. Grunden er at jeg glemte at fortælle at værdien (child) senere skal bruges til at kalde en ny side. Værdien hedder derfor ***.htm og derfor vil den vel med dit forslag kalde 1***.htm. Eller er det bare mig der er galt på den ???
Avatar billede jakoba Nybegynder
13. januar 2001 - 18:18 #4
Lidt ja. Løbenummeret bliver gemt i et separat felt (det nye  der hedder nummer). feltet child bliver der slet ikke ændret på, det indsættes og kan bruges som det plejer (blot flere gang med samme filnavn)

mvh JakobA
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester