Pregunta

¿Hay una manera sencilla y fiable para determinar la dirección URL del archivo JavaScript momento de aplicación inmediata (dentro de una página web)?

Mi único pensamiento sobre este tema es para escanear el DOM para toda la secuencia de comandos src atributos para encontrar cómo se hace referencia en el archivo actual y luego averiguar la URL absoluta aplicándolo a document.location. Alguien tiene otras ideas, ¿hay algún método súper fácil estoy totalmente por alto?

ACTUALIZACIÓN: los elementos de script que se accede a través del DOM ya tienen una propiedad src que contiene la dirección URL completa. No sé cómo ubicua / estándar que es, pero también, puede utilizar getAttribute("src") que devolverá cualquier prima atributo de valor está en el código HTML [X].

¿Fue útil?

Solución

Ponga esto en el archivo js que necesita saber su propia URL.

Fully Qualified (por ejemplo 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 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)
}());

http://www.glennjones.net/Post/809/getAttributehrefbug.htm para la explicación del parámetro getAttribute utilizado (se trata de un fallo de IE).

Otros consejos

Para los navegadores recientes, puede utilizar document.currentScript para obtener esta información.

var mySource = document.currentScript.src;

La ventaja es que es más fiable para los scripts que se cargan de forma asíncrona. La desventaja es que no es así, lo mejor que sé, universalmente compatible. Se debe trabajar en Chrome 29, Firefox> = 4, Opera> = 16. Al igual que muchas cosas útiles, que no parece> = a trabajar en el IE.

Cuando necesito para obtener una ruta del script, puedo comprobar para ver si se define document.currentScript, y, si no, utilizar 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- Estados Unidos / docs / web / API / document.currentScript

como aparece en fuente (por ejemplo /js/main.js), esto es cross-browser :

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
}()); 

Fully Qualified (por ejemplo http://www.example.com/js/main.js):

Después de algunas pruebas, parece difícil de conseguir en el completo uno de una manera multi-navegador. La solución sugerido por la Media Luna fresca no funciona en Internet Explorer 8 para obtener el completo , incluso si funciona en IE7

Este método de trabajo con Defer, asíncrono y carga diferida Dado que se conoce el nombre del archivo de secuencia de comandos, y si va a 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 plugin de jQuery con ella: https://github.com/mkdgs/mkdgs -snippet / blob / master / javascript / jquery.plugins.template.js

Nota: esto no funcionará con la escritura local cargada por jQuery.getScript (), ya que no hay etiqueta de script añadido en el DOM. la secuencia de comandos sólo se evalúa en el espacio global. http://api.jquery.com/jQuery.getScript/

solucionarlo se puede 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);
                }
          }
     });
}

Si se trata de una solución estrictamente cliente, el suyo suena bastante bien.

Si está escribiendo código en el servidor, que probablemente podría simplemente rellenar un campo de div / oculto / (insertar su elemento favorito HTML aquí) con la URL resuelto por completo a la escritura, y recoger hasta que con su javascript en el clientside .

Es posible que desee echar un vistazo a https: //addons.mozilla .org / es-eS / firefox / addon / 10345 si está interesado en el aprendizaje que funciona (y por tanto qué archivo) se están ejecutando en una página que no controlas.

Si está interesado en averiguar cuál de su guiones está ejecutando, entonces hay un número de maneras. Con Firebug se podía console.log() la información. Incluso acaba de poner las declaraciones de alerta en su código (mientras molesto) puede ayudar a depurar de forma de baja tecnología. También se podría plantear errores y atraparlos, entonces el proceso usando las propiedades del error (ver: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error )

Sin embargo, ¿por qué esto es importante? Si el guión está causando errores ya continuación, es bastante fácil determinar dónde se produce el error. Si no se trata de errores en absoluto, entonces ¿cuál es la ventaja de saber que archivo viene?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top