[JS] code performance

Pagina: 1
Acties:

  • Justice
  • Registratie: Maart 2001
  • Laatst online: 07-08-2025
Ik gebruik onderstaande code om door een select list te lopen en daarin bepaalde option elementen naar een hidden list te schuiven. dit moet zo snel mogelijk gebeuren. Echter bij duizenden elementen duurt dit een paar seconden. Ik heb door benchmarken uitgevonden dat de onderstaande code de boel vertraagt, maar ik kan het zelf niet sneller krijgen dan dit.

De select lists worden al verborgen, alle opties worden naar een document fragment gestuurd die dan ergens anders aangeplakt wordt. Kan ik op een snellere manier door een lange lijst lopen en een conditie checken? zoiets van "voor elke a=b binnen de lijst" ipv onderstaande. Zijn er andere manieren?

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// JavaScript Document
// srcOpt = selection list options
// f = document fragment
// deze code in onderdeel van code die wordt aangeroepen wanneer een gebruiker 
// een groot select menu filtered door middel van keyboard input (ala google search as you type)


    switch(moveType.toLowerCase()){
        case "selected": {
            for(var i = 0;i < srcLength;i++) {
                if(srcOpt[i].selected == true ){
                    srcOpt[i].selected = false;
                    f.appendChild(src.removeChild(srcOpt[i]));
                    srcLength = srcOpt.length;
                    i--;    
                }
            }
            break;
        }
        case "isvalue", "istext": {
            for(var i = 0;i < srcLength;i++) {
                if(srcOpt[i][Mid(moveType,2,999)].toUpperCase().indexOf(theInput) != -1){
                    srcOpt[i].selected = false;
                    f.appendChild(src.removeChild(srcOpt[i]));
                    srcLength = srcOpt.length;
                    i--;    
                }
            }           
            break;
        }
        case "isnotvalue", "isnottext": {
            for(var i = 0;i < srcLength;i++) {
                
                if(srcOpt[i][Mid(moveType,5,999)].toUpperCase().indexOf(theInput) == -1){
                    srcOpt[i].selected = false;
                    f.appendChild(src.removeChild(srcOpt[i]));
                    srcLength = srcOpt.length;
                    i--;    
                }
            }
            break;
        }
        case "moveonly": {
            for(var i = 0;i < srcLength;i++) {
                srcOpt[i].selected = false;
                f.appendChild(src.removeChild(srcOpt[i]));
                srcLength = srcOpt.length;
                i--;    
            }
            break;
        }
        default:
            document.write ("Unknown move command (internal error).<br>");
            break;
    }

Human Bobby


  • storeman
  • Registratie: April 2004
  • Laatst online: 14-02 13:38
Kun je de value van de selectbox niet uitlezen, en op die manier eerst de if() toe passen en vervolgens de for-loops (als die dan nog nodig zijn). Met behulp van het .value attribuut zou je volgens mij direct de waarde van een selectbox uit moeten kunnen lezen.

Op die manier kun je veel zoekwerk vermijden.

"Chaos kan niet uit de hand lopen"


  • storeman
  • Registratie: April 2004
  • Laatst online: 14-02 13:38
Schiet me net te binnen. Is de .selected property van een selectbox geen array, zodat je kunt zien welke waarden er geselecteerd zijn. Of misschien moet je met .value werken. Ik denk namelijk dat je op die manier wel kunt zien wat er geselecteerd is en wat niet. Dat scheelt wat for-loopjes

"Chaos kan niet uit de hand lopen"