Newsgroup: it.comp.lang.javascript
Titolo: [AJAX] Una funzione per trasformare una form in querystring

Salve a tutti,
esiste, che voi sappiate, una funzione già pronta per trasformare i
valori di un'intera form in una querystring pronta per essere data in
pasto a un oggetto XMLHTTPRequest?
Grazie :)

      el1[ el1.length ] = 
el.name
 + '=' + el.value;
Suggerirei, però, di modificare la riga precedente in questo modo:
 
 el1[ el1.length ] = encodeURIComponent( 
el.name
 ) + 
                '=' + encodeURIComponent( el.value );
MM

 volevo usare encode() e me lo sono scordato :-(
Bisogna però usare 'encodeURIComponent()', perché 'encode()' lascia immutato
il '+' (che invece va trasformato in '%2B').
Max

 e ora sono uno splendido quarantenne."
Grazie mille!

 anche tu c'hai ragione.
Forse entrambi volevate intendere "escape()"? Inoltre è corretto sia
l'uso di escape che l'encodeURIComponent. Dipende tutto da come devi
inviare i dati, e da come devi leggerli server-side.
Devi inviare i dati in "ISO Latin"? Allora devi usare "escape()". Se
devi inviarli in "UTF-8", allora devi usare "encodeURIComponent()".
Mi è capitato di dover inviare dei dati a un componente server-side,
sul quale non avevo acesso, e questo gestiva solo l' "ISO Latin". Da
allora, ho aggiunto un parametro all'oggetto che si occupa di questo
genere di cose, per specificare la codifica da usare.
Mi è tornato utile anche in altre occasioni.
-- 
~ Se i sintomi persistono, insultare il medico.

 Forse entrambi volevate intendere "escape()"?
Intedevo dire 'escape', non 'encode'. Perň 'escape' non va bene per i
parametri della query string, in quanto non trasforma adeguatamente il
carattere '+', che lasciato immutato verrebbe -lato server- erroneamente
decodificato come uno spazio. Se vuoi usare 'escape', devi poi preoccuparti
anche di trasformare il '+' in '%2B'.
Max

 anche di trasformare il '+' in '%2B'.
Certamente. Ma non è una questione di "volere", ma di necessità.


 che non viene "escapato".
Non è detto che è un bug, ho detto che non va bene nel contesto della
funzione si stava scrivendo in questo thread: se  '
el.name
' o 'el.value'
contengono un '+', questo finisce immutato nella query string e verrà poi
erroneamente interpretato come uno spazio. Quindi non puoi usarla, a meno
che non trasformi "a mano" il '+'. encodeURIComponent, invece, traduce
il '+' in '%2B'.
Max

 o in UTF-8.
Aggiungo due cose.
Il fatto che encodeURI/encodeURIComponent usino UTF-8 deriva dal fatto che
quello è l'encoding "raccomandato" dall'RFC 2718 e adottato da molti "URI
scheme" standardizzati. Non ha molto senso usare altri encoding, secondo
me.
Nella documentazione di Mozilla, 'escape' è 'deprecated' da Javascript 1.5
in poi.
Inoltre, non è concettualmente corretto dire che 'escape' "encoda" in ISO
Latin. Il funzionamento standard di "escape" è descritto nell'ECMA-262,
dove si ragiona esclusivamente in termini di caratteri Unicode. "escape"
usa usa la forma "%xx" se il "code point value" del carattere è minore di
256, diversamente usa la forma "%uxxxx". Poi, ovviamente, siccome i codici
ISO-8859-1 (Latin1) coincidono con quelli Unicode, l'effetto visibile è
quello che descrivi tu.
Max

 funzione si stava scrivendo in questo thread: 
Non va bene usato in quel modo, e su questo siamo d'accordo mi pare.
Dico solo che è sbagliato dire che *bisogna* usare una o l'altra, in
generale. Dipende dal tipo di codifica che si necessita. Mi sembrava
importante sottolinearlo.


 Latin. 
Dato che hai citato la documentazione di Javascript:
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Predefined_Functions:escape_and_unescape_Functions


 pareva giusto sottolinearlo, dato che nessuno l'aveva fatto.
Ma no... Poi decodifichi UTF-8 con le apposite funzioni PHP...

 Ma no... Poi decodifichi UTF-8 con le apposite funzioni PHP...
*Sigh*
Ma almeno l'hai letto il mio suddetto post? :)
...Cercherň di consolarmi con l'aforisma di Wilde, "Vivo nel terrore
di non essere frainteso"... :)
-- 
~ Ci si aspetta di tutto, ma non si e' mai preparati a nulla.
(M.Swetchine)

 (M.Swetchine)
Ah sì, scusami ho letto bene e ora ho capito... :)