为什么google chromes控制台延迟了?

时间:2012-11-18 21:08:40

标签: javascript jquery google-chrome

  

可能重复:
  Is Chrome’s JavaScript console lazy about evaluating arrays?

基本上我发现谷歌浏览器的开发工具存在问题。

以此代码段为例:

console.log($(this).find(' .buttons .cancel'));
$(this).find(' .buttons .cancel').remove();

当触发该代码段时,如果有两个项目与这些选择器匹配,则谷歌浏览器输出[, ]。基本上它是找到元素,但它在显示数据时似乎比它应该更慢。

我希望能够记录我要删除的项目,但就目前而言,我必须首先运行它而不使用.remove()行。然后在我知道它工作之后我可以使用remove()函数再次运行它。

2 个答案:

答案 0 :(得分:2)

考虑以下测试:

  • a={a:'a'}。它返回一个对象。
  • a.a='b'
  • 展开第一个命令的返回值。它显示a: "b"

因此,对象始终以Chrome浏览器控制台中首次打开时的状态显示。对于(伪)数组,重要的是控制台到达时的对象状态。这可能是在正常的javascript返回之后(很难说明原因。可能是性能原因)。

您可以通过始终记录不更改的元素来处理此问题,例如:

  • 原始值:console.log("hello")
  • DOM节点或jQuery对象的克隆:console.log($(this).find(".buttons .cancel").clone())

如果不能选择记录不可变对象,则仍可以在跟踪代码时进行记录:console.log(document); debugger;

答案 1 :(得分:1)

如果您将对象传递给Google Chrome的console.log(),该对象不是字符串或数字等原始值,则不会立即输出该对象的内容。可能由于某些进程间通信,实际从对象获取数据并输出到控制台有一些延迟。如果您立即修改同一个对象,这将导致问题,因为您不一定会在控制台中显示正确的内容。

一种解决方法是仅将完成的字符串传递给console.log()。因为字符串是不可变的,所以它们永远不会被其他任何东西改变,所以你不会被console.log()欺骗。

在您的情况下,您将删除下一行代码中的DOM元素。由于Chrome的计时怪异,这会删除DOM元素,console.log()实际上可以看到它们是什么并输出它们。你可以这样做,而不是立即显示字符串并将该字符串传递给console.log()

console.log($(this).find(' .buttons .cancel').toString());