更新:感谢您的回复。为了澄清,我并不是真的在寻找一个记录器,而是更多的调试器/跟踪器 - 我希望转储每个执行的JavaScript以及执行时。我今天早些时候尝试过Venkman,但它不是很稳定。我的理论是Dojo代码甚至Firefox代码都存在问题。
这仅发生在Firefox 3.5 - 3.6 禁用Firebug (或刚刚未安装)时。
基本上,我正在使用dojo.io.bind在Dojo 0.4.3(我知道!)中发送一个AJAX请求(现已弃用!)。如果你熟悉,那就是使用dojo.io.XMLHTTPTransport作为传输。现在,它的工作方式基本上是它发送XHR,然后有一个名为startWatchingInFlight
的观察器函数,每10ms调用一次,以检查XHR的readyState属性。当属性为4时,它会做很多事情:
dojo.io.XMLHTTPTransport = new function () { /* I know, I know. I would never do this */
// somewhere in XMLHTTPTransport ...
this.startWatchingInFlight = function () {
// alert('watching...');
if (!this.inFlightTimer) {
this.inFlightTimer = setTimeout("dojo.io.XMLHTTPTransport.watchInFlight();",10);
}
};
this.watchInFlight = function () {
// alert('a glance');
// do a bunch of stuff...
var tif = foo(); // well, never mind how we get it but it's the object in flight
// tif.http is the XHR object
if (4 == tif.http.readyState) {
// call some stuff
}
}
this.bind = function (args) {
// somewhere in XMLHTTPTransport.bind ....
this.startWatchingInFlight();
http.send(query); // Again, http is the already-opened XHR object
// and so on
}
}
现在,这是有趣的部分!如果我在上面取消注释这两个警告,当执行此代码时,我只会得到一个警告:“正在观看...”。在第一次调用watchInFlight
之前的10ms内发生了一些事情,导致无法调用它。 (编辑:我也使用了日志语句而不是警报来达到同样的效果。)
所以,我需要的是一种跟踪JavaScript线程的方法,以查看阻止第一次调用watchInFlight
的内容。但是,如果你有解决上述问题的方法,我也会接受。
限制:我不能使用另一个库,除非你能用它来与 Dojo 0.4.3 玩得很好(我想我只是在我嘴里吐了一点。 ..我在开玩笑。道场一直都是一个很好的图书馆。)
非常感谢任何帮助。
答案 0 :(得分:3)
全部谢谢你的回答。 Venkman最终成为我用来逐步完成代码的工具,并让我了解问题所在。或者,相反,是。对于那些感兴趣的人,我的问题是由Firefox错误引起的:496087。也可能涉及此错误:501501。在Firefox 3.0.10 +中的帧之间使用时,看起来setTimeout和setInterval有点坏了。
Venkman非常方便,但有点不稳定。我偶尔会得到错误,表示执行堆栈中缺少数据。
答案 1 :(得分:2)
查看Javascript stacktrace library以便为所有浏览器执行此操作:)
答案 2 :(得分:1)
我不确定您发布的代码是否完全复制了您的问题,但无论如何您都有错字!
第一行中的 dojo.io.XMLHttpTransport
与第6行中的dojo.io.XMLHTTPTransport
不同。请注意,HTTP与Http的字母大小写不同。
因此,在执行超时评估时浏览器会失败,以确定要运行的函数。这就解释了为什么你没有看到任何错误信息...虽然,我希望它在启用firebug时也会失败。我唯一能想到的是firebug以某种方式影响了本机firefox js代码的执行方式eval
。
答案 3 :(得分:0)
这只是一个快速响应,但根据情况发出警报可能会让事情变得更糟。警报阻止代码执行。我建议不要使用警报,如果某种形式的调试程序是不可能的,请在页面上运行它并为自己设置一个纯HTML控制台进行输出。
<div id="console"></div>
代替警报,运行一个简单的函数,如:
function log(msg) {
document.getElementById("console").innerHTML += msg;
}
由于代码非常小,只需在您自己的伪堆栈跟踪中写入:
log("entering watchInFlight.");
IMO,警报非常适合立即反馈,除非涉及异步网络请求。在这些情况下,必须使用浏览器调试器或本土记录器。
答案 4 :(得分:0)
iirc,alert就像一个yield,在对话框出现时启用其他事件,因此它会改变你试图调试的代码的时间
答案 5 :(得分:0)
我们使用Blackbird,效果非常好。
答案 6 :(得分:0)
Aptana IDE有一个与firefox一起使用的浏览器调试器机制。因此,如果您可以正确设置它的来源,它可能让您从eclipse进行调试。请注意,它会为firefox安装一个插件。
答案 7 :(得分:0)
Firefox 3.5和3.6启用了Javascript JIT。在页面上使用Firebug时,JSD会禁用JIT,以便您可以有效地进行调试。因此,第一步是在about:config javascript.options.jit.content上更改JIT设置。如果安装了Firebug,您还可以尝试将“脚本”标记从“已启用”更改为“已禁用”。我建议你在继续之前先消除这种可能性。