Rieccomi qua!
Ho rivisto ancora una volta il codice e sono giunto a questa versione:
lo script è pubblicato come al solito su http://www.bukowski-show.it/autocompletamento2.htmcodice:<SCRIPT language=JavaScript> var persone = new Array(); persone[persone.length] = new Array("carloni","federico","1","328789065","19","05","2005","10","30",0); persone[persone.length] = new Array("carloni","paolo","1","32833333","19","06","2006","10","30",0); persone[persone.length] = new Array("carletti","federico","1","328000005","17","02","2005","10","30",0); persone[persone.length] = new Array("De Luca","Marina","5","3402588954","","","","","",0); persone[persone.length] = new Array("petria","valerio","2","3204544569","20","03","2006","14","12",1); persone[persone.length] = new Array("rossi","mario","2","3288888888","","","","","",1); var row_prec="", col_prec=""; // valori precedenti var pos_mat = 0; // posizione nella matrice var cont_prec=""; // contenuto precedente var cont_digit = ''; // contenuto digitato function completa(ogg) { var rc = ogg.name.split(/_/); // decodifica riga e col - Es: cogn autista var row = rc[1]; //ES: autista var col = rc[0]; //ES: cogn var cont = ogg.value; //ES: carloni //alert("riga: "+row+" colonna: "+col); //stampa un promemoria della colonna che sta scandendo ES: autista cogn if(row != row_prec) // riga diversa: azzera i puntatori { cont_prec = ""; pos_mat = 0; } var agg = cont.substr(cont.length-1); // carattere aggiunto - Estrae i caratteri di ciò che è scritto nel textfield.. cont_digit += agg; //..e li mette in cont_digit. ES: Scrivo "c" e cont_digit diventa "c", scrivo poi "a" e cont_digit="ca" ecc. switch (col) //NOTA: LA matrice. Diciamo: persone[record][campo] { case 'cogn': while((persone[pos_mat][0]).indexOf(cont_digit) < 0) //Scandisco la matrice sulla colonna relativa al cognome. Parto dalla prima riga e finchè non c'e' un matching tra le lettere //digitate dall'utente nel textfield e quello che è scritto nella matrice, passo alla riga successiva { pos_mat++; } if(pos_mat > persone.length) { alert("non nell'elenco")//Se arrivo alla fine dell'array ovviamente sta digitando i dati di una persona ancora non registrata nel DB return false; } //SE invece riscontra un matching del 100% compila gli altri campi del form con i dati della riga in esame. ogg.form.elements("cogn_"+row).value = persone[pos_mat][0]; ogg.form.elements("nome_"+row).value = persone[pos_mat][1]; ogg.form.elements("gruppo_"+row).value = persone[pos_mat][2];//Attenzione: e' una select! ogg.form.elements("tel_"+row).value = persone[pos_mat][3]; ogg.form.elements("ggFine_"+row).value = persone[pos_mat][4]; ogg.form.elements("mmFine_"+row).value = persone[pos_mat][5]; ogg.form.elements("aaFine_"+row).value = persone[pos_mat][6]; ogg.form.elements("oraFine_"+row).value = persone[pos_mat][7]; ogg.form.elements("minFine_"+row).value = persone[pos_mat][8]; if ( persone[pos_mat][9]==1 ) ogg.form.elements("benefici_"+row).click();// Funziona così! break; case 'nome': while((persone[pos_mat][1]).indexOf(cont_digit) < 0) //Scandisco la matrice sulla colonna relativa al cognome. Parto dalla prima riga e finchè non c'e' un matching tra le lettere //digitate dall'utente nel textfield e quello che è scritto nella matrice, passo alla riga successiva { pos_mat++; } if(pos_mat > persone.length) { alert("non nell'elenco")//Se arrivo alla fine dell'array ovviamente sta digitando i dati di una persona ancora non registrata nel DB return false; } //SE invece riscontra un matching del 100% compila gli altri campi del form con i dati della riga in esame. ogg.form.elements("cogn_"+row).value = persone[pos_mat][0]; ogg.form.elements("nome_"+row).value = persone[pos_mat][1]; ogg.form.elements("gruppo_"+row).value = persone[pos_mat][2];//Attenzione: e' una select! ogg.form.elements("tel_"+row).value = persone[pos_mat][3]; ogg.form.elements("ggFine_"+row).value = persone[pos_mat][4]; ogg.form.elements("mmFine_"+row).value = persone[pos_mat][5]; ogg.form.elements("aaFine_"+row).value = persone[pos_mat][6]; ogg.form.elements("oraFine_"+row).value = persone[pos_mat][7]; ogg.form.elements("minFine_"+row).value = persone[pos_mat][8]; if ( persone[pos_mat][9]==1 ) ogg.form.elements("benefici_"+row).click();// Funziona così? NO!! break; case 'gruppo': //Questa è una select? come gestirla? break; //Gli unici 3 campi che possono dare vita al completamento automatico sono Cognome Nome e Gruppo, in quanto //sono una chiave unique sul DB. default: return true; }//chiude switch }//chiude function </SCRIPT>
Purtroppo ci sono ancora un sacco di problemi che ho provato (invano) a risolvere:
1) Lo script funziona solo sull'autista mentre per le altre righe da' errore: Persone[...][0] è nullo o non è un oggetto
2) Questo funzionamento non è affatto quello desiderato: dopo aver digitato la prima lettera del cognome riempie tutta la riga (i dati sono pure corretti!) ma non è possibile continuare con l'inserimento. Quindi se io volessi i dati di carloni paolo o carletti federico non potrei mai accedervi... Inoltre se la prima lettera che scrivo è "r" (per avere i dati di rossi mario) mi da' sempre quelli di carloni federico....
Purtroppo essendo io una schiappa in JS posso solo fare supposizioni e la mia supposizione è la seguente (basata su del codice che avevo trovato per auto-completare un solo textfield prendendo i dati da un array): Mancano tutta una serie di funzioni che facciano apparire (selezionati in azzurro e quindi cancellabili continuando a digitare) i dati a video e ne permettano la modifica. infatti il codice che avevo è il seguente:
dove arrValues era un array contenente i soli cognomi (o nomi o altre stinghe) che venivano autocompletati.codice:var isOpera = navigator.userAgent.indexOf('Opera') > -1; var isIE = navigator.userAgent.indexOf('MSIE') > 1 && !isOpera; var isMoz = navigator.userAgent.indexOf('Mozilla/5.') == 0 && !isOpera; function textboxSelect (oTextbox, iStart, iEnd) { switch(arguments.length) { case 1: oTextbox.select(); break; case 2: iEnd = oTextbox.value.length; /* falls through */ case 3: if (isIE) { var oRange = oTextbox.createTextRange(); oRange.moveStart("character", iStart); oRange.moveEnd("character", -oTextbox.value.length + iEnd); oRange.select(); } else if (isMoz){ oTextbox.setSelectionRange(iStart, iEnd); } } oTextbox.focus(); } function textboxReplaceSelect (oTextbox, sText) { if (isIE) { var oRange = document.selection.createRange(); oRange.text = sText; oRange.collapse(true); oRange.select(); } else if (isMoz) { var iStart = oTextbox.selectionStart; oTextbox.value = oTextbox.value.substring(0, iStart) + sText + oTextbox.value.substring(oTextbox.selectionEnd, oTextbox.value.length); oTextbox.setSelectionRange(iStart + sText.length, iStart + sText.length); } oTextbox.focus(); } function autocompleteMatch (sText, arrValues) { for (var i=0; i < arrValues.length; i++) { if (arrValues[i].indexOf(sText) == 0) { return arrValues[i]; } } return null; } function autocomplete(oTextbox, oEvent, arrValues) { switch (oEvent.keyCode) { case 38: //up arrow case 40: //down arrow case 37: //left arrow case 39: //right arrow case 33: //page up case 34: //page down case 36: //home case 35: //end case 13: //enter case 9: //tab case 27: //esc case 16: //shift case 17: //ctrl case 18: //alt case 20: //caps lock case 8: //backspace case 46: //delete return true; break; default: textboxReplaceSelect(oTextbox, String.fromCharCode(isIE ? oEvent.keyCode : oEvent.charCode)); var iLen = oTextbox.value.length; var sMatch = autocompleteMatch(oTextbox.value, arrValues); if (sMatch != null) { oTextbox.value = sMatch; textboxSelect(oTextbox, iLen, oTextbox.value.length); } return false; } }
nel form s'inseriva un:
forse bisognerebbe trovare una sorta di compromesso tra le 2 versioni credo...codice:onKeyPress="return autocomplete(this, event, arrValues)"
E' un gran casino farlo?![]()
Oppure c'e' una soluzione piu' semplice per rendere il codice che hai proposto tu funzionante?
fammi sapere pls!
a presto (spero)!![]()


) a risolvere:
Rispondi quotando