调试 Web:了解如何使用 Chrome Dev Tools 调试 JavaScript






4.14/5 (4投票s)
在本文中,我们将学习:Chrome 开发者工具是什么,它提供的一些工具,如何设置断点并浏览 JavaScript,以及如何在调试器中使用控制台来帮助导航和理解代码为何按预期运行。
作为一名新的 Web 开发人员,你需要学习很多工具。虽然我们无法涵盖所有工具,但我们可以了解一下任何 Web 开发人员工具箱中可能最重要的工具:Chrome 开发者工具。
如果你不熟悉它,Chrome 开发者工具是内置在 Chrome 浏览器中的一套 Web 开发工具。每个主流浏览器都有类似的开发工具,但我将专门讨论 Chrome 开发者工具。你仍然可以在其他浏览器上跟随学习,但这不会完全匹配。
你在浏览网页时可能已经不小心打开了开发者工具,但为了完整起见,你可以通过按 F12 键或右键单击网页并选择“检查”菜单按钮来启动开发者工具。
当你打开 Chrome 开发者工具时,首先看到的是网页使用的 HTML 和 CSS。大多数人只会看到这里,但你知道 Chrome 开发者工具还能显示更多吗?
使用 Chrome 开发者工具,你可以
- 在“元素”选项卡中检查 HTML 和 CSS
- 在“控制台”选项卡中运行和执行 JavaScript
- 在“源代码”选项卡中检查 Web 应用使用的文件
- 在“网络”选项卡中查看你的网站发出的网络请求
- 还有更多!
要调试你的代码库,没有什么比逐步执行代码来查看发生了什么更有效的方法了。我将向你展示如何使用 Chrome 开发者工具对 JavaScript 进行此操作,就像你在任何其他编程语言中使用 IDE 一样。
为了开始学习如何使用 Chrome 开发者工具进行调试,我们将创建一个简单的待办事项列表应用。
步骤 1:创建一个简单的待办事项列表应用
在调试之前,我们需要调试的目标,所以我们将创建一个简单的待办事项列表应用。在创建任务时,我们将获取三条信息:
- 任务的标题(必填)
- 任务的截止日期(选填)
- 任务的描述(选填)
除了将新任务添加到我们的列表中,我们不会实现任何额外的功能。
这是我们的 HTML 页面的样子。我将其命名为 _index.html_。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>To do List</title>
</head>
<body>
<div>
<div>
Title: <br>
<input type="text" id="title" />
</div>
<div>
Date: <br>
<input type="date" id="date" />
</div>
<div>
Description: <br>
<textarea id="description"></textarea>
</div>
<button id="addButton" onclick="addTodoElement()">Submit</button>
</div>
<span><h1>TODO List:</h1></span>
<div id="content"></div>
<script type="text/javascript" src="index.js"></script>
</body>
</html>
这是 HTML 在浏览器中的样子。
这个页面没有什么复杂的地方。我们拥有的五个关键 HTML 元素是:
- 一个文本框,供用户输入任务标题。
- 日期输入框,供用户输入任务的截止日期。
- 一个文本区域,供用户输入任务的描述。
- 一个提交按钮,用于添加用户任务。我们添加了一个
onclick
事件处理程序,它将调用我们的 JavaScript 函数addTodoElement()
,你可以在下面看到它。 - 一个内容容器
div
,用于存储我们添加到应用中的所有任务。
我还创建了另一个名为 _index.js_ 的文件,其中包含当用户单击提交按钮时执行的 JavaScript。它看起来是这样的:
function addTodoElement(){
// Get the user's inputted values
var todoContainer = document.getElementById("content");
var title = document.getElementById("title").value;
var date = document.getElementById("date");
var desc = document.getElementById("description").value;
// If the user didn't give a title, stop the click event
// as it's pointless to have a task without a title
if(title == "") {
alert("Title is required!");
return;
}
// Create a new div to contain our task information
// with basic styles
var todoItem = document.createElement("div");
todoItem.style.border = "solid 1px black";
todoItem.style.marginBottom = "5px";
// Create the HTML for the title
var titleParagraph = document.createElement("p");
titleParagraph.textContent = title;
todoItem.append(titleParagraph);
// Create the HTML for the date
var dateParagraph = document.createElement("p");
dateParagraph.textContent = date;
todoItem.append(dateParagraph);
// Create the HTML for the description
var descParagraph = document.createElement("p");
descParagraph.textContent = desc;
todoItem.append(descParagraph);
// Add our new task to our container
todoContainer.append(todoItem);
}
如你所见,_index.js_ 包含一个函数。此函数读取用户的输入,创建一个任务,并将其添加到我们的网页中。
让我们尝试使用我们的应用来创建一个任务。你会得到这样的结果:
糟糕,我们的日期看起来不正确。我们有个 bug!
步骤 2:使用 Chrome 开发者工具在“源代码”选项卡中调试 JavaScript
要找出导致 bug 的原因,我们需要检查导致 bug 的代码,并找出问题出现的位置。在本例中,我们只有一个函数,所以它出现的代码位置很明显。
要在代码运行时搜索代码,我们需要在代码中设置断点。设置断点后,每当网站使用该行代码时,Chrome 开发者工具都会暂停代码执行,让我们开始调试。要开始添加断点……
- 按 F12 打开 Chrome 开发者工具。
- 切换到“控制台”旁边的“源代码”选项卡。
“源代码”选项卡显示了我们的应用正在使用的文件。在此实例中,文件是 _index.html_ 和 _index.js_。
我们要调试的代码在 _index.js_ 中。单击它,你会看到它确实是我们上面创建的同一个文件。
步骤 3:创建断点并导航我们的 JavaScript 代码
打开代码后,现在我们需要设置断点。这就像在任何其他 IDE 中进行设置一样。
- 单击左侧的行号即可创建断点。对于我们的演示,请单击第 3 行。
现在,我们只需要让代码运行起来。
- 清除本次示例的输入。
- 单击我们网页上的“提交”按钮,它将命中我们的断点,导致我们在第 3 行暂停。
要控制代码的流程,有四个按钮需要了解。如果你熟悉代码调试,应该不会感到意外。
从左到右,我们有:
- 恢复 (F8) – 恢复将继续执行你的代码,跳过所有内容,直到下一个断点或直到代码执行完毕。
- 逐过程 (F10) – 逐过程将执行你所在的行,并将你移至下一行。如果当前行正在执行一个函数,你将跳过它并移至下一行。
- 逐语句 (F11) – 逐语句类似于逐过程,但逐语句将让你进入函数,并允许你同时调试新执行的函数。
- 跳出 (Shift + F11) – 跳出与逐语句一起使用。它允许你跳出当前正在执行的函数,并返回到执行该函数的代码。
开始逐步执行我们的代码。
- 单击“逐过程”四次,直到你到达第 10 行。
此时,我们会注意到我们的 title 变量是空的,这意味着我们将进入 if 语句,并停止代码执行,而不会遇到我们正在寻找的 bug。
步骤 4:使用控制台帮助调试我们的代码
让我们假设我们花费了大量时间调试代码,并且不想在这里停下来。幸运的是,我们可以做一些技巧来绕过它。
让我们打开控制台。
- 在脚本中的任意位置右键单击以打开菜单。
- 单击“在控制台中评估”。
这将在我们的源代码选项卡中打开控制台。
如果你不熟悉开发者工具控制台,控制台允许我们在浏览器中直接编写和执行 JavaScript。
在这种情况下,它的用处在于,当你在调试时,你可以访问我们已经实例化的变量。你也可以修改变量,但现在我们只查看当前存储的内容。
在控制台中输入我们的值,我们可以看到我们的 bug。为什么 date 返回的是一个 input 而不是一个值?
有了这个提示,我们现在知道应该查看值被赋给的位置。如果我们查看那里,我们可以看到我们犯了一个错误,使用了 input 元素作为我们的日期,而不是从 input 中获取值。
如果我们查看源代码选项卡右侧的“作用域”窗口,我们可以看到我们打印的相同信息。
控制台还可以与打印变量一起运行函数。我们可以通过在控制台中输入正确的 JavaScript 代码来确认我们的错误。
Bingo!我们的值是空的,因为我们没有在那里设置任何东西,但至少它不是那个难看的 [object HTMLInputElement]
!
在我们停止调试之前,请记住我们之前讨论过的内容,关于我们如何通过 if 语句?我们可以通过从控制台修改 title 变量来做到这一点。
- 在控制台中,输入
title = "fake title"
。
如果我们回到我们的代码并突出显示 title
,我们会看到我们的 title
变量具有我们设置的新值!
- 如果你单击“逐过程”,而不是进入
if
语句,我们将跳到第 17 行。
这是一个有用的技巧,可以在不停止调试器并手动尝试新值的情况下,在调试器中尝试不同的输入。
如果你逐步执行其余代码,你会看到:
- 我们的“fake title”值被用于任务项。
- 我们会看到我们将日期 input HTML 分配为
textContent
,而不是它的值。
最终,我们会得到类似这样的结果:
步骤 5:将修复应用到我们的脚本
现在我们已经找到了,让我们将修复应用到第 4 行。之前,我们将 date 设置为 input 元素 DOM,但我们却错误地将变量设置为 DOM 元素,而不是它的值。让我们修复它:
如果我们现在运行我们的应用,应该会得到这个结果:
至此,我们的 Web 应用按预期工作了!做得好!
结论
通过这个小例子,我希望我已经向你展示了 Chrome 开发者工具的强大功能以及它如何简化调试。
总结一下,在本文中,你应该已经学习了:
- Chrome 开发者工具是什么,以及它提供的一些工具。
- 如何设置断点并浏览 JavaScript。
- 如何使用控制台和调试器来帮助导航并理解代码为何按预期运行。
有了这些知识,你应该准备好开始调试自己的应用程序,并帮助使 Web 成为一个更好、无 bug 的地方!