Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    aggiornare una lista (<select) velocemente

    Ho una struttura a frame. In quello di sinistra ho una certa pagina server, A.asp, che contiene un dropdown (<select) che, per motivi di test, contiene 10.000 elementi.
    La tabella Access che alimenta il dropdown, può venire modificata anche in altre pagine. Da cui la necessità di aggiornare contemporaneamente il dropdown della pagina A.asp.

    Ho pravato in tre modi diversi.

    1) nella pagina A.asp metto un iframe nascosto, e vi lancio una pagina, B.asp col suo bel DropDown. Nell'evento load, lancio una funzione javascript di A.asp passando come parametro il <select aggiornato. Da qui, aggiorno il <select originale, con i soliti metodi. Il tutto funziona bene, ma con 10.000 voci, ci impiega circa 3 minuti che sono ovviamente inaccettabili.

    2) nella pagina A.asp faccio una chiamata AJAX che mi restituisce un file xml fatto di 10.000 record di Text e Value, tale da ricostruire il <select. Rispetto a prima ottengo un tempo superiore di circa 10%, ovviamente ancora più inaccettabile.

    3) se faccio il refresh della pagina A.asp, nel modo più tradizionale possibile ottengo un tempo di soli circa 2-3 secondi (3 secondi contro 3 minuti )

    Ed ecco allora la mia domanda, più una curiosità che altro: è possibile dati due <select, select1 e select2, ricopiare in tempi accettabili uno nell'altro. :master:

    Non so se mi sono spiegato Ciao
    Pietro

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Non so se ho capito. Provo a riassumere.
    Se aggiorni una <select> tramite JS prendendo i dati da un'altra pagina presente nel browser impieghi 3 minuti; se invece fai un aggiornamento semplice del frame impieghi 3 secondi.

    Domande (cattive):
    1. Con che processore stai lavorando? 3 min mi sembrano un po' troppo, se non hai un processore particolarmente lento.
    2. Con che rete stai testando? 3 sec per una select di 10000 opzioni mi sembrano pochi: stai testando su rete locale? Che succede se uno ha un collegamento a 56 KB? Quanti KB e` la pagina che contiene la select?


    Proposta: se le cose stanno come dici, ti conviene far ricaricare la pagina. Potresti usare il frame nascosto per metterci solo un flag: viene ricaricato abbastanza frequente, ma contiene solo una variabie JS, che viene settata a true se ci sono state modifiche del database dall'ultima ricarica della pagina.
    In caso di true, il frame ordina il ricaricamento della pagina con la select.
    (spero di essermi spiegato).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Mi fa picere che ci sia qualcuno nell'ora del bisogno

    1) seguirò naturalmente il tuo consiglio (non c'è ajax che tenga con tre secondi contro tre minuti )

    Hai capito benissimo. Lavoro in una intranet aziendale, prima in locale poi sul server, con processori normali.

    Giusto per capirci, la pagina B.asp di supporto, lanciata in circa 3 secondi, nell'evento load lancia una funzione del chiamante, così:
    codice:
    function window_onload() 
    {
    	if(window.parent.callback_aggiorna_dropdown_pratiche)
    		window.parent.callback_aggiorna_dropdown_pratiche(document.getElementById("id_pratica_select1"), self.id_pratica_vettore);
    }
    Gli passo una select e un vettore

    La pagina ricevente ha la funzione callback_aggiorna_dropdown_pratiche

    codice:
    function callback_aggiorna_dropdown_pratiche(lista, vettore)
    {
    	//una volta creato il dropdown e il vettore di ricerca aggiornato delle pratiche,
    	//la pagina aggiorna_dropdown_pratiche.aspx li spedisce a questa funzione che
    	//aggiorna il dropdown pratiche ed il suo vettore
    	var i;
    	id_pratica_vettore.length = 0;
    	for(i = 0; i < vettore.length; i++)
    		id_pratica_vettore[i] = vettore[i];
    	
    	var v = document.getElementById("id_pratica_select1");
    	var v1 = v.options;
    	for (i = v1.length - 1; i >= 0; i--) v.remove(i);
    	for(i = 0; i < lista.options.length; i++)
    		v.options[i] = new Option(lista.options[i].text, lista.options[i].value);
    	
    	document.getElementById("aggiorna_pratica").disabled = false;
    	df = new Date();
    	alert((df.getTime() - di.getTime())/1000);
    }
    che credo sia giusto
    Pietro

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Non so esattamente cosa sia Ajax, ma credo sia un sistema lato server che interagisce con il lato client anche durante la visualizzazione di una pagina: in pratica tiene aperto un canale. Credvo che questo lo facessero solo le applet, ma da alcuni giorni vedo che Ajax sta invadendo.

    Certo che un sistema cosi` ha bisogno di una serie di colloqui tra server e client (il tenere aperto il canale ha un certo costo, in termini di banda), anche se un fattore 60 mi suona strano.

    Non ho motivo di dubitare del tuo script (anche se la parte di cancellazione potrebbe non servire), ma piuttosto penso che il tempo vada perso durante il ricaricamento della pagina nascosta.

    Comunque prova a rispondere a tutte le domande "cattive" (hai risposto ad alcune, ma non a tutte): e prova su un altro processore (piu` recente?)
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Credo di avere trovato la soluzione alla domanda: forse può essere utile ad altri.

    Allora, sia che si usi ajax, sia che si usi il metodo più tradizionale su menzionato, faccio solamente uso di innerHTML. Punto e basta.

    Detto in altri termini, copiare un <select in un altro <select scorrendo gli elementi uno per uno, è una operazione lunghissima. Recuperare innerHTML e sostituirlo è ... velocissimo.

    Ho creato una lista con i comuni italiani (circa 8101) ed il tempo di caricamento lato client è stato di appena... 200 millisecondi. Il tempo di richiamo pagina server non è calcolato, ma è anche questo molto veloce

    Ciao
    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.