Newsgroup: it.comp.lang.javascript
Titolo: eseguire la submit di una form Google

Ho una form di google docs semplicissima (un solo campo testo) 
visualizzata in Firefox, e Firebug aperto.
Eseguo il codice:
 
document.forms["ss-form"].entry_0.value="ccc";
document.forms["ss-form"].submit;
 
ma il submit non viene eseguito.
Perché? Grazie.

 document.forms["ss-form"].submit;
dappertutto ho trovato
document.forms["ss-form"].submit();
ma cosï¿œ scrivendo mi viene restituito l'errore
document.forms["ss-form"].submit is not a function
bo?

 document.forms["ss-form"].submit is not a function
Ho capito. Il pulsante di nome "submit" impediva la chiamat a submit().
Ora ho rinominato il pulsante e richiamato la form da una pagina in 
locale, perï¿œ ancora la submit non viene eseguita.

 document.forms["ss-form"].submit is not a function
la form ha name="ss-form"? Strano per google (name alle form è deprecato)

 Ho capito. Il pulsante di nome "submit" impediva la chiamat a submit().
 
non credo. con document.forms[name] hai un riferimento alla form con 
name="name", che ci siano altri tag con name="submit" non dovrebbe 
centrare nulla.

> la form ha name="ss-form"? Strano per google (name alle form è deprecato)
 
La pagina che contiene la form è questa:
 
https://docs.google.com/spreadsheet/viewform?hl=en_US&formkey=dDNyZEMyLUpwSTY0NDdmYzJId2t5a2c6MQ#gid=0
 
 
Il codice html della form è questo:
 
<form 
action="
https://docs.google.com/spreadsheet/formResponse?hl=en_US&amp;formkey=dDNyZEMyLUpwSTY0NDdmYzJId2t5a2c6MQ&amp;ifq
" 
method="POST" id="ss-form">
<br>
<div class="errorbox-good">
<div class="ss-item  ss-text"><div class="ss-form-entry"><label 
class="ss-q-title" for="entry_0">casella di prova
</label>
<label class="ss-q-help" for="entry_0"></label>
<input type="text" name="entry.0.single" value="" class="ss-q-short" 
id="entry_0"></div></div></div>
<br>
<input type="hidden" name="pageNumber" value="0">
<input type="hidden" name="backupCache" value="">
<div class="ss-item ss-navigate"><div class="ss-form-entry">
<input type="submit" name="submit" value="Submit"></div></div></form>
 
Per verificare se il submit ha avuto successo basta controllare qui:
 
https://docs.google.com/spreadsheet/ccc?key=0AiJqK6sgr0fYdDNyZEMyLUpwSTY0NDdmYzJId2t5a2c&hl=en_US
 
 
Io purtroppo non sono ancora riuscito a concludere nulla. Con due righe 
di codice come quelle contenute nel mio precedente messaggio sono 
riuscito per esempio a effettuare il submit della form di gmail ma con 
questa... nulla...

 method="POST" id="ss-form">
 
e quindi la form non ha name="ss-form" ...
 
anziché document.forms[] usa document.getElementById("id-form") (o 
document.forms[0], se è unica o prima nella pagina)
 
p.s. non sono entrato nel merito del resto del codice, ma quello che 
facevi segnalava per forza errore, perché document.forms["ss-form"] 
risultava null.

 method="POST" id="ss-form">
 


 centrare nulla.
 
Invece è proprio quello, è un problema già capitato in passato nel NG. 
In pratica è dovuto alla possibilità di referenziare un elemento form 
come se fosse una proprietà della form stessa. Quindi, invece di avere:
 
     form.elements["nome_elemento"]
 
puoi avere direttamente:
 
     form.nome_elemento
 
In questo modo, però, si ha il problema appena visto: se il nome di un 
elemento è uguale a un metodo / proprietà dell'oggetto form, va a 
sovrascriverlo.
 
Quindi form.submit() da errore perché non punta più al metodo `submit`, 
bensì all'elemento con nome "submit", che non è ovviamente una funzione.

 la form ha name="ss-form"? Strano per google (name alle form è deprecato)
 
Forse in XHTML Strict, ma ormai dire che pure XHTML è deprecated: in 
HTML5 name è un attributo perfettamente valido.
 
Comunque, google non è mai stato noto per la sua conformità agli 
standard. Famosi erano i risultati dati dalla pagina principale del 
motore di ricerca, se passato in rassegna al validatore del w3c: un 
fiotto di errori a cascata. Questo perché loro puntavano ad avere un 
codice compatto e performante, più che ad avere un codice "formalmente 
valido".

 risultava null.
Sei sicuro? Perché allora la riga di codice
document.forms["ss-form"]["entry_0"].value="fatto";
viene eseguita senza problemi?
In ogni caso già provato anche con document.forms[0], l'assegnazione del 
valore al cammpo entry_0 ha successo ma la submit NO.

 <input type="submit" name="submit" value="Submit"></div></div></form>
 
Poi, il problema, è che questo pulsante sovrascrive il metodo "submit" 
della form. Ci sono diversi approcci per risolvere la cosa. Il primo che 
mi viene in mente, senza averlo testato, è:
 
     HTMLFormElement.prototype.submit.call(form);
 
Dove `form` è la variabile di cui sopra. Se il browser che vuoi 
supportare è talmente vetusto da non avere HTMLFormElement (vecchie 
versioni di IE), allora puoi provare con:
 
     document.createElement("form").submit.call(form);
 
Hope it helps.

 viene eseguita senza problemi?
Se sei sicuro che tale form non abbia il name, mi viene da pensare che 
la collection "forms", nei browser in cui hai provato il codice, 
contenga in egual misura i riferimenti a form sia tramite id che tramite 
name.
Per avere conferma, nel caso puoi fare un breve test, del tipo:
<form name="foo" id="bar"></form>
E lato JS:
document.forms["foo"] === document.forms["bar"] && document.forms[0] === 
document.forms["foo"];

 HTMLFormElement.prototype.submit.call(form);
 
Il tuo codice viene eseguito senza errori, proprio come quando copio la 
pagina web della form in locale e la richiamo dal disco.
Però la submit non ha effetto alcuno, e si verifica notando che mentre 
un click sul pulsante carica una pagina che avverte dell'avenuto invio 
dei dati, l'esecuzione del submit via codice ricarica la stessa pagina 
della form ma vuota.
Sto sbattendo la testa contro il muro per capire il perché...

 name.
 
IE una volta faceva di queste porcate ... lo farà ancora?

 IE una volta faceva di queste porcate ... lo farà ancora?
 
Quelle di IE erano "porcate" perché usava indifferentemente ID e NAME 
anche in metodi che *dichiaratamente* si aspettavano solo uno dei due 
(getElementById funzionava anche con il name, ad esempio).
In questo caso specifico, non ci vedrei niente di strano, se la 
collection forms prendesse sia id che name.

      form.nome_elemento
 
Sì, questo me lo ricordo (e lo uso), ma non pensavo che anche 
document.forms["blabla"] fosse equivalente a document.forms[0].elements
["blabla"] ... e se ho form name="pippo" e dentro un input name="pippo" 
cosa fa? E se ho 4 form, ognuna con input name="blabla"? Restituisce un 
array?
 

 Sto sbattendo la testa contro il muro per capire il perché...
Mi viene da pensare allora, che lato server si aspetti il submit della 
form dal pulsante di Submit. Ovvero, che tra i dati inviati in post, 
compaia un "Submit=Submit".
Non ho purtroppo tempo di provare personalmente, ma prova a fare una 
cosa del genere:
   var input = form.elements["submit"];
   input.type = "hidden";
   HTMLFormElement.prototype.submit.call(form);
Se non funzionasse così, prova con:
   var input = document.createElement("input");
   input.type = "hidden";
 
input.name
 = "submit";
   input.value = "Submit";
   form.appendChild(input);
   HTMLFormElement.prototype.submit.call(form);

 ["blabla"] ...
 
Stai facendo confusione, non è quello che ho detto; né che sta succedendo.
 
document.forms["blabla"] non è uguale a 
document.forms[0].elements["blabla"]; però document.forms["blabla"].foo 
è uguale a document.forms["blabla"].elements["foo"]; ed è questo il 
problema.
Se a "foo" sostituisci "submit", cosa ottieni? che 
document.forms["blabla"].submit non punta più al metodo "submit" bensì 
all'elemento submit. Quindi non puoi più invocarlo come metodo.
Per esser chiari:
 
   <form>
     <input type="text" name="foo" value="Foo" />
   </form>
 
   alert(document.forms[0].submit) // function
   alert(document.forms[0].submit.value) // undefined
   alert(document.forms[0].foo) // HTMLInputElement
   alert(document.forms[0].foo.value) // Foo
 
Mentre:
 
   <form>
     <input type="text" name="submit" value="Foo" />
   </form>
 
   alert(document.forms[0].submit) // HTMLInputElement
   alert(document.forms[0].submit.value) // Foo
 
Il che significa che in questo caso, se provi a eseguire il "metodo" 
submit (che non è più un metodo), ti dice, giustamente "non è una funzione".

 succedendo.
 
[CUT]
 
Chiaro, ma lui parlava di document.forms["ss-form"].submit(); che non 
andava perché c'era il tasto submit... io dicevo che non andava perché la 
form non aveva name="ss-form" (quindi a monte).

 form non aveva name="ss-form" (quindi a monte).
 
Nel momento stesso in cui ottiene l'errore "submit is not a function", 
vuol dire che la reference alla form è valida.

 HTMLFormElement.prototype.submit.call(form);
 
Che dire? Che siete fantastici! Ora funziona regolarmente.
Non hai il tempo di provare personalmente, ci mancava! Hai fatto anche 
troppo, e ringrazio.
 
Ammettendo anche che, senza il tuo aiuto, non ci sarei mai e poi mai 
arrivato. Dovrei studiare un po' di più questi dettagli, ma non saprei dove.
 
Grazie ancora.

 Grazie ancora.
 
De nada.

 chiedi pure.
Almeno una di queste risorse mi era già stata segnalata.
Non sono totalmente a digiiuno di js, di html e di css.
Però non conoscevo HTMLFormElement.prototype e non avrei mai avuto la 
tua intuizione (se è corretto chiamarla così) che "tra i dati inviati in 
post, compaia un "Submit=Submit".
Ecco, penso di essere completamente carente sulla parte relativa alle 
"transazioni html" (se mi permettete di chiamarle così). Spero di 
essermi spiegato.


Spero di averti chiarito un po' le idee.

 inviato sempre (a patto che abbia un name).
 
Per te è semplice, per me, non sapendolo, è geniale.
 
Tutto il resto è chiaro. Grazie dei link e del tempo che mi hai dedicato.

 HTMLFormElement.prototype
 
Verificato compatibilità (rispetto al lavoro che stai facendo)? Non sono 
sicuro perché li ho testati qualche tempo fa, ma se non ricordo male è 
stato introdotto in IE8 ... ripeto, magari ricordo male ma, se così è, 
escludere IE6-7 per il tuo progetto va bene?

 escludere IE6-7 per il tuo progetto va bene?
 
Io sono sempre in fase di "apprendistato", cioè sto lavorando per 
sfizio, a titolo di hobby, su idee e progetti personali che non hanno 
alcuno sviluppo commerciale.
Uso FF 3, 4 e successivi (chi ha tenuto il conto?), e per ora non mi 
sono preoccupato di altri browser. Certo, se poi la piccola applicazione 
che sto scrivendo funzionasse anche su IE7 ne sarei ben felice.
Tu hai qualche alternativa da suggerirmi? Grazie per la tua osservazione 
e l'eventuale risposta.

 qualche alternativa da suggerirmi? 
 
Così su due piedi no (anche perché non ho ben seguito il thread). Prima 
verifica se quello che ho detto è vero, poi capisci se ti interessa iE<8, 
e nel caso chiedi.
 

 Tu hai qualche alternativa da suggerirmi?
 
L'alternativa te l'ho già suggerita io nel mio post, dato che non sapevo
su che browser dovevi sviluppare - e quindi se avevi o meno
HTMLFormElement accessibile - ti ho indicato un metodo alternativo che a
occhio dovrebbe ugualmente funzionare. Senza fartelo andare a ripescare,
era il seguente:
 
    document.createElement("form").submit.call(form);
 
Il succo è più o meno lo stesso. Ovvero, necessiti di avere modo di
chiamare il metodo "submit" originale, ma quello dell'istanza di form è
stato sovrascritto. Quindi, crei un elemento form al volo, che eredita
da HTMLFormElement il metodo originale, e una volta che ha il
riferimento a quello lo chiami sull'instanza di form.
 
A meno che IE non gestisca internamente queste cose "a pene di segugio"
- e a volte lo fa - tutto dovrebbe funzionare. L'unico modo è testarlo.
 
Se non funzionasse, un'alternativa è simulare il click sul pulsante: non
ricordo quanti browser implementino il metodo click, e su quali
elementi, ma sui button e IE/Firefox dovrebbero supportarlo:
 
    document.forms[0].elements["submit"].click();
 
In questo modo dovrebbe fare sia il submit sia inviare la coppia valori
al server senza dover cambiare neanche il type del pulsante di submit.

> Se non funzionasse, un'alternativa è simulare il click sul pulsante: non
 
Direi che le risposte che mi sono state date sono più che esaurienti. 
Grazie ancora davvero.