ugrás a tartalomhoz

JavaScript saját fájlnév

presidento · 2010. Május. 15. (Szo), 18.09
Van arra valamilyen lehetőség, hogy kiderítsem, hogy éppen milyen nevű fájlban vagyok a JavaScripttel? (Inline script esetén nincs gond, nekem egy külsőleg betöltött script fájl esetén lenne rá szükségem.)

Eddig csak Firefox alá találtam nem szép, de működő megoldást:
  1. var fileName;  
  2. try { throw new Exception(); } catch(e) { fileName = e.fileName; };  
  3. alert( fileName );  
 
1

miért?

Thomas · 2010. Május. 15. (Szo), 18.47
egész pontosan miért van rá szükséged? jó pár éve dolgozom js-el, de nem volt még rá szükségem. lehet, hogy lenne egy logikusabb megoldás is.
2

már vártam

presidento · 2010. Május. 15. (Szo), 19.24
Már vártam a kérdést. :) A Web Worker-hez készítek egy framework-öt. Itt a háttérfolyamat SEMMIT sem kap meg a szülő folyamattól (se window, se document, semmi), ezért szükséges, hogy itt is újra betöltsem a keretrendszer scriptet.
3

Elküldöd neki

Poetro · 2010. Május. 15. (Szo), 19.35
És mi lenne ha elküldenéd neki az elérési utat, vagy bármit egy üzenetben?
  1. var worker = new Worker('x.js');  
  2. worker.postMessage("{type: 'path', 'value': 'http://example.com/XYZ'}");  
Ezt pedig egy JSON parserrel feldolgozod.
4

Automatizálni kéne…

presidento · 2010. Május. 15. (Szo), 20.56
Ez OK, de nem szeretném, hogy kétszer kelljen megadni a fálj nevet:
  1. <script src="myFramework.js"></script>  
  2. <script>  
  3. //...  
  4. init({ fileName:'myFramework.js' });  
  5. //...  
  6. </script>  
Természetesen van default érték, de ha a fejlesztő átnevezi / áthelyezi, ugyanitt vagyunk.
8

Hát csinálhatnád azt, hogy

inf · 2010. Május. 24. (H), 17.44
Hát csinálhatnád azt, hogy javascripttel szúratod be a fájlokat, vagy azt is, hogy a script-tag-be teszel valami jelzőt, hogy kell e inizializálni, vagy bármi ilyesmi... Nem hiszem, hogy olyan bonyolult lenne, és szerintem a lehető legrosszabb megoldás a fájlnév kikeresése, nem crossBrowser, és egyelőre nem is lehet azzá tenni.
9

IE is megvan…

presidento · 2010. Május. 24. (H), 17.54
…már csak a Chrome, Safari és az Opera hiányzik. :)
  1. var fileName;  
  2.   
  3. if ( !fileName ) {  
  4.     // Firefox  
  5.     try { throw new Error(); } catch(e) { fileName = e.fileName; };  
  6. }  
  7.   
  8. if ( !fileName ) {  
  9.     // Internet Explorer  
  10.     setTimeout(function() {  
  11.         var oldErrorHandler = onerror;  
  12.         onerror = function(nothing,url) {  
  13.             fileName = url;  
  14.             onerror = oldErrorHandler;  
  15.             return true;  
  16.         };  
  17.         throw 'ooops';  
  18.     },0);  
  19. }  
  20.   
  21. setTimeout(function(){alert(fileName);},200);  
5

FF,Chrome

inf · 2010. Május. 18. (K), 02.49
Én ezt használom backtrace vizsgálatra, ff és chrome alatt megy.
  1. var Exception=function ()  
  2. {  
  3.     return this.initialize.apply(this,arguments);  
  4. };  
  5. Exception.prototype.initialize=function (message,level)  
  6. {  
  7.     this.error=new Error();  
  8.     this.message=message;  
  9.     if (!isNaN(level))  
  10.     {  
  11.         this.seek(level);  
  12.     }  
  13. };  
  14. Exception.prototype.seek=function (level)  
  15. {  
  16.     this.level=4+level;  
  17.     var stack=(this.error.stack || this.error.stacktrace);  
  18.     var stackParser=/(?:^|\n).*((?:file|http|https):\/\/\S+?):(\d+).*/ig;  
  19.     var m,i=0;  
  20.     while (++i<this.level && (m=stackParser.exec(stack)))  
  21.     {}  
  22.     if (m)  
  23.     {  
  24.         this.file=m[1];  
  25.         this.line=m[2];  
  26.     }  
  27. };  
  28. Exception.prototype.toString=function ()  
  29. {  
  30.     if (isNaN(this.level))  
  31.     {  
  32.         this.seek(0);  
  33.     }  
  34.     return this.name+"\n"+this.message+" at "+this.file+" :"+this.line;  
  35. };  
  36. Exception.prototype.name="Exception";  
  37. Exception.prototype.file="[unknown file]";  
  38. Exception.prototype.line="[unkown line]";  
Ezt a részét érdemes átírnod:
this.level=4+level;



szerk:

Hmm érdekes, én úgy tudtam, hogy nincs Exception class javascriptben, hanem Error van helyette...
6

Jó az ötlet

presidento · 2010. Május. 18. (K), 20.17
De sajnos ez sem megoldás. Itt egész jó stacktrace van, de ez sem tudja kicsalni a fájlneveket IE és Opera alatt: http://eriwen.com/javascript/stacktrace-update/
7

Hát ie és opera alatt nekem

inf · 2010. Május. 24. (H), 17.38
Hát ie és opera alatt nekem sem sikerült, esetleg az eddigieket valahogy kombinálva talán össze lehetne tákolni, de szerintem biztosan van jobb megoldás a problémádra.