world - script javascript html
¿Cuál es mi script src URL? (6)
Este método funciona con aplazamiento, asíncrono y carga diferida. Ya que conoce el nombre de archivo de su secuencia de comandos y si será único.
/* see
* http://stackoverflow.com/questions/984510/what-is-my-script-src-url/984656#984656
* http://www.glennjones.net/Post/809/getAttributehrefbug.htm
*
* iterate all script to find script with right filename
* this work with async and defer (but your script MUST have a unique filemane)
* mozilla support document.currentScript and we use it, if is set
*
* this will not work with local script loaded by jQuery.getScript(),
* since there is no script tag added into the dom. the script is only evaluated in global space.
* http://api.jquery.com/jQuery.getScript/
*
* to fix this odd, you can add a reference in meta ( meta[name=srcipt][content=url] )
* when you load the script
*/
var scriptFilename = ''jquery.plugins.template.js''; // don''t forget to set the filename
var scriptUrl = (function() {
if (document.currentScript) { // support defer & async (mozilla only)
return document.currentScript.src;
} else {
var ls,s;
var getSrc = function (ls, attr) {
var i, l = ls.length, nf, s;
for (i = 0; i < l; i++) {
s = null;
if (ls[i].getAttribute.length !== undefined) {
s = ls[i].getAttribute(attr, 2);
}
if (!s) continue; // tag with no src
nf = s;
nf = nf.split(''?'')[0].split(''/'').pop(); // get script filename
if (nf === scriptFilename) {
return s;
}
}
};
ls = document.getElementsByTagName(''script'');
s = getSrc(ls, ''src'');
if ( !s ) { // search reference of script loaded by jQuery.getScript() in meta[name=srcipt][content=url]
ls = document.getElementsByTagName(''meta'');
s = getSrc(ls, ''content'');
}
if ( s ) return s;
}
return '''';
})();
var scriptPath = scriptUrl.substring(0, scriptUrl.lastIndexOf(''/''))+"/";
una plantilla de complemento jquery con él: https://github.com/mkdgs/mkdgs-snippet/blob/master/javascript/jquery.plugins.template.js
Nota: esto no funcionará con el script local cargado por jQuery.getScript (), ya que no hay una etiqueta de script añadida al dom. el script solo se evalúa en el espacio global. http://api.jquery.com/jQuery.getScript/
para arreglarlo puedes hacer algo como:
function loadScript(url,callback) {
if ( $(''[src="''+url+''"]'').length ) return true; // is already loaded
// make a reference of the loaded script
if ( $(''meta[content="''+url+''"]'', $("head")).length ) return true; // is already loaded
var meta = document.createElement(''meta'');
meta.content = url;
meta.name = ''script'';
$("head").append(meta);
return $.ajax({
cache: true,
url: u,
dataType: ''script'',
async: false,
success : function (script) {
try {
if ( typeof callback == ''function'' ) callback();
} catch (error) {
//console.log(error);
}
}
});
}
¿Existe una manera simple y confiable de determinar la URL del archivo JavaScript que se está ejecutando actualmente (dentro de una página web)?
Mi único pensamiento en esto es escanear el DOM para todos los atributos src
del script para encontrar cómo se hizo referencia al archivo actual y luego calcular la URL absoluta aplicándola a document.location
. Alguien tiene otras ideas, ¿hay algún método super fácil que pase por alto por completo?
ACTUALIZACIÓN: los elementos de script accedidos a través del DOM ya tienen una propiedad src
que contiene la URL completa. No sé qué tan omnipresente / estándar es, pero alternativamente puede usar getAttribute("src")
que devolverá el valor del atributo sin formato en el [X] HTML.
Para navegadores recientes, puede usar document.currentScript para obtener esta información.
var mySource = document.currentScript.src;
Lo bueno es que es más confiable para scripts que se cargan de forma asíncrona. La desventaja es que, como yo sé, no es universalmente compatible. Debería funcionar en Chrome> = 29, FireFox> = 4, Opera> = 16. Como muchas cosas útiles, parece que no funciona en IE.
Cuando necesito obtener una ruta de script, verifico si document.currentScript está definido, y si no, uso el método descrito en la respuesta aceptada.
if (document.currentScript) {
mySource = document.currentScript.src;
} else {
// code omitted for brevity
}
https://developer.mozilla.org/en-US/docs/Web/API/document.currentScript
Pon esto en el archivo js que necesita saber su propia url.
Totalmente calificado (ej. http://www.example.com/js/main.js
):
var scriptSource = (function(scripts) {
var scripts = document.getElementsByTagName(''script''),
script = scripts[scripts.length - 1];
if (script.getAttribute.length !== undefined) {
return script.src
}
return script.getAttribute(''src'', -1)
}());
O como aparece en la fuente (por ejemplo, /js/main.js
):
var scriptSource = (function() {
var scripts = document.getElementsByTagName(''script''),
script = scripts[scripts.length - 1];
if (script.getAttribute.length !== undefined) {
return script.getAttribute(''src'')
}
return script.getAttribute(''src'', 2)
}());
Consulte http://www.glennjones.net/Post/809/getAttributehrefbug.htm para obtener una explicación del parámetro getAttribute
que se está utilizando (es un error de IE).
Puede consultar https://addons.mozilla.org/en-US/firefox/addon/10345 si le interesa saber qué funciones (y, por lo tanto, qué archivo) están ejecutando en una página que no utiliza. t control.
Si está interesado en averiguar cuál de sus scripts se está ejecutando, entonces hay varias maneras. Con Firebug podrías console.log()
la información. Incluso poner declaraciones de alerta en su código (aunque sea molesto) puede ayudar a depurar de una manera poco tecnológica. También podría generar errores y atraparlos, luego procesar usando las propiedades del error (ver: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error )
Sin embargo, ¿por qué sería esto importante? Si el script ya está causando errores, entonces es bastante fácil determinar dónde se está produciendo el error. Si no se trata de errores, ¿cuál es la ventaja de saber de qué archivo proviene?
Si esta es una solución estrictamente cliente, la suya suena bastante bien.
Si está escribiendo código en el servidor, probablemente podría rellenar un campo div / oculto / (inserte aquí su elemento favorito de HTML) con la URL completamente resuelta para el script, y selecciónelo con su javascript en el lado del cliente.
Como aparece en la fuente (por ejemplo, /js/main.js
), este es un navegador cruzado :
var scriptSource = (function()
{
var scripts = document.getElementsByTagName(''script''),
script = scripts[scripts.length - 1];
//No need to perform the same test we do for the Fully Qualified
return script.getAttribute(''src'', 2); //this works in all browser even in FF/Chrome/Safari
}());
Totalmente calificado (ej. http://www.example.com/js/main.js
):
Después de algunas pruebas, parece difícil obtener la totalmente calificada de forma cruzada. La solución sugerida por Crescent Fresh no funciona en IE8 para obtener la calificación completa , incluso si funciona en IE7