Skip to content
0

Browser debug

DOM 篇

最近点击过的元素

打开控制台,多次点击 Elements 中的不同元素,然后在控制台,我们直接可以通过输入 $0、$1、$2、$3、$4 变量访问到最近点击过的元素

$0

检查难以捉摸的元素

有的时候,某些元素的展示状态和光标的位置有关,例如 CSS 的 hover 控制的元素。这个时候可以使用如下代码:

setTimeout(function() { debugger; }, 5000);

设置 5s 之后 debugger,在这 5s 只能,用鼠标触 DOM 元素发到我们想要的状态,这样就能够调试到我们预期状态的 DOM 了

监视聚焦的元素

在控制台打印当前光标聚焦的元素

(function () {
  let last = document.activeElement;
  setInterval(() => {
    if (document.activeElement !== last) {
      last = document.activeElement;
      console.log("Focus changed to: ", last);
    }
  }, 100);
})();

追踪篇

为什么页面跳转了

通过如下的方法可以知道,是哪部分的代码触发了页面的跳转

const dbg = () => {
  debugger;
};
history.pushState = dbg;
history.replaceState = dbg;
window.onhashchange = dbg;
window.onpopstate = dbg;

// 或者是
debug(window.location.replace);
debug(window.location.assign);

JS 断点

跳转到 JS 资源所在的 Source 面板的位置,找到目标行,插入断点,有多种形式:

  • 普通断点:鼠标左键
  • 插入代码:鼠标左键 + 鼠标右键 + Edit breakpoint
  • 插入 log 信息:鼠标右键 + Add logpoint
  • 插入条件断点:鼠标右键 + Add conditional breakpoint

堆栈信息

通过 console.trace() 就可以打印出 JS 代码执行处的堆栈信息

console.trace()

当然,也可以选择在适当的时候抛出异常 throw new Error(),同样会记录堆栈信息

控制台方法篇

监听 CLass 调用

浏览器控制台提供了 monitor 方法,用于监听方法的调用,例如有一个 Dog 类

class Dog {
  bark(count) {
    /* ... */
  }
}

我们想要知道所有 Dog 实例产生的调用,可以在控制台粘贴如下代码

var p = Dog.prototype;
Object.getOwnPropertyNames(p).forEach((k) => monitor(p[k]));
// or
var p = instance.constructor.prototype;
Object.getOwnPropertyNames(p).forEach((k) => monitor(p[k]));

可能会得到如下输出:

function bark called with arguments: 2

Copy 方法

利用 Copy 方法,可以在控制台拷贝许多不方便拷贝的内容

  • DOM 快照: copy(document.documentElement.outerHTML)
  • 资源的源数据 (例如图片): copy(performance.getEntriesByType("resource"))
  • 一个很大的 JSON blob, 使用: copy(JSON.parse(blob))
  • 本地存储的转储: copy(localStorage)
  • Etc.

Released under the MIT License.