前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在 Chrome DevTools 中调试 JavaScript

在 Chrome DevTools 中调试 JavaScript

作者头像
从入门到进错门
发布于 2020-03-17 04:06:28
发布于 2020-03-17 04:06:28
5.7K02
代码可运行
举报
运行总次数:2
代码可运行

文章目录

由浅入深说一说怎么样在 Chrome DevTools 中调试 JavaScript。

一、案发现场

为了方便理解,我写了一个小demo。

  1. 点击打开demo
  2. 在num1中输入6;
  3. 在num2中输入9;
  4. 点击 num1+num2,按钮下方的标签显示 69,结果应为 15,这就是我们需要断点调试找出的 BUG 。

二、熟悉一下 Sources 面板

DevTools 可为更改 CSS、分析页面加载性能和监控网络请求等不同的任务提供许多不同的工具。 我们就在 Sources 面板中调试 JavaScript。

通过按 Command+Option+I (Mac) 或 Control+Shift+IWindows、Linux),打开 DevTools。 此快捷方式可打开 Console 面板。点击 Sources 面板。

Sources 面板包含 3 个部分

  1. 文件预览 窗口。 此处列出页面请求的每个文件。
  2. 代码编辑 窗口。 在 文件预览 窗口中选择文件后,此处会显示该文件的具体内容。
  3. JavaScript 调试 窗口。 包含检查页面 JavaScript 的各种工具。 如果 DevTools 窗口布局较窄,此窗口会显示在 代码编辑 窗口下方。

三、使用断点暂停代码

调试上面这种问题的常用方法是将多个 console.log() 语句插入代码,以便在执行脚本的时候检查相关变量的值。

虽然 console.log() 方法可以完成任务,但断点可以更快完成此任务。 断点可在执行代码的过程中暂停代码,并在此时及时检查所有相关变量的值。 与 console.log() 方法相比,断点具有一些优势:

  1. 使用 console.log(),需要手动打开源代码,查找相关代码,插入 console.log() 语句,然后重新加载此页面,才能在控制台中看到这些消息。 使用断点,无需了解代码结构即可暂停相关代码。
  2. console.log()语句中,您需要明确指定要检查的每个值。 使用断点,DevTools 会在暂停时及时显示所有变量值。
  3. 简言之,与 console.log() 方法相比,断点可以更快地查找和修正 BUG 。

接下来我们开始思考一开始抛出的程序的运作方式,我们可以根据经验推测出,我们在点击num1+num2按钮的时候触发的 click 事件肯定和 6+9=69 计算不正确有关系。 因此,我们可能需要在 click 侦听器运行的时候暂停代码。 Event Listener Breakpoints 可以完成此任务:

  1. JavaScript 调试 窗口中,点击 Event Listener Breakpoints 前面的展开按钮。 可以看见 Animation、Canvas、Clipboard 等一系列事件;
  2. 在页面输入框中输入num1和num2的值;
  3. 展开 Mouse 事件,每个事件旁都有一个复选框。勾选 click 复选框。 DevTools 现在可以在任何 click 事件侦听器运行时自动暂停。
  4. 点击页面中的num1+num2按钮。此时页面如下图:

这是因为我装的浏览器插件导致的定位不准,最好在无痕模式进行操作。不过也不影响,我们点击一下最左边页面上的蓝色按钮,再点击中间的打括号(格式化代码),就可以定位准确并且格式化好代码:

四、检查变量的值

1. Scope窗口

在某代码行暂停时,Scope 窗格会显示当前定义的局部和全局变量,以及各变量值。 其中还会显示闭包变量(如果适用)。 双击变量值可进行编辑。 如果不在任何代码行暂停,则 Scope 窗格为空。

2. Watch监听变量变化

Watch 标签可监视变量值随时间变化的情况。 并且,监视不仅限于监视变量。 我们可以将任何有效的 JavaScript 表达式存储在监视表达式中。 我们尝试这样: - 点击 Watch 标签。 - 点击 右边的 + 添加表达式。 - 输入 typeof n。 按 Enter 键。(这里代码是打包后的,n表示num1输入框的值) - DevTools 会显示 typeof n: "string"。 冒号右侧的值就是监视表达式的结果。

3. 控制台

控制台除了查看 console.log() 消息以外,还可以使用控制台对任意 JavaScript 语句求值。 对于调试,可以使用控制台测试 BUG 的潜在解决方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
在 Console 中,输入 `parseInt(n) + parseInt(u)`。 此语句有效,因为我们会在特定代码行暂停,其中 `n`(num1的值) 和 `u`(num2的值) 在范围内。

按 Enter 键。 DevTools 对语句求值并打印输出 15,即我们预计demo页面会产生的结果。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200312224302594.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Nhb21hZ2U=,size_26,color_FFFFFF,t_70)

五、尝试修改

上一步我们已找到解决 BUG 的方法。 接下来就是尝试通过编辑代码并重新运行demo来使用修正方法。 我们可以在 代码编辑 窗口直接修改代码:

代码编辑 窗口中,将代码格式化关掉,然后修改代码,将 n+u 换成 parseInt(n)+parseInt(u)

Command+S (Mac) 或 Control+S(Windows、Linux)以保存更改。

点击 Deactivate breakpoints 取消激活断点。 其将变为蓝色,表示处于活动状态。 在完成此设置后,DevTools 会忽略您已设置的任何断点。

点击num1+num2按钮,则会看见正确的结果啦!

Tips: 这样做只能修正在浏览器中运行的代码, 不能为访问您页面的所有用户修正代码。 为此,我需要修改自己服务器上的代码。

六、介绍其他几种断点

断点类型

使用场景

代码行

在确切的代码区域中

条件代码行

在确切的代码区域中,且仅当其他一些条件成立时

DOM

在更改或移除特定 DOM 节点或其子级的代码中

XHR

当 XHR 网址包含字符串模式时

事件侦听器

在触发 click 等事件后运行的代码中

异常

在引发已捕获或未捕获异常的代码行中

函数

任何时候调用特定函数时

1. 代码行断点

  1. 直接点击 这是使用最多的一种断点方式,在知道需要检查的确切代码区域时,可以使用代码行断点。 DevTools 始终会在执行此代码行之前暂停。
  1. debugger 在代码中调用 debugger 可在该行暂停。 此操作相当于使用代码行断点,只是此断点是在代码中设置,而不是在 DevTools 界面中设置。 console.log('a'); console.log('b'); debugger; console.log('c');
  2. 条件代码断点 如果知道需要调查的确切代码区域,但只想在其他一些条件成立时进行暂停,则可使用条件代码行断点。若要设置条件代码行断点:
    • 点击 Sources 标签。
    • 打开包含您想要中断的代码行的文件。
    • 转至代码行。
    • 代码行的左侧是行号列。
    • 右键点击行号列。
    • 选择 Add conditional breakpoint。
    • 代码行下方将显示一个对话框。
    • 在对话框中输入条件。
    • 按Enter 键激活断点。 行号列顶部将显示一个橙色图标。

2. DOM更新断点

如果想要暂停更改 DOM 节点或其子级的代码,可以使用 DOM 更改断点。若要设置 DOM 更改断点:

  • 点击 Elements 标签。
  • 转至要设置断点的元素。
  • 右键点击此元素。
  • 将鼠标指针悬停在Break on 上,然后选择 Subtree modifications、Attribute modifications 或 Node removal。
  • Subtree modifications: 在移除或添加当前所选节点的子级,或更改子级内容时触发这类断点。在子级节点属性发生变化或对当前所选节点进行任何更改时不会触发这类断点。
  • Attributes modifications:在当前所选节点上添加或移除属性,或属性值发生变化时触发这类断点。
  • Node Removal:在移除当前选定的节点时会触发。

4. XHR/Fetch断点

如果想在 XHR 的请求网址包含指定字符串时中断,可以使用 XHR 断点。 DevTools 会在 XHR 调用 send() 的代码行暂停。

注:此功能还可用于 Fetch 请求。

例如,在您发现您的页面请求的是错误网址,并且您想要快速找到导致错误请求的 AJAXFetch 源代码时,这类断点很有用。

若要设置 XHR 断点:

  • 点击 Sources 标签。
  • 展开 XHR Breakpoints 窗格。
  • 点击 Add breakpoint。
  • 输入要对其设置断点的字符串。 DevTools 会在 XHR 的请求网址的任意位置显示此字符串时暂停。
  • 按 Enter 键以确认。

这样就可以拦截包含getUserInfo字符串的请求,如果添加一个空的,则可以拦截所有请求!

5. 事件侦听器断点

如果想要暂停触发事件后运行的事件侦听器代码,可以使用事件侦听器断点。 您可以选择 click 等特定事件或所有鼠标事件等事件类别。

我们一开始使用的例子就是事件侦听器断点,这里就不演示了。

6. 异常断点

如果想要在引发已捕获未捕获异常的代码行暂停,可以使用异常断点。

  • 点击 Sources 标签。
  • 点击 Pause on exceptions 引发异常时暂停 {:.devtools-inline}。 启用后,此按钮变为蓝色。
  • (可选)如果除未捕获异常以外,还想在引发已捕获异常时暂停,则勾选 Pause On Caught Exceptions 复选框。

7. 函数断点

如果想要在调用特定函数时暂停,可以调用 debug(functionName),其中 functionName 是要调试的函数。 您可以将 debug() 插入您的代码(如 console.log() 语句),也可以从 DevTools 控制台中进行调用。 debug() 相当于在第一行函数中设置代码行断点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function sum(a, b) {
  let result = a + b; // DevTools 会在此行暂停
  return result;
}
debug(sum); // 传递函数对象,而不是字符串。
sum();

如果想要调试的函数不在范围内,DevTools 会引发 ReferenceError

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(function () {
  function hey() {
    console.log('hey');
  }
  function yo() {
    console.log('yo');
  }
  debug(yo); // 这行可以成功调用
  yo();
})();
debug(hey); // 这一行不能成功调用 hey() 不在作用域内

如果是从 DevTools 控制台中调用 debug(),则很难确保目标函数在范围内。所以一般还不如直接使用代码行断点!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot3-整合WebSocket
WebSocket 是一种网络通信协议,提供全双工通信通道,使服务器可以主动向客户端推送数据。与传统的 HTTP 请求-响应模式不同,WebSocket 在建立连接后,允许服务器和客户端之间进行双向实时通信。
CoderJia
2024/12/16
3950
SpringBoot3-整合WebSocket
SpringBoot整合WebSocket实战演练
本文将介绍如何在Spring Boot应用程序中使用WebSocket实现服务端向客户端推送消息。Spring Boot和WebSocket的整合实现服务端向客户端推送消息,使得客户端能够实时接收并处理服务器发来的信息。WebSocket协议是一种双向通信的网络协议,使得客户端和服务器能够建立持久连接,实现实时交互。通过WebSocket,客户端可以实时接收服务器推送的消息,并立即做出响应,而不需要等待服务器处理请求。这种实时的交互方式在Web应用中非常有用,特别是在需要实时更新用户界面、处理用户输入的场景中。
小明爱吃火锅
2023/10/19
1.7K1
SpringBoot整合WebSocket实战演练
spring websocket推送
spring websocket使用,在spring官网上已有相应的demo,这里主要描述推送到对应的浏览器客户端 基本的拦截配置处理 @Component public class MessageHandshakeInterceptor implements HandshakeInterceptor { public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketH
用户1418372
2018/09/13
1.5K0
springboot整合篇-springboot整合websocket
ServerEndpoint的实现主要针对业务领域对websocket消息进行处理,主要使用@OnOpen对websocket连接建立时需要实现的逻辑,@OnClose对websocket连接关闭时需要实现的逻辑,@OnMessage对websocket收到消息时的处理以及@OnError对websocket发生错误时的处理方式。
Java开发者之家
2021/06/17
2K0
实现websocket的两种方式
1.两种方式,一种使用tomcat的websocket实现,一种使用spring的websocket
凯哥Java
2019/06/28
2K0
spring-websocket实现聊天室功能
最近看到有些人的博客中有聊天室的功能所以我也在我博客中写了一个,不过他们用的是java原生的,这里我使用了spring封装的spring-websocket
用户10136162
2022/11/15
8200
spring-websocket实现聊天室功能
【面试题精讲】什么是websocket?如何与前端通信?
WebSocket是一种在Web应用程序中实现双向通信的协议。它允许在客户端和服务器之间建立持久的、全双工的连接,以便实时地发送数据。
程序员朱永胜
2023/09/06
8970
Spring消息之WebSocket
一、WebSocket简介     WebSocket 的定义?WebSocket是HTML5下一种全双工通信协议。在建立连接后,WebSocket服务器端和客户端都能主动的向对方发送和接收数据,就像Socket一样。     WebSocket 的由来?众所周知,HTTP协议有“无连接”、“不可靠”、“尽最大努力”的特点。WebSocket的出现可以看成是HTTP协议为了支持长连接所打的一个大补丁。首先,由 IETF 制定发布了WebSocket 协议。后来,HTML5为了在Web端支持WebSocket
JMCui
2018/06/14
1.1K0
【websocket】spring boot 集成 websocket 的四种方式
这个配置类很简单,通过这个配置 spring boot 才能去扫描后面的关于 websocket 的注解
猿天地
2019/10/31
44.4K2
SpringBoot入门建站全系列(二十七)WebSocket做简单的聊天室
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
品茗IT
2020/05/28
1.1K0
传统@ServerEndpoint方式开发WebSocket应用和SpringBoot构建WebSocket应用程序
通过websocket的两种使用方式,让你更加深入理解用法。很多人不懂websocket怎么辨别是谁发送过来的,文中说到实现WebSocketConfigurer接口,定义拦截器可以绑定用户信息,还有其他很多,细细品,对比看比较好!
java思维导图
2020/05/20
9.5K0
《Spring实战》摘录 - 27
Q: #17.3.3-1 | RabbitMQ连接工厂的作用是创建到RabbitMQ的连接
用户1335799
2019/08/15
4350
Spring整合WebSocket
WebSocket,干什么用的?我们有了HTTP,为什么还要用WebSocket?很多同学都会有这样的疑问。我们先来看一个场景,大家的手机里都有微信,在微信中,只要有新的消息,这个联系人的前面就会有一个红点,这个需求要怎么实现呢?大家思考3秒钟。哈哈,最简单,最笨的方法就行客户端轮询,在微信的客户端每隔一段时间(比如:1s或者2s),向服务端发送一个请求,查询是否有新的消息,如果有消息就显示红点。这种方法是不是太笨了呢?每次都要客户端去发起请求,难道就不能从服务端发起请求吗?这样客户端不就省事了吗。再看看股票软件,每个股票的当前价格都是实时的,这我们怎么做,每个一秒请求后台查询当前股票的价格吗?这样效率也太低了吧,而且时效性也很低。这就需要我们今天的主角WebSocket去实现了。
小忽悠
2020/08/31
7900
Spring整合WebSocket
十一. websocker服务与ws请求头拦截器
这两个月有点累,我就不做代码解释了。直接上代码!另外这篇文章代码有一些待优化的地方,如下 服务逻辑类的switch块待改成反射 房主退出连接应该将房间权限赋给其他人 ws配置 WebSocketConfigurer.java package cc.tanblog.online.config; import cc.tanblog.online.socket.MyWebSocketHandler; import org.springframework.context.annotation.Bean
用户8988577
2022/12/27
1.1K0
[网页五子棋][匹配模块]服务器开发、用户管理器(创建匹配请求/响应对象、处理连接成功、处理下线)
创建 api.MatchAPI,继承自 TextWebSocketHandler 作为处理 WebSocket 请求的入口类
椰椰椰耶
2025/05/29
650
【Spring源码】WebSocket做推送动作的底层实例
官方文档表面心跳采用了SckJS协议,所以我们应该从图2里的sockjs模块开始探索。
JavaSouth南哥
2024/03/29
2300
【Spring源码】WebSocket做推送动作的底层实例
Spring和WebSocket整合详解(建立Web聊天室)
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
品茗IT
2019/09/12
5.1K0
springboot+websocket实现服务端、客户端
小编最近一直在使用springboot框架开发项目,毕竟现在很多公司都在采用此框架,之后小编也会陆续写关于springboot开发常用功能的文章。
全栈程序员站长
2022/09/15
3.7K0
springboot+websocket实现服务端、客户端
实战 | spring boot 集成 websocket 的四种方式
这个配置类很简单,通过这个配置 spring boot 才能去扫描后面的关于 websocket 的注解
Bug开发工程师
2020/03/12
2K0
结合WebSocket和Openlayers4实现地图内容的刷新
本文讲述如何结合WebSocket和Openlayers4实现地图内容的实时刷新。
牛老师讲GIS
2018/10/23
9510
结合WebSocket和Openlayers4实现地图内容的刷新
推荐阅读
相关推荐
SpringBoot3-整合WebSocket
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验