4

可能重复:
Chrome 的 JavaScript 控制台是否懒于评估数组?

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

以这个片段为例:

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

当该片段被触发时,如果有两个项目与这些选择器匹配 google chrome 输出[, ]。基本上它是在寻找元素,但显示数据的速度似乎比它应该的要慢。

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

4

2 回答 2

4

考虑以下测试:

  • 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;

于 2012-11-18T21:21:33.787 回答
1

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

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

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

console.log($(this).find(' .buttons .cancel').toString());
于 2012-11-18T21:32:23.650 回答