2010-09-04 14 views
37

Actualmente estoy configurando la propiedad window.location.pathname para redirigir al usuario a una URL relativa. La nueva dirección URL tiene parámetros, por lo que la línea de JavaScript se parece a esto:Configuración JavaScript window.location

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

Ésta es exitosa en Firefox, Chrome, sin embargo codifica el signo de interrogación con '% 3F' y la petición falla posteriormente.

No estoy seguro de si estoy usando window.location correctamente. ¿Debo usar propiedades de window.location como pathname o href? Descubrí que, tan pronto como establezco una propiedad, la ubicación se vuelve a cargar, por lo que, por ejemplo, las propiedades de la búsqueda y la ruta no se pueden configurar por separado. ¿Se puede establecer window.location directamente? Solo necesito establecer una URL relativa con un parámetro.

Respuesta

56

pathname y muchas otras propiedades de location y enlaces reflejan sólo parte de la URL:

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

Como se puede ver, la parte ?... de la URL no es parte de la pathname; no tiene sentido escribir un valor que contenga ? en location.pathname, ya que esa parte de una URL no puede contener un signo de interrogación. Chrome está corrigiendo tu error codificando el personaje en una secuencia que significa un signo de interrogación literal, que no termina en pathname.

Estas propiedades son excelentes para dividir una URL en sus partes constituyentes para su procesamiento, pero es probable que no desee escribirle en este caso. En cambio, escriba al location.href. Esto representa la URL completa, pero está perfectamente bien escribir una URL relativa a ella; esto va a ser elaborado en relación con el valor actual, por lo que no es, de hecho, no hay necesidad de leer y dividir el pathname en absoluto:

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

Nota la codificación URL. Si un nombre de usuario puede contener caracteres distintos de los alfanuméricos, es probable que necesite esto para detener esos caracteres que rompen el parámetro. Siempre codifique URL cadenas arbitrarias antes de ponerlas en parte de una URL.

+1

Gracias por la explicación detallada. Cambié mi código para usar la propiedad href y también para llamar a encodeURIComponent(). – Mark

+1

Tenga en cuenta que [para la mayoría de los casos] (http://stackoverflow.com/questions/6725890/window-location-host-vs-window-location-hostname-and-cross-browser-compatibility), desea usar ' location.host' en lugar de 'location.hostname'. En resumen, esto se debe a que su código en algún momento puede ejecutarse en un servidor en un puerto que no sea 80. –

+0

Tenga en cuenta que en el caso (raro) cuando la fuente es un iframe, entonces necesita hacer window.parent.location .. ... –

11

Intente configurar la propiedad location.href en lugar de window.location.pathname.

+0

simplemente 'window.location = ...' es suficiente – vsync

+0

La asignación de un valor a 'window.location' provoca un error en TypeScript. Supongo que asignar a 'window.location.href' es la mejor opción. – mvermand

7

Usando window.location.href se considera la forma más segura establecer una URL. Creo que esto debería solucionar el problema de codificación.

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

Si eso no ayuda, muestre una URL de ejemplo.

Cuestiones relacionadas