Newsgroup: it.comp.lang.javascript
Titolo: passare una variabile ad un form

Salve a tutti. Ho un form con un campo nascosto hidden del tipo ed un 
codice javascript alla fine appena sotto il form come specificato:
-------------------
<body>
<form name="contattaci" method="post" action="form2mail.php" 
onSubmit="return validateForm(this,0,1,1,0);">
 
<input name="subject" type="hidden" value="">
    ... n campi input
<input name="submit" type="submit" value="Invia"> 
<input name="cancel" type="reset" value="Annulla"> 
</form>
<script language="JavaScript" type="text/JavaScript">
// Genera numero casuale per il soggetto della mail
var ranfi=Math.round((Math.random()*89999)+10000);
var idsogg="Invio modulo [N-"+ranfi+"]";
self.document.contattaci.subject.value=idsogg;
document.contattaci.submit();
</script>
</body>
</html>
-------------------
Il funzionamento è perfetto sia con IE che OPERA e NS, infatti quando invio 
il form in questione mi arriva una mail con il campo soggetto del tipo 
"Invio modulo [N-12345]" dove al posto di 12345 c'è un numero casuale 
compreso tra 10000 e 99999.
Il problema è che all'apertura della pagina mi viene segnalato sia con IE 
che con NS un errore JS che mi segnala che "document.contattaci.submit()" 
non è una funzione?
Come posso risolvere il problema? Perchè se metto le istruzioni JS prima 
del form in questione il campo "subject" mi rimane vuoto.
Ringrazio in anticipo.
-- 
Effe8

Ho povato a mettere nell'HEAD questa funzione:
function generasub() {
var ranfi=Math.round((Math.random()*89999)+10000);
var idsogg="Invio modulo [N-"+ranfi+"]";
document.forms["contattaci"].subject.value=idsogg;
}
e nel form contenete il campo nascosto SUBJECT questa istruzione:
<form >
..
<input name="submit" type="submit" value="Invia" onClick="generasub();">
</form>
E adesso sembra funzionare tutto a dovere. Quello che mi domando è perche 
se chiamo il mio form "contattaci" e scrivo la sintassi:
document.contattaci.subject.value=idsogg;
anziché
document.forms["contattaci"].subject.value=idsogg;
mi segnala errore ma funziona lo stesso? E quando dico che funziona intendo 
che va ok con IE, NN e OPERA.
Grazie.
-- 
Effe8

Dunque la faccenda sta così: preparati a un paio di colpi di scena.
se tu definisci la funzione negli headers, la funzione viene in realtà
"compilata" che tu
ci creda o no (javaScript non è un linguaggio compilato... vero e falso:
nel momento in cui
la funzione è letta la sua definizione è posta in memoria come oggetto
valido. E che sia così te lo proverà fra poco proprio il tuo "errore")
Dunque nulla può interferirvi: il nome submit legato al FORM è
memorizzato come oggetto built in submit di javaScript.
ora sta a vedere: tu lo metti DOPO il campo form.
Apparentemente tutto bene.
Ma... ma... ma... nel campo form tu dai un NAME= a un elemento...
e indovina un po', questo name è... submit:
name="submit"
Adesso hai SOVRASCRITTO la funzione submit della COLLEZIONE OGGETTO
FORM[x]
con un conflitto di nomi: submit non è più nella FORM[x] il METODO built
in di javaScript,
ma è per la FORM[x] il NAME di un ELEMENT della form (a sua volta
memorizzato come un oggetto).
Dunque NON puoi più nella form[x] invocare submit come funzione: ne hai
sovrascritto il nome con un... name di elemento.
Infatti:
Prova:
<body>
<form name="contattaci" method="post" action="form2mail.php" 
onSubmit="return validateForm(this,0,1,1,0);">
 
<input name="subject" type="hidden" value="">
    ... n campi input
<input name="submit" type="submit" value="Invia"> 
<input name="cancel" type="reset" value="Annulla"> 
</form>
<script language="JavaScript" type="text/JavaScript">
// Genera numero casuale per il soggetto della mail
var ranfi=Math.round((Math.random()*89999)+10000);
var idsogg="Invio modulo [N-"+ranfi+"]";
self.document.contattaci.subject.value=idsogg;
alert(document.contattaci.submit.value)
</script>
</body>
</html>
Ho messo un alert che dice:
alert(document.contattaci.submit.value)
Indovina un po' cosa ti ritorna... "Invia" ! Il testo del pulsante.
Hai sovrascritto il nome della funzione con quello del pulsante.
La cosa può stupirti, ma non è insolita.
Ogni oggetto ha le sue proprietà: una form NOn fa eccezione.
OGGETTO FORM["contattaci"]
   elements
   submit
   onclick
   reset
   nomeMiocampo1
   nomeMiocampo2
   ...ecc...
Se tu inserisci un nome campo che si chiama submit, sostituisci dentro
OGGETTO FORM["contattaci"]
il NOME submit con il campo.
Infatti i nomi di un OGGETTO, indipendentemente da cosa PUNTINO (una
funzione, un elemento, una variabile)
sono tutti e solo nomi: se ne inserisci un altro l'oggetto FUNZIONE
submit ESISTE ANCORA, ma non è più PUNTATO da "submit" come NOME.
IN javaScript ci sono i puntatori! Ed è compilato!
Sorprese sorprese...
Per convincertene prova questo: verifica cosa è submit non usando SUBMIT
come keyword ma come stringa:
<body>
<form name="contattaci">
<input name="cancel" type="button" value="Esempio"> 
</form>
<script>
alert(typeof document.contattaci["submit"]+"\n"+
document.contattaci["submit"].value)
</script>
</body>
L'alerti ti dirà: Object per il typeof e "undefined" per il value: cioè
ti dice che indirizzando la form con una proprietà chiamata come STRINGA
["submit"]
ti ritorna un object (la funzione submit) ma NON ti riconosce il value.
perchè tale oggetto submit NON ha value.
Ora infine prova:
<body>
<form name="contattaci">
<input name="submit" type="button" value="Esempio"> 
</form>
<script>
alert(typeof document.contattaci["submit"]+"\n"+
document.contattaci["submit"].value)
</script>
</body>
Nota che ho dato name="submit", STAVOLTA; al pulsante.
L'alerti ti ritorna:
Object
esempio
cioè è sempre un oggetto (ma stavolta è l'ELEMENTO della form) e la
riprova ne è che esso in effetti HA ora un value, quello definito nel
tag: e infatti ritorna: "esempio"!
Come vedi, non è colpa tua!
ciao
Alberto
http://www.unitedscripters.com/
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Dunque la faccenda sta così: preparati a un paio di colpi di scena.
Non è una question nè di porre prima o dopo i comandi di script, e
neppure un questione di usare o meno la notazione letterale (cioè l'uso
della indixcizzazione fra parentesi quadre di un indice di tipo Stringa
anzichè Numero)
Il nome submit legato al FORM è
memorizzato come oggetto built in submit di javaScript.
Ogni FORM ha il suo puntatore a tale oggetto submit.
Ripeto: l'oggetto SUBMIT (diciamo la FUNZIONE submit() built in in
javaScript)
è UNA e una SOLA, ma OGNI form istituisce un SUO puntatore a tale
funzione (se
così non fosse, non potresti specificare QUALE form inviare! Ti
torna..?)
Ora sta a vedere.
Hai il tuo script e lo vuoi inviare.
Apparentemente tutto bene.
Ma... ma... ma... nel campo form tu dai un NAME= a un elemento...
e indovina un po', questo name è... submit:
name="submit"
Adesso hai SOVRASCRITTO la funzione submit della COLLEZIONE OGGETTO
FORM[x]
generando un conflitto di nomi, che javaScript a livello interprete DEVE
risolvere: submit non è più nella FORM[x] il METODO built
in di javaScript,
ma è per la FORM[x] il NAME di un ELEMENT della form (a sua volta
memorizzato come un oggetto).
Dunque NON puoi più nella form[x] invocare submit come funzione: ne hai
sovrascritto il nome con un... name di elemento.
Infatti:
Prova:
<body>
<form name="contattaci">
<input name="submit" type="submit" value="Invia"> 
<input name="cancel" type="reset" value="Annulla"> 
</form>
<script>
// Genera numero casuale per il soggetto della mail
var ranfi=Math.round((Math.random()*89999)+10000);
var idsogg="Invio modulo [N-"+ranfi+"]";
self.document.contattaci.subject.value=idsogg;
       alert(document.contattaci.submit.value)
</script>
</body>
</html>
Ho messo un alert che dice:
alert(document.contattaci.submit.value)
Indovina un po' cosa ti ritorna... "Invia" ! Il TESTO del pulsante.
Duqnue è PROVATO: hai sovrascritto il nome della funzione con quello del
pulsante.
La cosa può stupirti, ma non è insolita.
Ogni oggetto ha le sue proprietà: una form NON fa eccezione.
Tutte queste proprietà sono PUNTATORI con nomi di COMODO a oggetti
digitali
e a  cui come vengono chiamati (cioè con quale nome) dagli oggetti che
li putnano
non importa nulla... 
La confusione si genera solo dal fatto che spesso si scelgono per
puntare
nomi DESCRITTIVI: ed ecco che OGNI FORM di una pagina deve PUNTARE a
quell'
oggetto "che invia la form", si chiama convenientemente SUBMIT.
Non ti stupire: ANCHE tu, giustamente, hai pensato di dare tale NOME al
campo che "invia la form"...
Esempio della DATA STRUCTURE (assai abbreviata!) di un oggetto form che
poi si incarna nelle sue varie istanze (nel tuo caso la istanza...
"contattaci")
OGGETTO FORM["contattaci"]
   "name" (!)
   "action"
   "elements"
   "elements"["length"] //eh eh...
   "submit" //<<<<<<-- il nostro amico!<<<<<<
   "onclick"
   "onfocus"
   "reset"
   ...altri built in...
   ...ora: quelli... definiti dall' utente!!
   "nomeMiocampo1" /*<-- i tuoi nomi di campi quando li INSERISCI vanno
qui! */
   "nomeMiocampo2" //ibidem
   ...ecc...
Se tu inserisci un nome campo che si chiama submit, SOSTITUISCI dentro
OGGETTO FORM["contattaci"]
il NOME "submit" puntante alla funzione con l'identico nome dato al
campo.
putante al... campo.
Infatti i nomi di un OGGETTO, indipendentemente da cosa PUNTINO (una
funzione, un elemento, una variabile)
sono tutti e solo nomi cioè STRINGHE (e te
lo DIMOSTRA la tua stessa sintassi form["contattaci"]: usare una
bareword
contattaci
o la collezione forms["contattaci"]
è EQUIVALENTE. Ergo "contattaci" è solo in realtà un'altro nome di
comodo...!
quindi se inserisci un altro nome "submit" l'oggetto FUNZIONE
submit ESISTE ANCORA, ma non è più PUNTATO da "submit" come NOME.
IN javaScript ci sono i puntatori!
http://www.unitedscripters.com/spellbinder/pointers.html
Sorprese sorprese...
Per convincertene prova questo: verifica cosa è submit non usando SUBMIT
come keyword ma come stringa: ["submit"] ESATTAMENTE come tu usi in un
secondo momento ["contattaci"]:


Spero tu abbia letto la mia risposta precedente, poichè questa è solo un
PS incomprensibile se non si è letto quel che antecede.
Il secondo esempio che tu riporti non è che funziona per
i motivi su cui ti interrogavi, ma perchè hai RINUNCIATO a chiamare il
sumbit tramite l'uiso del nome
submit nello script: dunque il conflitto di nomi fra
submit FUNZIONE
e
submit ELEMENT NAME della form
SUSSISTE. Ma non te lo ritrovi più fra i piedi perchè nel tuo secondo
esempio
ti affidi NON più a document.contattaci.submit ma al pulsante
type="submit":
una volta che hai sovrascritto il nome submit dell'oggetto built in
submit con il name di un elemento per la form[x]
, impedisci che esso possa essere CORRETTAMENTE puntato e CHIAMATo
gridando "submit"! - arriva l'elemento della form non la funzione.
MA NON IMPEDISCI ad un pulsante che opera in modo predefinito e cioè
SENZA chiamate a "submit" come name di operare correttamente.
Osserva:
FUNZIONE DI INVIO
OGGETTO FORM (con sue proprietà "name" "submit" "reset" "elements")
ARRAY FORMS (oggetto di DOCUMENT)
   forms["contattaci"] //<<<è un OGGETTO autonomo ISTANZA di OGGETTO
FORM
   /*dunque forms["contattaci"] EREDITA tutti i  NAMES delle PROPRIETA'
di OGGETTO FORM essendone una istanza*/
   forms["contattaci"].elements["nome elemento"]
   /*esso è un ALIAS di*/
   forms["contattaci"]["nome elemento"]
cioè insrisce nei names di forms["cxontattaci"] il "nome elemento": ed è
qui che la SOVRASCRITTURA si verifica.
Convincitene:
<form name="contattaci">
<input name="submit" type="button" value="Esempio"> 
</form>
<script>
alert( document.forms["contattaci"]["submit"].value)
</script>
Nota come ho INIDICIZZATO l'alert:
document.forms["contattaci"]["submit"]
cioè come forms["contattaci"]["nome elemento"]
dunque è PROVATO: a questo livello può insinuarsi un conflitto di nomi.
forms["contattaci"]["submit"]
sovrascriverebbe l'originale oggetto funzione submit.
PROVA DEFINITIVA et inoppugnabile:
<form name="contattaci">
<input name="ciccio" type="button" value="Esempio"> 
</form>
<script>
alert( document.forms["contattaci"]["submit"])
</script>
LO sai cosa ti ritorna l'alert ora che ho TOLTO il name="submit" dal
PULSANTE della form?
Gioisci:
function submit() { [native code] } 
Una ultima cosa: ti starai forse chiedendo perchè se il name="submit"
interferisce in un modo che ormai ti dovrebbe essere chiaro come
l'acqua, tuttavia la STESSA
interferenza non è data dalla definizione tupe="submit"
Ebbene, devi fare attenzione alla ramificazione:
usando il name="ciccio" per togliere dal campo l'equivoco chiarito:
forms["contattaci"]["ciccio"]
è una cosa, ed è PROPRIETA' della FORM, perchè la form identifica i
propri elementi figli con il nome, dunque il nome prescelto può
interferire perchè
APPARTIENE alla form nella misura in cui essa lo USA per identificare
l'oggetto.
MA
forms["contattaci"]["ciccio"].type
è una ALTRA cosa, ed è PROPRIETA' dell' ELEMENTO, 
che è ogggetto distinto dalla form anche se ne è figlio 
(insomma: tu e tuo padre NON siete la stessa cosa solo per il
fatto di satre nella stessa famiglia, no? 
TUTTAVIA tuo padre può sempre chiamarti "EFFE": sei sempre tu, persona
distinta, ma
egli è solo con tale nome che può invocarti 
dunque se non ha diritto ad identificarsi con il TYPE ha diritto però a
poter
gestire il NAME)
Mi pare si sia arrivati lontano. Spero di esserti stato utile.
In cambio quando ti capita di fare una lista di link utili sulle tue
pagine ricordati di me ha ha.


 </html>
Questo primo esempio non mi da l'alert. Appena premo il pulsante con IE 
vedo l'errore:
'self.document.contattaci.subject.value' è nullo o non è un oggetto
Se invece eseguo questo allora accade come dici te:
<body>
<form name="contattaci">
<input name="submit" type="submit" value="Invia"> 
<input name="cancel" type="reset" value="Annulla"> 
</form>
<script>
// Genera numero casuale per il soggetto della mail
// var ranfi=Math.round((Math.random()*89999)+10000);
// var idsogg="Invio modulo [N-"+ranfi+"]";
// self.document.contattaci.subject.value=idsogg;
   alert(document.contattaci.submit.value);
</script>
</body>
</html>

Questi due invece sono ok.
Che dire? ringraziarti mi sembra il minimo. Mi hai risposto in modo non 
esauriente, ma *deppiù* che esauriente.
Praticamente da quel che ho capito il mio *errore* è stato quello di 
chiamare il pulsante *submit* generando così il conflitto tra l'ELEMENTO 
form e il METODO JS esatto?
Tutto questo perchè ho inserito un altro JS che mi valida i campi il quale 
vuole il name=subject nel pulsante invio per riconoscerlo. Prima di 
inserire questo JS e quindi prima di nominare in *submit* un campo del 
modulo funzionava tutto ok.
-- 
Effe8

 pagine ricordati di me ha ha.
Non mancherò e quando lo farò ti posterò il link... ;-)
Ciao Alberto. Alla prox.
-- 
Effe8

Sě hai ragione quel subject era un refuso mio. Che vuoi, l'ora č
tarda...
comunque hai capito brillantemente da te che bastava sostituirlo con
submit e l'esempio funzionava.
Scusa, ma dopo anni di javaScript ancora mi capita di lasciare refusi di
precedenti codificanzioni in giro ha ha!
PS sě, ha compreso esattamente: avere dato il nome submit al campo
attribuiva a quella form il nome submit all'elemento recante tale nome,
e
dunque sovrascriveva per quella form il nome submit come puntatore alla
funzione omonima.
ciao
Alberto
