Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606

    [DOM] leggere il testo di un'ancora in una lista

    Ciao
    come da titolo ho bisogno di identificare una determinata ancora in una lista non ordinata che ne contiene un certo numero.
    esempio:
    codice:
    // creo la lista così come mi viene presentata da remoto tramite una chiamata ajax che ritorna un json:
    ...............................
    ... snip altro codice ....
    ...............................
    var ret = JSON.parse(o.responseText),
    s = document.getElementById('suggerimento_'+id),
    ul = document.createElement('ul'),
    list = new Array();
    
    if (s.hasChildNodes()) {	//	rimuove i nodi eventualmente presenti
    	for (var i = 0, n = s.childNodes.length; i < n; i++) {
    		s.removeChild(s.childNodes[i]);
    	}
    }
    for (var i = 0, n = ret.length; i < n; i++) {	//	Crea la lista con i nodi
    	list[i] = document.createElement('li');
    	var a = document.createElement('a');
    	a.appendChild(document.createTextNode(ret[i].Com));
    	a.id = 'a'+i;
    	a.setAttribute('href', '#suggerimento_'+id);
    	
    	a.onclick = function() {
    		document.getElementById(id).value = a.childNodes[0].nodeValue;
    		s.style.display = 'hide';
    	}
    	list[i].appendChild(a);
    	ul.appendChild(list[i]);
    }
    s.appendChild(ul);
    s.style.display = 'block';
    ..............................
    ... snip altro codice ...
    ..............................
    Ora a dire il vero il listato funziona fino ad un certo punto, ovvero, se fate click su una qualsiasi dei "link" presentati nel "suggeritore" viene sempre e comunque letto l'ultimo a prescindere da ciò che avete chiesto.
    Il motivo è che document.getElementById(id).value = a.childNodes[0].nodeValue; da sempre come risultato l'ultima ancora della lista di link.
    Ho anche pensato di modificare lo script in modo da prendere il testo dell'ancora non tramite childNodes ma attraverso l'id dell'ancora stessa, modificando lo scrpt in modo che diventi qualcosa come.... document.getElementById(id).value = document.getElementById['a1'].nodeValue; dove ovviamente a1, a2, aX vengono inseriti dinamicamente al momento della creazione della lista.
    Ammetto che quest'ultima opzione mi è venuta in mente proprio ora ragionando sul topic che sto scrivendo, ma non posso provarla in quanto mi manca in locale i database a cui il "suggeritore" attinge i nomi da mostrare. Ma ditemi almeno se secondo voi è un'ipotesi praticabile perché ci sto sbattendo la testa da questa mattina.
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Leggendo su quirksmode probabilmente potrei anche scrivere document.getElementById(id).value = a.childNodes.nodeValue; cioè omettere l'indice di childNodes, mannaggia che on posso fare prove

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2010
    residenza
    Pianeta Terra
    Messaggi
    1,614
    ma non posso provarla in quanto mi manca in locale i database
    a) Se ti connetti al database in remoto?

    b) Ti scarichi la parte del database che ti serve per le prove?

    Per una bella risata vai QUI

  4. #4
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Originariamente inviato da Nobody33
    a) Se ti connetti al database in remoto?

    b) Ti scarichi la parte del database che ti serve per le prove?

    non posso è sull'intranet aziendale, non si entra da fuori rete ;-)


  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2010
    residenza
    Pianeta Terra
    Messaggi
    1,614
    Puoi mettere su un database fittizio in locale con le stesse nomi delle tabelle e qualche dato.

    Altrimenti chiedi se ti fanno avere un backup della parte del database che ti serve.


    Per una bella risata vai QUI

  6. #6
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Sì lo so, è solo che proprio non ne ho voglia magari domani

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2010
    residenza
    Pianeta Terra
    Messaggi
    1,614
    è solo che proprio non ne ho voglia
    Sospettavo che i programmatori sono una razza pigra
    Per una bella risata vai QUI

  8. #8
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Infatti!
    Venendo al sodo ho implementato il database in locale (a proposito se vi interessa lo trovate qui: https://gist.github.com/carlok/5564049 )fatte le dovute modifiche ho scoperto che nulla è cambiato, mi da sempre il testo dell'ultima ancora della lista.
    Ho anche modificata la stringa incriminata in document.getElementById(id).value = a.textContent; ma nulla

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2010
    residenza
    Pianeta Terra
    Messaggi
    1,614
    @marcolino's

    Ho provato un po con

    codice:
    document.getElementById(id).value = a.childNodes[0].nodeValue;
    che "dovrebbe" essere corretto.

    Puoi postare il codice originale QUI (conviene usare FF per fare il copia/incolla; su chrome non lo puoi fare [almeno a me non me lo fa fare]) senza il DB, con qualche aggiunta in html?

    Per una bella risata vai QUI

  10. #10
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Ce l'ho fatta!!!
    Certo che di errori se ne fanno ( siamo al limite de: "se riuscite a leggere anche questo non avete bisogno di occhiali!" ).
    Ecco gli errori principali che ho fatto (in rosso gli errori e in verde le modifiche )
    codice:
            a.onclick = function() {
    		document.getElementById(id).value = a.childNodes[0].nodeValue;
                    document.getElementById(id).value = document.getElementById(this.id).childNodes[0].nodeValue;
    		s.style.display = 'hide';
                    document.getElementById('suggeritore').style.display = 'none';
    	}
    che poi hide per la proprietà "display" non si usa, semmai none ma questo era un errore secondario che avrei visto in un secondo tempo.

    in realtà mi sono reso conto che è facile farsi indurre in errore programmando proprio perché non si pensa "al codice che verrà". quando scrivevo ad a in luogo di document.getElement..... mi riferivo alla variabile a che nello script aveva creato l'ancora ( document.createElement('a'); ) ovviamente il riferimento in quel contesto era sbagliato ma non capivo in quanto mi ritornava comunque un riferimento, seppur sbagliato, tra quelli mostrati, quindi non mi ero accorto dell'errore.

    Un punto a parte meritano quegli id che si vedono segnati in rosso ma non ho ancora spiegato!
    Ebbene il codice finale alla fine è risultato differente perché ho dovuto tenere conto anche della cella attiva (identificata con un numero progressivo), ognuna aveva l'opportunità di avere un elemento suggeritore, e quindi ogni suggeritore doveva essere identificato in modo univoco da un id formato da un nome convenzionale e un numero progressivo, ma non solo, anche la prima parte quella document.getElementById(id).value = document.getElementById(this.id).childNodes[0].nodeValue; doveva avere un elemento identificativo univoco che la identificasse, ogni volta differente, questo ha comportato il dover creare una variabile globale che portasse ogni volta l'ID passato alla funzione in fase di creazione dell'intera cella.
    Ecco il codice completo risultante:
    codice:
    function cancellaNodi(el) {
    	if (el.hasChildNodes()) {	//	rimuove i nodi eventualmente presenti
    		for (var i = 0, n = el.childNodes.length; i < n; i++) {
    			el.removeChild(el.childNodes[i]);
    		}
    	}
    };	//	cancellaNodi()
    
    var idCorrente = 0;
    function creaLista(parola, id) {
    	var o = new assegnaXMLHttpRequest();
    	
    	o.open("post", "suggeritore.php", true);
    	o.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    	o.onreadystatechange = function() {
    		if (o.readyState == 4) {
    			if (o.status == 200) {
    					var ret = JSON.parse(o.responseText),
    						s = document.getElementById('suggeritore'+id),
    						ul = document.createElement('ul'),
    						list = new Array();
    						idCorrente = id;
    						
    						cancellaNodi(s);
    						for (var i = 0, n = ret.length; i < n; i++) {	//	Crea la lista con i nodi
    							list[i] = document.createElement('li');
    							var a = document.createElement('a');
    							a.appendChild(document.createTextNode(ret[i].nome));
    							a.id = 'a'+i;
    							a.setAttribute('href', 'javascript:void()');
    							a.onclick = function() {
    								document.getElementById(idCorrente).value = document.getElementById(this.id).childNodes[0].nodeValue;
    								var el = document.getElementById('suggeritore'+idCorrente);
    								cancellaNodi(el);
    								el.style.display = 'none';
    								return false;
    							}
    							list[i].appendChild(a);
    							ul.appendChild(list[i]);
    						}
    						s.appendChild(ul);
    						s.style.display = 'block';
    			} else if (o.status == 204) {
    				alert('File remoto non trovato');
    			}
    		}
    	};
    	var params = 'parola=' + parola + '&time=' + Math.random();
    	o.send(params);
    };	//	creaLista()
    Notare anche la cancellaNodi() che elimina i nodi vecchi che se no rimarrebbero in memoria una volta non più necessari.


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.