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:
var fileName;
try { throw new Exception(); } catch(e) { fileName = e.fileName; };
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?

var worker = new Worker('x.js');
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:
<script src="myFramework.js"></script>
<script>
//...
init({ fileName:'myFramework.js' });
//...
</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. :)
var fileName;

if ( !fileName ) {
	// Firefox
	try { throw new Error(); } catch(e) { fileName = e.fileName; };
}

if ( !fileName ) {
	// Internet Explorer
	setTimeout(function() {
		var oldErrorHandler = onerror;
		onerror = function(nothing,url) {
			fileName = url;
			onerror = oldErrorHandler;
			return true;
		};
		throw 'ooops';
	},0);
}

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.

var Exception=function ()
{
	return this.initialize.apply(this,arguments);
};
Exception.prototype.initialize=function (message,level)
{
	this.error=new Error();
	this.message=message;
	if (!isNaN(level))
	{
		this.seek(level);
	}
};
Exception.prototype.seek=function (level)
{
	this.level=4+level;
	var stack=(this.error.stack || this.error.stacktrace);
	var stackParser=/(?:^|\n).*((?:file|http|https):\/\/\S+?):(\d+).*/ig;
	var m,i=0;
	while (++i<this.level && (m=stackParser.exec(stack)))
	{}
	if (m)
	{
		this.file=m[1];
		this.line=m[2];
	}
};
Exception.prototype.toString=function ()
{
	if (isNaN(this.level))
	{
		this.seek(0);
	}
	return this.name+"\n"+this.message+" at "+this.file+" :"+this.line;
};
Exception.prototype.name="Exception";
Exception.prototype.file="[unknown file]";
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.