Avatar billede razmuz_dk Nybegynder
05. december 2004 - 17:33 Der er 11 kommentarer og
1 løsning

flush() i javascript?

Hej Eksperter

Jeg står med en forholdvis tung funktion. Funktionen åbner eller lukker en masse mapper (nogle gange over 100) og virker på samme måde som stifinder - reelt set sætter den bare style.display='none' eller '' på websiden. PRoblemet er blot hvis man trykker på "plus" (for at folde alle underliggende mapper ud) fryser browseren i ca. 5-10 sekunder fordi den skal folde alle mapperne ud.

Findes der en funktion i Javascript der "flusher" det resultat man er nået til "nu", så den ikke fryser browseren i flere sekunder, men i stedet udfører funktionen gradvist.

Håber i forstår.

PS: Med flush() mener jeg flush-funktionen fra PHP

mvh. Rasmus
Avatar billede olebole Juniormester
06. december 2004 - 00:24 #1
<ole>

Nej, det findes ikke - men med mindre, der er tale om et vanvittig stort træ med 1000-vis af noder, lyder det somom, du bør optimere din JavaScript-kode.

/mvh
</bole>
Avatar billede razmuz_dk Nybegynder
09. december 2004 - 16:50 #2
Hej Ole

Det kan godt være min kode ikke er helt optimalt. Hvis du har tid/lyst kan du prøve at kigge på mine funktioner her. Du behøver ikke sætte dig 100% ind i scriptet (det kan måske være lidt svært at forstå??), men hvis du bare kunne sige om jeg henadvejen laver nogle dumme fejl der tager meget "kraft" eller om du umiddelbart kan se nogle smarte alternativer, ville det være kanont dejligt.


Her kommer scriptet:
    stop_by = new Array();
    var current_action;
   
    function swap(start_by,stop_by) {
        if(!stop_by) {
            alert('Folde-ud funktionen for denne mappe er endnu ikke klar. Lad siden loade.');
        } else {
            i2=0;
            for(i=start_by;stop_by>=i;i++) {
                if(document.getElementById('div_'+i)) {
                    if(document.getElementById('div_'+i).style.display=='' || current_action=="closing") {
                        if(!current_action) current_action="closing";
                        setTimeout("close_dir("+i+");",i2*10);
                        close_dir(i);
                    } else if(document.getElementById('div_'+i).style.display=='none') {
                        if(!current_action) current_action="opening";
                        setTimeout("open_dir("+i+");",i2*10);
                        open_dir(i);
                    }
                    i2++;
                }
            }
        }
        current_action="";
    }
    function open_dir(start_by) {
        document.getElementById('div_'+start_by).style.display='';
        document.getElementById('operator_'+start_by).src='gfx/minus.gif';
        document.getElementById('img_'+start_by).src='gfx/dir_open.gif';
    }
    function close_dir(start_by) {
        document.getElementById('div_'+start_by).style.display='none';
        document.getElementById('operator_'+start_by).src='gfx/plus.gif';
        document.getElementById('img_'+start_by).src='gfx/dir_closed.gif';
    }
Avatar billede olebole Juniormester
09. december 2004 - 17:16 #3
Det kommer helt anpå, hvad det er, du skal bruge det til. Da du har mange elementer, der skal behandles, bør du nok overveje at lave det objekt orienteret.
OOP (Objekt Orienteret Programmering) er dog en meget anden måde at programmere på, så det er ikke lige til at forklare i korte træk - der er en hel del faldgrubber  :)
Avatar billede olebole Juniormester
09. december 2004 - 17:18 #4
Med "Det kommer helt anpå, hvad det er, du skal bruge det til" mente jeg antallet af noder ... jeg kan godt se, det er et filtræ  ;o)
Avatar billede razmuz_dk Nybegynder
09. december 2004 - 17:21 #5
Okay, jeg kender "alt" til OOP i PHP - så'n da :) ... har aldrig brugt det i JS? - kunne du evt. komme med et eksempel? :)
Avatar billede powernodes Nybegynder
09. december 2004 - 17:41 #6
Grundlæggende er OOP principperne de samme.

Helt simpelt kan du oprette et object og tildele properties og metoder sådan:

var Bil = new Object();
Bil.navn = "VW";
Bil.farve = "Rød";

Bil.Start = function() {
  this.state = "tomgang";
}


Du kunne også kigge på Prototype propertien i javascript.
Lille eks:

function Bil() {
  this.Init();
}

Bil.prototype.Init = function() {
  this.navn = "VW";
  this.farve  = "Rød";
  alert("Mærke: " +this.navn + "\nFarve: "+ this.farve);
}

window.onload = function() {
  Bilen = new Bil();
}
Avatar billede powernodes Nybegynder
09. december 2004 - 18:08 #7
Iøvrigt har jeg også en treemenu, ikke OOP men heller ikke langsom selv med mange data:

http://powernodes.dk/powernodestreemenu/
Avatar billede olebole Juniormester
09. december 2004 - 18:46 #8
*host-host* grundlæggende er de to temmelig forskellige. PHP er klasse-baseret og JavaScript er prototype-baseret og det giver en anden måde at arbejde på  :)

razmuz_dk >> Det vigtige er, at du får opbygget et JS-objekt som din data-struktur - og som indeholder alle metoder. HTML'en på siden er blot 'håndtag' til JS-maskinen - og al manipulering af visningen foregår fra objektet, hvor HTML-elementerne indgår som properties.
At vise et godt DHTML eksempel, kan hurtigt gå hen og blive en tidskrævende ting  :)
Avatar billede powernodes Nybegynder
09. december 2004 - 19:02 #9
hehe, tankegangen er den samme.
Jeg vil nu også mene at den klassebaserede er den "rigtige" - men nu starter jeg sikkert en lille envejs dialog hæhæ =oD
Avatar billede olebole Juniormester
09. december 2004 - 19:32 #10
Med al respekt, Peter ... hele kernen i OOP er nedarvning og hieraki. Her er klasse- og prototype-baseret tankegang fundamentalt forskellig - hvilket de fleste netop oplever ved overgang mellem PHP og JS (eller omvendt)  :)
Avatar billede razmuz_dk Nybegynder
29. januar 2005 - 16:20 #11
Mange tak for de gode råd, nogen der vil have point?
Avatar billede razmuz_dk Nybegynder
11. april 2005 - 14:10 #12
... jamen så lukker jeg selv :P
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