Newsgroup: it.comp.lang.javascript
Titolo: select, onChange, aggiorna prezzo, refresh

ciň che ho sintetizzato nell oggetto č che
ho una form con una select degli articoli e il campo
prezzo di listino vuoto, ho impostato onChange sulla select
e vado nel database a prendere il prezzo di listino,
ma non so come si fa a metterlo e visualizzarlo nel campo
prezzo della form. Come si fa?


Non č molto chiaro cosa non sai fare, sembrerebbe che la cosa piu'
difficile tu sia riuscita a farla e cioe' interrogare il DB in maniera
"silenziosa" ma poi non sai come usare le info ottenute?!?
mi sembra strano..Forse non ho capito bene...
Cosa non sai fare?


mi sono spiegato male, è come dici tu..
riesco a catturare una variabile contenente il codice articolo,
dovrei  interrogare il DB in maniera silenziosa e mettere il prezzo
nel campo della form.
Sto lavorando con delle jsp sotto tomcat se può cambiare qualcosa.
grazie per l'attenzione

 grazie per l'attenzione
mi verebbe di consigliarti quest'approccio:
immagino che riempi la tua select con una query fatta con un qualche
linguaggio server-side se non stai gia' usando i singoli value delle option
che costituiscono la selec, potresti mettere lì il prezzo
Pro
non devi chiedere altro al server e non devi imparare altre tecniche (non
banali...)
Contro 
hai in chiaro tutti i prezzi
se gia' usi i rispettivi value non lo puoi fare


per la verità mi interessa imparare qualcosa,
per esempio quale è il meccanismo che permette dopo che
in una select è stato selezionato un item di popolare altri campi
della stessa form prendendo i dati da un database, come nell'esempio
che ho tentato di spiegare, se viene selezionato un articolo vorrei
recuperare il prezzo di vendita, l'unità di misura, ecc. ecc. e fare
il refresh del form, ma senza premere alcun tasto.

 il refresh del form, ma senza premere alcun tasto.
allora ti daro' qualche dritta facendo un semplice esempio che non potra' 
altro che fungere da punto di partenza:
come hai già detto tu, l'evento da usare in questo caso e l'onchange della 
select, al quale puoi passare una funzione che riceva come parametro il 
riferimento o della select stessa o del form in cui si trova:
<select name="name" onchange="update_values(this)">...</select>
la funzione "get_db_values" deve recuperare i valori dal DB e inserirli nei 
campi opportuni:
function update_values(elem)
{
   var values = get_db_values(elem.value);
   change_values(elem.form,values);
}
prima vediamo "change_values": è una semplice funzione che riceve come 
input i valori da cambiare e il riferimento del form in cui si trovano i 
campi, ad es. mi puo' fare un pelo flessibile e renderla quindi 
riutilizzabile anche altrove, facendo una cosa tipo:
function change_values(form,values)
{
   for( var val in values )
   {
      if( typeof form.elements[val] != 'undefined' )
          form.elements[val].value = values[val];
   }
}
in base al contenuto di values vengono aggiornati i campi del form se 
esistono, values è un oggetto del tipo:
values = {field1:'val1',field2:'val2',...}
lo puoi immaginare come un array associativo in questo caso (anche se non è 
corretto perchè JS non li prevede)
in fine c'è da analizzare "get_db_values"
allora questa funzione si puo' fare in 2 modi:
o recupera i valori salvati da qualche parte nella tua pagina 
o li chiede in maniera sincrona ad una pagina sul tuo server
il primo caco te l'ho gia' proposto ma l'hai "bocciato" anche perche' hai 
complicato le cose a runtime dicendo di voler recuperare piu' informazioni, 
cmq puoi mettere queste informazioni separate da virgola nei value della 
select o in qualche variabile JS popolata dinamicamente...
nel secondo caso devi ricorrere all'oggetto "XMLHttpRequest" che ti 
permette di fare proprio quello che ti ho detto, di questo oggetto e delle 
sue potenzioalita' e utilizzi se ne sente molto parlare con nome 'AJAX'
negli archivi di questo NG trovi ne una versione crossbrowser
e in rete trovi mille esempi, tutorial e quant'altro per capire come si 
usa...
In fine c'e' da dire una cosa, ache ripetuta di recente in questo NG, le 
chiamate sincrone (che sono la grande potenzialità del sudetto oggetto) 
nell'ambito di pagine web non sono normalmente consigliabili (per un paio 
di motivi di cui ti puoi documentare),
tuttavia "XMLHttpRequest" permette anche richieste asincrone e cambiando 
leggermente le funzioni di cui prima, potrai ottenere i risultati voluti
arrivati a questo punto e cioe' optato per chiamate asincrone, potresti 
anche valutare di farle attraverso un iframe nascosto
metodo oramai in disuso proprio per l'introduzione oramai non più recente 
dell'oggetto di cui prima
ciao

 dell'oggetto di cui prima
Mica vero, anzi.
L'iframe, è stato rivalutato proprio grazie all'oggetto di cui prima.
Tant'è che gli hanno pure dato un nome, all'approccio che usa iframe,
piuttosto che XHR (tanto, una volta partiti con "AJAX"...): "Comet".
Molte delle web application più "famose" (GMail, Meebo) usano sia XHR
che l'iframe, cercando di sfruttare i vantaggi di entrambi.
-- 
~ Il futuro è nelle nostre mani. Purtroppo.

 che l'iframe, cercando di sfruttare i vantaggi di entrambi.
interessante,
avrei detto che quando usano un iframe era per rendere la cosa piu'
crossbrowser possibile..
beh' ovviamente escudendo gli upload...
infatti io mi riferivo a form semplici costituito da campi testuali,
la mia intenzione non era quella di generalizzato in assoluto,
comunque interessante

 ha scritto nel messaggio 
news:jf7869cbslfb.1j...@40tude.net...
innanzitutto grazie per la pazienza...
tuttavia ho bisogno di triturarla un po' più finemente...
consideriamo la pagina Prova1.jsp che riporto di seguito,
abbiamo una form con una select ARTICOLO e un campo PREZZO.
possiamo provare a tralasciare per il momento la funzione get_db_values?
della quale mi occuperò successivamente...
e mettiamo invece delle assegnazioni statiche:
se ARTICOLO = "005001001" PREZZO = 12,99
se ARTICOLO = 005001002"  PREZZO = 11,00
se ARTICOLO = 005001003"  PREZZO = 7,50
poichè non mi è chiaro il meccanismo che, selezionato un articolo,
aggiorna il relativo prezzo senza nessun submit, potresti modificare
la pagina per fare questo?
<html>
<head>
 <title>Prova1</title>
<script language="JavaScript">
function update_values(elem)
{
   var values = get_db_values(elem.value);
   change_values(elem.form,values);
}
function change_values(form,values)
{
   for( var val in values )
   {
      if( typeof form.elements[val] != 'undefined' )
          form.elements[val].value = values[val];
   }
}
</script>
</head>
<body leftmargin="0" topmargin="0" marginheight="0" marginwidth="0">
<form method="post">
<table border="0" cellspacing="1" cellpadding="1" bgcolor="#C0BDB7">
<tr>
<td>Articolo</td>
<td>
<select name="ARTICOLO" onChange="update_values(this);">
<option value="">Prego selezionare ...</option>
<option value="005001001">Achillea  Millefoglie - 100gr</option>
<option value="005001002">Agrimonia sommità tagliate - 100gr</option>
<option value="005001003">Anice stellato frutti t.t. - 100gr</option>
</select>
</td>
</tr>
<tr>
<td>Prezzo</td>
<td><input type="text" name="PREZZO" size="10" value="">
</td>
</tr>
</form>
</body>
</html> 

 la mia intenzione non era quella di generalizzato in assoluto,
Beh, ho risposto alla tua frase "metodo ormai in disuso", che dava
l'accento al "metodo" in senso generale; è per questo ho preferito
analizzare la questione.
-- 
~ "E' nei cambiamenti che troviamo uno scopo."
(Eraclito)

 <input type="text" name="PREZZO" size="10" value="">
<form method="post" action="page.jsp">
<select name="cmbArticolo" onchange="updatePrice(this)">
	<option value="">Prego selezionare ...</option>
	<option value="005001001">Achillea  Millefoglie - 100gr</option>
	<option value="005001002">Agrimonia sommità tagliate - 100gr</option>
	<option value="005001003">Anice stellato frutti t.t. - 100gr</option>
</select>
<input type="text" name="txtPrezzo" size="10" value="" />
</form>
Codice JS, prendendo i dati "statici" di cui hai parlato:
<script type="text/javascript">
	var prices = { 	
		"005001001" : "12,99",
		"005001002" : "11,00",
		"005001003" : "7,50"
	};
	function updatePrice(this){
		this.form.txtPrezzo.value = prices[this.value]||"";
	}
</script>
Come hai detto tu, cerca di fare un passo alla volta. Analizza intanto
questo codice, e se c'è qualcosa che non ti torna chiedi pure.
Ti consiglio inoltre qualche reference come lettura:
#DOM w3c
http://www.w3.org/DOM/
#DOM Gecko
http://www.mozilla.org/docs/dom/domref/
#DOM IE
http://msdn.microsoft.com/workshop/author/dhtml/reference/dhtml_reference_entry.asp
#Javascript 
http://developer.mozilla.org/en/docs/Category:JavaScript:References
#JScript (IE)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/1e9b3876-3d38-4fd8-8596-1bbfe2330aa9.asp
Soprattutto ciò che riguarda il DOM (Document Object Model).
-- 
~ "Il debito pubblico è abbastanza grande da badare a sé stesso."
(Ronald Regan)

 analizzare la questione.
ah gia'

 </html>
ok si riesce a fare velocemente
devi definire la funzione get_db_values() in maniera statica
quindi:
function get_db_values( elem )
{
   return { PREZZO: elem.value };
}
pero' così ti ho complicato la visa se sei alle prime arme, e potresti non
capirci molto
Forse e' il caso che prima studi un po'...

 capisco
Eliminando dal quoting il resto, la frase potrebbe essere fraintesa.
Il discorso č a prescindere da PHP o JS, mi raccomando. :)
-- 
~ Ci siamo fatti una scopata cosi' eccezionale che anche i vicini
hanno fumato una sigaretta.

 Forse e' il caso che prima studi un po'...
Concordo, soprattutto l'interazione JS/DOM.
-- 
~ "La realtà è ciò che, quando smetti di crederle, non va via."
(Philip K. Dick)

 }
Ho sbagliato, pensavo che avessi messo i prezzi negli option, come ti avevo
ad un certo punto consigliato
vedi codice di Zer0 dove tra le altre cose usa la nomenclatura che si
addice al JavaScript

 Eliminando dal quoting il resto, la frase potrebbe essere fraintesa.
ops, non era mia intenzione

 per me è il contrario ad es. :)
Non vieni dal vecchio C, eh. :)
Anche in PHP usano blocchi per lo più "puri", soprattutto per le
strutture di controllo.
-- 
~ Ci si aspetta di tutto, ma non si e' mai preparati a nulla.
(M.Swetchine)


Certamente
grazie per le risposte 

 this.form.txtPrezzo.value = prices[this.value]||"";
Qui IE mi da errore "previsto identificatore"
mi sembra di capire che č la parola this a dargli noia,
o cambiato il nome, OK
Ora provo a reperire i dati dal database,
grazie per le risposte 

 mi sembra di capire che è la parola this a dargli noia,
Si, scusami, essendo abituato a impostare gli event-handler
direttamente da javascript ho fatto un po' un mix:
function updatePrice(sender){
	sender.form.txtPrezzo.value = prices[sender.value]||"";
}
-- 
~ "It may be that the old astrologers had the truth exactly reversed,
when they believed that the stars controlled the destinies of men.
The time may come when men control the destinies of stars."
(Arthur C. Clarke)