Obtener la ruta del file de la ejecución actual del código JavaScript para el file JavaScript de dominio cruzado cargado dinámicamente

Necesito cargar JavaScript entre dominios
files dinámicamente para bookmarklets en mi sitio http://jsbookmarklets.com/

La solución debería satisfacer:

  • Obtener la ruta del file actual
  • El dominio de la página web actual y el file JS en ejecución son diferentes
  • La solución debe ser un browser cruzado
  • Se pueden cargar varios scripts al mismo time de forma asincrónica (es por eso que las preguntas relacionadas que se mencionan a continuación no encajan)

Quiero get la ruta del file de código JavaScript actual para cargar dinámicamente algunos resources más (más files CSS y JS como código personalizado y jQuery, jQuery UI y bibliotecas Ext JS) que se almacenan en la misma carpeta / relativa que el JavaScript Bookmarklet.

El siguiente enfoque no se ajusta a mi problema:

var scripts = document.getElementsByTagName("script"); var src = scripts[scripts.length-1].src; alert("THIS IS: "+src); 

Preguntas relacionadas que no se ajustan a mi problema:

  • Obtenga la url del file js que se está ejecutando actualmente cuando se carga dinámicamente
  • Obtener ruta de script

3 Solutions collect form web for “Obtener la ruta del file de la ejecución actual del código JavaScript para el file JavaScript de dominio cruzado cargado dinámicamente”

La solución actual que estoy usando, que funciona, pero es muy larga:

 var fnFullFilePathToFileParentPath = function(JSFullFilePath){ var JSFileParentPath = ''; if(JSFullFilePath) { JSFileParentPath = JSFullFilePath.substring(0,JSFullFilePath.lastIndexOf('/')+1); } else { JSFileParentPath = null; } return JSFileParentPath; }; var fnExceptionToFullFilePath = function(e){ var JSFullFilePath = ''; if(e.fileName) { // firefox JSFullFilePath = e.fileName; } else if (e.stacktrace) { // opera var tempStackTrace = e.stacktrace; tempStackTrace = tempStackTrace.substr(tempStackTrace.indexOf('http')); tempStackTrace = tempStackTrace.substr(0,tempStackTrace.indexOf('Dummy Exception')); tempStackTrace = tempStackTrace.substr(0,tempStackTrace.lastIndexOf(':')); JSFullFilePath = tempStackTrace; } else if (e.stack) { // firefox, opera, chrome (function(){ var str = e.stack; var tempStr = str; var strProtocolSeparator = '://'; var idxProtocolSeparator = tempStr.indexOf(strProtocolSeparator)+strProtocolSeparator.length; var tempStr = tempStr.substr(idxProtocolSeparator); if(tempStr.charAt(0)=='/') { tempStr = tempStr.substr(1); idxProtocolSeparator++; } var idxHostSeparator = tempStr.indexOf('/'); tempStr = tempStr.substr(tempStr.indexOf('/')); var idxFileNameEndSeparator = tempStr.indexOf(':'); var finalStr = (str.substr(0,idxProtocolSeparator + idxHostSeparator + idxFileNameEndSeparator)); finalStr = finalStr.substr(finalStr.indexOf('http')); JSFullFilePath = finalStr; }()); } else { // internet explorer JSFullFilePath = null; } return JSFullFilePath; }; var fnExceptionToFileParentPath = function(e){ return fnFullFilePathToFileParentPath(fnExceptionToFullFilePath(e)); }; var fnGetJSFileParentPath = function() { try { throw new Error('Dummy Exception'); } catch (e) { return fnExceptionToFileParentPath(e); } }; var JSFileParentPath = fnGetJSFileParentPath(); alert('File parent path: ' + JSFileParentPath); 
 var s = document.createElement('script'); s.setAttribute('src', 'code.js'); document.body.appendChild(s); 

¿No puedes simplemente hacer esto?

 var myScriptDir = 'http://somesite.tld/path-to-stuff/'; var s = document.createElement('script'); s.setAttribute('src', myScriptDir + 'code.js'); document.body.appendChild(s); // code inside http://somesite.tld/path-to-stuff/code.js will use myScriptDir to load futher resources from the same directory. 

Si no desea que el código dentro del script sea responsable de cargar resources adicionales, puede usar el atributo onload de la label del script, como s.onload=function(){...} . Para compatibilidad con browseres cruzados, primero puede cargar jQuery y luego usar la function getScript. Los enlaces relevantes son http://www.learningjquery.com/2009/04/better-stronger-safer-jquerify-bookmarklet y http://api.jquery.com/jQuery.getScript/

Algunos de los comentarios ya han mencionado esto, pero trataré de elaborar un poco más.

La manera más simple, más cruzada y de varios dominios de cruzar la ruta del script actual es codificar la ruta del script en el script en sí .

En general, puede estar cargando files de script de terceros, por lo que esto no sería posible. Pero en su caso, todos los files de script están bajo su control. Ya está agregando código para cargar resources (CSS, JS, etc.), también podría include la ruta del script.

  • ¿Cuál es la diferencia entre jQuery live () y el plugin liveQuery?
  • Validar date para cualquier persona mayor de 18 años con jQuery
  • cómo pasar encabezados en jQuery.load como ajax?
  • jQuery: elimine dinámicamente elementos principales onclick
  • orderar matriz con cadenas enteras tipo jQuery
  • jQuery data () con múltiples parameters?
  • ¿Dónde include las bibliotecas js en Ionic?
  • jQuery change append onClick
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.