2010-09-04 26 views
37

Attualmente sto impostando la proprietà window.location.pathname per reindirizzare l'utente a un URL relativo. Il nuovo URL dispone di parametri, in modo che la linea di JavaScript è simile al seguente:Impostazione JavaScript window.location

window.location.pathname = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1) + 'myPage.xhtml?u=' + selected_user.Username; 

Questo è successo in Firefox, ma Chrome codifica il punto interrogativo con '% 3F' e la richiesta in seguito fallisce.

Non sono sicuro se sto utilizzando window.location correttamente. Devo usare le proprietà di window.location come pathname o href? Ho scoperto che non appena ho impostato una proprietà, la posizione viene ricaricata, quindi, ad esempio, le proprietà di ricerca e di percorso non possono essere impostate separatamente. È possibile impostare window.location direttamente? Ho solo bisogno di impostare un URL relativo con un parametro.

risposta

56

pathname e molte altre proprietà di location e collegamenti riflettono solo parte del URL:

http: //www.example.com/path/to/example.html?param1=2&param3=4#fragment 
^protocol^hostname  ^pathname   ^search   ^hash 

Come si può vedere, la parte del ?... l'URL non è parte del pathname; non ha senso scrivere un valore contenente ? a location.pathname, poiché quella parte di un URL non può contenere un punto interrogativo. Chrome sta correggendo il tuo errore codificando il personaggio in una sequenza che significa un punto interrogativo letterale, che non termina pathname.

Queste proprietà sono ideali per suddividere un URL nelle parti che lo costituiscono per l'elaborazione, ma probabilmente non si desidera scrivere in questo caso. Invece, scrivi a location.href. Questo rappresenta l'intero URL, ma è perfettamente corretto scrivere un URL relativo ad esso; questo sarà elaborato rispetto al valore corrente, per cui v'è infatti alcun bisogno di leggere e dividere il pathname affatto:

location.href= 'myPage.xhtml?u='+encodeURIComponent(selected_user.Username); 

Nota l'URL-codifica. Se un nome utente può contenere caratteri diversi da quelli alfanumerici, questo probabilmente servirà per fermare quei caratteri che infrangono il parametro. Sempre codifica con URL stringhe arbitrarie prima di inserirle in una parte di un URL.

+1

Grazie per la spiegazione dettagliata. Ho cambiato il mio codice per utilizzare la proprietà href e anche per chiamare encodeURIComponent(). – Mark

+1

Si noti che [per la maggior parte dei casi] (http://stackoverflow.com/questions/6725890/window-location-host-vs-window-location-hostname-and-cross-browser-compatibility), si desidera utilizzare ' location.host' invece di 'location.hostname'. In breve, questo è dovuto al fatto che il codice a un certo punto può essere eseguito su un server su una porta diversa da 80. –

+0

Nota che nel (raro) caso in cui l'origine è un iframe, allora deve fare window.parent.location .. ... –

11

Provare a impostare la proprietà location.href anziché window.location.pathname.

+0

just 'window.location = ...' è sufficiente – vsync

+0

L'assegnazione di un valore a 'window.location' provoca un errore in TypeScript. Suppongo che l'assegnazione a 'window.location.href' sia l'opzione migliore. – mvermand

7

L'utilizzo di window.location.href è considerato il modo più sicuro per impostare l'URL. Penso che questo dovrebbe risolvere il problema di codifica.

window.location.href = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1) + 'myPage.xhtml?u=' + selected_user.Username; 

Se ciò non aiuta, si prega di mostrare un URL di esempio.

Problemi correlati