经过一番探索,我找到了这个SO线程,在此基础上,我制作了一个非常非常hacky的解决方案(在Chrome和FF中都可以工作...不确定IE是否可以,但我怀疑它能否正常工作)。警告:这对我的特定用途非常有效,但您的效果肯定会有所不同。无论如何,这是我的代码:
getLogLocation: function() {
var ua = navigator.userAgent;
var isFF = ua.search(/firefox/i) !== -1 ? true : false;
var isChrome = ua.search(/chrome/i) !== -1 ? true : false;
if (isFF || isChrome) {
var stack = Error().stack,
cname = '',
funcPattern,
classPattern = /.*\/(.*)\.js/;
if (stack) {
var stacks = stack.split('\n');
if (stacks) {
var theStack;
if (isChrome) {
theStack = stacks[4];
funcPattern = /.*\.(.*)\s+\(/;
}
else {
theStack = stacks[2];
funcPattern = /^\.*(.*)\@/;
}
var matches = theStack.match(classPattern);
cname = matches[1] + '::';
matches = theStack.match(funcPattern);
cname += matches[1] + ':';
}
}
return cname;
}
}
如果你好奇我的技术栈是什么样子的,这里是相关的代码:
Firefox(省略了很多行)
".getClassName@http://127.0.0.1/javascripts/app/mixins/ConsoleMixin.js?_dc=1383836090216:72
.logMessage@http://127.0.0.1/javascripts/app/mixins/ConsoleMixin.js?_dc=1383836090216:31
.constructor@http://127.0.0.1/javascripts/app/BaseController.js?_dc=1383836089659:39
..."
Chrome(前两行是我必须适应的垃圾...之后,它类似于FF的堆栈字符串)
"Error
at Error (<anonymous>)
at Ext.define.getLogLocation (http://127.0.0.1/javascripts/app/mixins/ConsoleMixin.js?_dc=1383836606405:72:19)
at Ext.define.logMessage (http://127.0.0.1/javascripts/app/mixins/ConsoleMixin.js?_dc=1383836606405:31:24)
at new Ext.define.constructor (http://127.0.0.1/javascripts/app/BaseController.js?_dc=1383836606265:39:14)
..."
请参见this jsFiddle以获取一个可工作的示例...由于我们不再使用Ext JS,所以必须更改堆栈值。
现在,稍微解释一下。 getLogLocation
作为一个函数存在于 Ext JS 类中 (ConsoleMixin
),另一个函数在 ConsoleMixin 中 (logMessage
) 调用 getLogLocation,并且 logMessage 被我们外部类的函数 (constructor
) 调用,这就是为什么我必须补偿前两个堆栈值的原因。像我说的那样,非常 hacky 并且特定于我的需求,但希望有人能够利用它。