2010-06-10 9 views
19

Hola a todos, he estado tratando de juntar una función genérica que recupera la URL absoluta de un archivo JavaScript que se ejecuta en una página web:conseguir el URL de la ejecución de archivo JavaScript (IE6-7 problema en su mayoría)

http://gist.github.com/433486

Básicamente se llega a llamar a algo como esto:

getScriptName(function(url) { 
    console.log(url); 
    // http://www.example.com/myExternalJsFile.js 
}); 

dentro de un archivo JavaScript externo en una página y luego puede hacer algo con él (como encontrar la etiqueta <script> que lo ha cargado, por ejemplo).

Funciona de maravilla en casi todos los navegadores que he probado (Firefox, Chrome, Safari, Opera v10 al menos e IE 8).

Parece fallar, sin embargo, en IE 6 y 7. La función de devolución de llamada se ejecuta, pero el nombre recuperado es la URL de la página HTML principal, no el archivo JavaScript. Continuando con el ejemplo, getScriptName invoca la devolución de llamada con el parámetro: http://www.example.com/index.html

Así que todo lo que realmente te pido es que si hay alguna otra manera de conseguir la URL del archivo actual de JavaScript (que podría ser IE 6 y 7 hackery específica)? ¡Gracias por adelantado!

EDIT: Además, esto no va a funcionar en todos los casos, por lo que no recomiendo:

var scripts = document.getElementsByTagName("script"); 
return scripts[scripts.length-1].src; 

me gustaría que funcione en el caso de etiquetas de script creados dinámicamente (posiblemente no colocado al final de la página), también conocido como carga lenta.

+1

Código y pregunta agradables. Aunque no conozco una respuesta a esto, solo quiero darte algunas optimizaciones: puedes cambiar cada 'obj ['prop']' a 'obj.prop' y como 'typeof' siempre devuelve una cadena, no es necesario probar la identidad ('==='); probar la igualdad ('==') es lo suficientemente bueno. Estos funcionan ligeramente mejor que las cosas en tu código. –

+0

Gracias. Ya, sé que puedo reemplazar obj ['prop'] por obj.prop, simplemente lo tenía de esa manera en preparación para enviar la función al compilador de cierres de Google, lo que destruiría esos nombres de variables. Sin embargo, voy a cambiar el === a a==, ¡gracias! – TooTallNate

+0

Acabo de probar el acceso a 'obj ['prop']' contra 'obj.prop', pero al contrario de lo que pensaba, en Firefox la diferencia era insignificante, mientras que en Chrome la primera era en realidad * más rápida * que la última . Estoy realmente sorprendido por esto, podría tener algo que ver con la 'compilación' de JavaScript por V8. –

Respuesta

1

Mucho de esto depende de a qué tiene acceso. Si, como parece, está intentando hacer esto completamente dentro del código JS, no creo que pueda hacerlo, por alguna de las razones que se muestran arriba. Podría obtener el 90% del camino tal vez, pero no ser definitivo.

Si está trabajando en un entorno dotnet (que es el único que conozco), le sugiero que utilice un módulo que intercepte todas las solicitudes JS y agregue la ubicación de solicitud, o algo por el estilo.

Creo que debe abordar esto desde el lado del servidor, no desde el lado del cliente. No creo que tengas una respuesta definitiva desde el lado del cliente. Creo que también tendrá dificultades para obtener una respuesta del lado del servidor, pero podría ser más exitoso.

1

Lo siento, sospecho que podría tener problemas con esto. IE anterior a la versión 8 normalmente da mensajes de error de errores de javascript de la forma:

line: 342 
char: 3 
error: expected identifier, string or number 
code: 0 
url: http://example.com/path/to/resource 

donde el URL es la window.location.href, en lugar de la URL del recurso Javascript externo que contiene el problema. Sugiero que IE proporcione el valor de URL inútil ya que la URL del script no está disponible para IE en ese momento, y tampoco está disponible para ningún Javascript que pueda escribir para intentar mostrarlo.

Me encantaría poder enlazar a las notas de la versión de IE8 que dicen que este error/función ha sido corregido, de ahí la razón por la que creé esto como wiki de la comunidad. ¡Mi MSDN foo es bastante débil!

Cuestiones relacionadas