2009-03-10 12 views
17

Pregunta:BASE, Javascript, e Internet Explorer Firefox vs

IE y Firefox/Safari parecen tratar de manera diferente con base href y Javascript peticiones de tipo window.location. Primero, ¿es esta una descripción precisa del problema? ¿Que esta pasando? ¿Y cuál es la mejor solución entre navegadores para lidiar con esta situación?

Contexto:

tengo una pequeña Sitelet archivo plano PHP (que es en realidad un prototipo de pruebas de usabilidad).

dinámicamente genero valor HREF de la etiqueta BASE en PHP, es decir, si se está ejecutando en el servidor de la empresa, que es:

$basehref = 'http://www.example.com/alpha/bravo/UsabilityTest/'; 

y en mi máquina dev locales, es:

$basehref = 'http://ellen.local/delta/echo/foxtrot/UsabilityTest/';  

Para una de las tareas, que acumule una cierta entrada de usuario, hacer algunas transformaciones en él en Javascript, y enviar al servidor mediante código como este:

function allDone() { 
    // elided code for simplicity of stackoverflow question 
    var URI = "ProcessUserInput.php?"; 
    URI = URI + "alphakeys=" + encodeURI(keys.join(",")); 
    URI = URI + "&sortedvalues=" + encodeURI(values.join(",")); 
    window.location = URI; 
} 

Tanto el archivo javascript (que contiene la función allDone()) como el script PHP de procesamiento (ProcessUserInput.php) viven en un subdirectorio de UsabilityTest. En otras palabras, su URL real es

http://www.example.com/alpha/bravo/UsabilityTest/foxtrot/ProcessUserInput.php aka

$basehref . '/foxtrot/ProcessUserInput.php'

El problema

JavaScript de IE, básicamente, parece ignorar la base href. El javascript y el procesador PHP viven en el mismo directorio, por lo que la llamada a ProcessUserInput.php funciona bien. La entrada se procesa y todo funciona bien.

Pero cuando pruebo en Firefox, el código JavaScript que hace parecen utilizar la base href, debido a la salida de la secuencia de comandos se envía a

$basehref . '/ProcessUserInput.php' 

Esto rompe, porque ProcessUserInput.php está en un subdirectorio de basehref. Sin embargo, si agrego el nombre del subdirectorio a javascript, ya no funciona en IE.

Soluciones?

puedo pensar en algunas formas de resolver esto:

  • En Javascript, leer la propiedad href de la etiqueta BASE y anteponer manualmente a var URI en el javascript, llamar a una URL absoluta resuelto totalmente
  • Procese el .js file with PHP e inserte la variable $basehref en la secuencia de comandos
  • Mueva los archivos a
  • ¿Algo más?

estoy seguro de que hay otras maneras de resolver esto también. ¿Cuál es la mejor manera de lidiar con BASE HREF en JavaScript cuando IE y Firefox lo aplican de manera diferente en JavaScript?

Respuesta

7

Utilizando el método de window.location assign parece la respuesta más sencilla.

En lugar de

window.location = URI; 

estoy usando esto:

window.location.assign(URI); 

que está haciendo lo correcto, tanto en IE y Firefox.

+9

No, esto no resuelve el problema href base en IE (a partir de la versión 8). Acabo de sonreír cuando vi lo simple que se puede resolver, pero duró solo un minuto. –

+0

Según lo mencionado por @Halil Özgür, esta no debería ser la respuesta aceptada. – fritzmg

3

Creo que desea modificar window.location.pathname, no window.location. window.location es un objeto Location que tiene múltiples variables. Como resultado, los efectos de cambiarlo no están bien definidos. Sin embargo, window.location.pathname se define como la ruta relativa al host, que es lo que desea.

Si desea leer más sobre las muchas variables que se pueden cambiar en window.location, que haría el here. De acuerdo con la documentación de Mozilla, el cambio de cualquier variable en window.location debe volver a cargar la página con una nueva URL correspondiente a esos cambios.

+1

Escribir una cadena en una ubicación está bien, doc'd back tan lejos como JS 1.0. Consulte http://docs.sun.com/source/816-6408-10/location.htm#1193137 - "Si asigna una cadena a la propiedad de ubicación de un objeto, JavaScript crea un objeto de ubicación y asigna esa cadena a su propiedad href. " – bobince

+2

ruta de acceso no resuelve el problema. –

+0

window.location.pathname funcionó para mí en IE, gracias –

6

IE y Firefox/Safari parecen tratar de manera diferente las peticiones de tipo BASE HREF y Javascript window.location.

Sí, esto es una diferencia de larga data que se remonta a los primeros días de Netscape-vs-IE.

IE hace cumplir de base-href sólo en el punto un elemento de documento se interactuó-con. Entonces, puede createElement('a'), establecer un relativo href y click() it *, pero se ignorará el href base; appendChild it al documento que contiene el href base, y funcionará.

En los otros navegadores de la base-href se toma como global per-ventana y siempre aplicado. ¿Lo cual está bien? Parece ser no especificado. Los documentos originales de JavaScript dicen solamente que location.hash (y por lo tanto, location aplica como una cadena):

representa una URL completa

Así ajustarlo a una dirección URL relativa parece ser una operación definida.

(*: link.click() es un método no estándar compatible con IE y Opera)

leer la propiedad href de la etiqueta BASE y Prepend manualmente

Probablemente lo que Lo haré, sí, si estás muerto configurado usando < base>.

+0

gracias, como se sugirió ... Lo hice de esta manera window.location.href = document.getElementById ("myBase"). Href + 'Company #!/Companylist' ; Funcionó tanto en IE como en Chrome –

2

acaba de agregar $('base').attr('href') antes del enlace. (Usando jQuery) o

document.getElementBytagname('base').href 
+0

La línea anterior debe leer: document.getElementsByTagName ('base') [0] .href –

2

que tenían el mismo problema hoy en día, después de una investigación, no podía findn cualquier forma de anular este tema en IE9, lo que es un requiremente para mi proyecto, por lo que, hice lo siguiente enfoque (basado en jquery, pero es realmente fácil hacerlo en javascript simple).

href = function(url){ 
    if ($("base").length > 0){ 
     location.href= $("base").attr("href")+url; 
    }else{ 
     location.href = url; 
    } 
} 

Y luego, cambiar

location.href= 'emp/start' 

a

href('emp/start'); 
0

Siempre se puede usar vainilla JS :)

var href = document.getElementBytagname('base')[0].href 

espero que esto ayude.

Cuestiones relacionadas