いくつか突っ込んで、私はこのSOスレッドを思いついたので、その上に構築して、機能する非常にハックなソリューションを作成しました(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/; // looking for something between the last backslash and .js
if (stack) {
var stacks = stack.split('\n');
if (stacks) {
var theStack;
// the browsers create the stack string differently
if (isChrome) {
// the stack has getClassName, then logMessage, then our calling class, but Chrome has some added garbage
theStack = stacks[4];
funcPattern = /.*\.(.*)\s+\(/; // looking for something between a period and the first paren
}
else {
theStack = stacks[2];
funcPattern = /^\.*(.*)\@/; // looking for something between a period and an @ symbol
}
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 (最初の 2 行は、私が対応しなければならないゴミです...その後は、FF の Stack 文字列に似ています)
"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)
..."
動作する例については、この jsFiddleを参照してください... Ext JS ではなくなったため、スタック値を変更する必要がありました。
では、少し説明を。 getLogLocation
は Ext JS クラスの関数として存在し ( ConsoleMixin
)、ConsoleMixin 内の別の関数 ( logMessage
) は getLogLocation を呼び出し、logMessage は外部クラスの関数 ( constructor
) によって呼び出されます。これが、最初の 2 つのスタック値を補正する必要がある理由です。私が言ったように、非常にハックで私のニーズに固有のものですが、誰かがそれを利用できることを願っています.