Me encontré con este método para producir un seguimiento de pila de Javascript (para arreglar un error específico de IE): http://pastie.org/253058.txt que suena realmente útil, pero cuando lo llamo, La traza de pila que obtengo es para el código del script en sí.JavaScript Stack Trace en IE (o quizás solo un simple error de Javascript)
¿Se puede cambiar este código para generar un seguimiento de pila general? ¿O hay una mejor manera de obtener un seguimiento de pila en IE?
(function() {
YOUR_NAMESPACE.getStackTrace = (function() {
var mode;
try {(0)()} catch (e) {
mode = e.stack ? 'Firefox' : window.opera ? 'Opera' : 'Other';
}
switch (mode) {
case 'Firefox' : return function() {
try {(0)()} catch (e) {
return e.stack.replace(/^.*?\n/,'').
replace(/(?:\[email protected]:0)?\s+$/m,'').
replace(/^\(/gm,'{anonymous}(').
split("\n");
}
};
case 'Opera' : return function() {
try {(0)()} catch (e) {
var lines = e.message.split("\n"),
ANON = '{anonymous}',
lineRE = /Line\s+(\d+).*?in\s+(http\S+)(?:.*?in\s+function\s+(\S+))?/i,
i,j,len;
for (i=4,j=0,len=lines.length; i<len; i+=2) {
if (lineRE.test(lines[i])) {
lines[j++] = (RegExp.$3 ?
RegExp.$3 + '()@' + RegExp.$2 + RegExp.$1 :
ANON + RegExp.$2 + ':' + RegExp.$1) +
' -- ' + lines[i+1].replace(/^\s+/,'');
}
}
lines.splice(j,lines.length-j);
return lines;
}
};
default : return function() {
var curr = arguments.callee.caller,
FUNC = 'function', ANON = "{anonymous}",
fnRE = /function\s*([\w\-$]+)?\s*\(/i,
stack = [],j=0,
fn,args,i;
while (curr) {
fn = fnRE.test(curr.toString()) ? RegExp.$1 || ANON : ANON;
args = stack.slice.call(curr.arguments);
i = args.length;
while (i--) {
switch (typeof args[i]) {
case 'string' : args[i] = '"'+args[i].replace(/"/g,'\\"')+'"'; break;
case 'function': args[i] = FUNC; break;
}
}
stack[j++] = fn + '(' + args.join() + ')';
curr = curr.caller;
}
return stack;
};
}
})();
¿Qué quiere decir "para el código del script en sí"? La llamada al código de seguimiento de la pila debe estar en la parte superior del seguimiento de la pila, pero debajo de eso está la persona que llama, ¿no? –
Hola Jeremy, Ese puede ser el caso. Estoy mostrando el texto usando alerta(), pero el texto que obtengo termina en '...' así que tal vez es demasiado grande y el rastro real está justo debajo de esto. ¿Es posible eliminar la llamada 'función de rastreo' de la salida? – Gavin