使用Chrome Dev Tools, deb.js调试Javascript小技巧

本文讲介绍一些基于 Chrome Dev Tools 的实用的客户端Javascript 调试小技巧。我将重点关注那些无从下手,不知道该在哪儿添加断点的情景。

首先看下本文主题:

  • 找出哪段代码正在修改了页面
  • 找出谁发送了某个ajax请求
  • 在抛出异常时触发断点
  • 条件断点
  • 事件断点
  • 编程断点
  • 常用调试代码片
  • 给某个函数设置断点
  • 搜索对象的属性
  • 访问对象某个属性时
  • 用deb.js找出谁调用了某个函数

Chrome Dev Tools 调试器

首先让我们打开 Chrome Dev Tools 设置一个断点。使用Ctrl+Shift+I 或 Cmd+Option+I ,然后选择一个源代码文件,点击其中行号就可打上断点:

一个 Chrome Dev Tools 断点

问题是,很多情况下我们完全不知道该把断点打在哪里。比如说调试别人写的代码的时候。
接下来让我们看看Chrome Dev Tools 将如何帮助我们解决上述难题。

找出哪段代码修改了页面

一种常见的情景为:页面的某个部分被修改了,但到底是被哪段代码修改的不是很清楚。通过选中某个HTML元素,右键就可以添加一个断点,它会在该元素被修改时触发:

这里写图片描述

有三种选项可以检测页面的更改:

  • 子树更新:只要元素的任一子元素被更改,即触发断点。这是最经常使用的选项。
  • 属性更新: 当元素的属性被更改时触发断点。
  • 节点移除:当元素从文档移除时触发断点。

找出谁发送了某个ajax请求

有时候我们只知道发送了一个ajax请求,但不清楚是哪段代码干的。在 sources 选项卡下有一个 “XHR breakpoint”面板,可以选中“Any XHR”添加ajax断点:

这里写图片描述

另外,面板头部的点击加号,可以添加条件ajax断点,只有当请求的url包含匹配串时才会触发。

在抛出异常时触发断点

Chrome Dev Tools 允许我们在异常抛出时,使用调试器暂停程序。这项功能可是用 sources 选项卡下的暂停按钮激活。暂停按钮下的复选框用来限制只有当异常未被捕获时,才使用该断点暂停程序:

这里写图片描述

这种方法可以及早发现错误,防止错误无声无息的被忽略在console中。

条件断点

有时候我们不想断点每次都被触发。比如,我们只想当函数的参数等于某个特定值时才触发断点。

你可以右键点击行号,选择 Edit breakpoint 选项来添加判断条件:

这里写图片描述

在判断条件中你可以使用任何可访问的局部变量。

事件断点

除了ajax,所有类型的事件都可以用来触发断点:clicks, double clicks, blur/focus , setTimeout等等。这些断点可以在 source 选项卡下的 Listener Breakpoints 面板里设置:

这里写图片描述

编程断点

可以简单的添加下面代码来触发断点:

debugger;

当执行到这行时,调试器会被触发,就像是在这行设置了断点一样。

这个功能很有用,可以当做是手动设置断点的一种方式。

常用调试代码片

Chrome Dev Tools 允许开发者保存一个小代码片供未来之用。这个功能在 source 选项卡下的 Snippets 子选项卡里:

这里写图片描述

这个功能可以用来保存你或其它人开发的,经常使用的调试代码片。一些我最经常使用的代码片来自于 Paul Irish(Google Dev Tools evangelist)

将这些代码片复制到你的开发者工具中,你可以随时随地的通过console访问它们。后面的章节我们将简单看一下这些代码片。

给某个函数设置断点

stopBefore.js 代码片允许我们给某个函数设置断点,它会在函数被调用时触发。例如,下面的代码将会在 document.getElementById 函数调用之前触发断点:

stopBefore(document, 'getElementById')

搜索对象的属性

grep.js 代码片允许我们在对象及其原型链中搜索拥有匹配条件的属性。例如,下面的语句将会搜索document对象中所有带有get的属性:

grep(document, 'get');

访问对象某个属性时触发断点

debugAccess.js 代码片允许我们访问对象某个属性时触发断点。例如,下面的代码将会在每次访问document.cookie 时触发断点。

debugAccess(document, 'cookie');

用deb.js找出谁调用了某个函数

作为结束,让我们来看看deb.js,一个微型JavaScript 调试库。

首先,将下面script标签放到网页头部,要在任何其它script文件之前:

<script src="deb.min.js"></script>

然后调用 .deb()来标记一个需要调试的函数:

var calculateSomething = function(cb) {// ...}.deb();

当函数被调用时,console就会输出下面信息:

Deb.js output

我们可以看到,deb.js 打印出了很多信息:

  • 函数参数的值
  • 栈调用记录
  • 返回值
  • 执行时间

原文:Javascript debugging tips using the Chrome Dev Tools, deb.js and more

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jenkins Auth fail验证失败

重新设置密码转载于:https://www.cnblogs.com/cocoat/p/5982931.html

CSS3 Perspective

一 、在元素的父元素上使用 在父元素上使用Perspective属性可以使用透视投影视图&#xff0c;在父元素上加上&#xff1a; perspective:400px 表示相机距离屏幕位置为400px。默认相机对准父元素的中心&#xff0c;要重设相机的焦点可以使用&#xff1a; perspective-origin…

状态模式案例分析

需求 初始状态下&#xff0c;【暂停按钮】不可点&#xff0c;所有数轴可调: 点击【动态波】后&#xff0c;【暂停按钮】可点&#xff0c;所有数轴可调&#xff1a; 点击【暂停按钮】后&#xff0c;“暂停”变为“播放”&#xff0c;所有数轴不可调&#xff1a; 分析需求 上面…

Linux系统IP地址

1、IP地址概述 2、配置IP地址 查看IP地址 在网卡上绑定一个IP地址 同一张网卡上绑定多个IP 绑定一块网卡设备 修改或删除IP地址 IP地址概述 这里不多赘述&#xff0c;参考《计算机网络》课程。 配置IP地址 [rootweekend110 ~]# ifconfigeth0    Link encap:Ethernet HWadd…

qwidget多个窗口同步_Linux命令screen—终端切换,工作环境保存,画面同步,防断网...

Screen基础Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话&#xff0c;并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。创建一个新的窗…

Linux文件基本操作

使用declare命令创建一个变量名为 tmp 的变量&#xff1a; 使用号赋值运算符为变量 tmp 赋值为 dunzhu&#xff1a; 读取变量的值&#xff0c;使用echo命令和$符号&#xff08;$符号用于表示引用一个变量的值&#xff0c;初学者经常会忘记输入&#xff09; 在dunzhu家目录创建一…

DES 加密 解密

EncryptUtil feiyangklDES 一行代码完成DES加密&#xff0c;加密模式 DES CBC DEMO GIF DEMO 简介 最近项目中用到DES加密&#xff0c;在这里整理成篇&#xff0c;供大家参考阅读&#xff0c;在使用该demo过程中&#xff0c;你可能会遇到一些问题&#xff0c;首先你需要看一下…

markdown绘图插件----mermaid简介

作者&#xff1a;黄永刚 mermaid简介 当撰写文档的时候&#xff0c;对于流程图的生成大多使用Visio等繁重的工具&#xff0c;没有一种轻便的工具能够画图从而简化文档的编写&#xff0c;就像markdown那样。 mermaid解决这个痛点&#xff0c;这是一个类似markdown语法的脚本语言…

Java NIO 教程

NIO 概述 NIO有三个核心组件&#xff1a; 通道&#xff08;Channels&#xff09;缓冲器&#xff08;Buffers&#xff09;选择器&#xff08;Selectors&#xff09; 实际上&#xff0c;NIO的组件和类远不止这三个&#xff0c;但这个三个组件是核心。至于其它组件&#xff0c;…

threejs相机和渲染器

渲染器 渲染器其实代表的是canvas标签。 渲染器的类型 WebGLRender 使用WebGL来渲染图形&#xff0c;速度较快&#xff0c;但是有些机器不支持WebGL。 CanvasRender 使用canvas2d来渲染图形&#xff0c;在较老的版本上&#xff0c;主要是用来渲染2D图形。现在这个渲染器在…

threejs概览

threejs术语和概念 threejs的API很长&#xff0c;有很多概念和术语&#xff0c;理解了这些概念和术语&#xff0c;才能更好的使用threejs。这些概念和术语都藏在API右侧的大纲中&#xff0c;下图简单整理了一下这些概念&#xff1a; 这些概念又分为四个大类&#xff08;见上图…

leetcode数组汇总_[LeetCode] 300. 最长上升子序列

题目链接&#xff1a; https://leetcode-cn.com/problems/longest-increasing-subsequence难度&#xff1a;中等通过率&#xff1a;43.0%题目描述:给定一个无序的整数数组&#xff0c;找到其中最长上升子序列的长度。示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释:…

threejs创建平面几何形状

创建平面几何形状 平面几何形状有三种&#xff1a;点&#xff0c;线&#xff0c;面三种&#xff0c;下面说说用threejs创建这几种形状的方法。 创建点 创建点可以使用Points类。 function createPoints(){//创建一个Geometry&#xff0c;并添加点let geometry new THREE.G…

threejs精灵(Sprite)

Sprite精灵 Sprite叫精灵&#xff0c;计算机图形学中&#xff0c;精灵指包含于场景中的二维图像或动画&#xff08;wiki&#xff09;。在threejs中&#xff0c;这样说明Sprtite&#xff08;doc&#xff09; : A sprite is a plane that always faces towards the camera , ge…

threejs加载3D模型例子

加载3D模型 首先要引入ColladaLoader加载器&#xff0c;Collada是一个3D模型交换方案&#xff0c;即不同的3D模型可以通过Collada进行相互转换&#xff0c;言外之意&#xff0c;threejs可以使用Collada将3D模型的数据转换成自己支持的格式&#xff0c;从而在浏览器上渲染出来。…

threejs纹理

纹理 纹理用来表现物体的细节。理论上可以将物体的每个细节建模出来&#xff0c;但是这样时间成本和性能成本都太高&#xff0c;因此&#xff0c;将物体的一些细节用纹理来表示。 图片纹理 图片纹理直接在物体表面应用图片。可以使用TextureLoader类的load方法来加载纹理。 …

threejs对象拾取

对象拾取 对象拾取也就是要获得鼠标事件发生位置的图形对象。在threejs中&#xff0c;是通过Raycaster 对象来拾取对象的&#xff0c;ray是射线&#xff0c;caster是投射器&#xff0c;从字面上即可理解其工作原理是&#xff1a;从某个方向发射一条射线&#xff0c;穿过鼠标所…

threejs指定对象旋转中心

指定对象旋转中心 默认情况下&#xff0c;对象的旋转中心都是自身的中心。对于组对象而言&#xff0c;也是如此。因此&#xff0c;可以利用这个特点&#xff0c;实现对象绕任何点旋转&#xff0c;也就是指定旋转中心。比如我们想要下图的对象绕A点旋转 我们可以添加我们的对…

threejs设置对象层次

设置层次 threejs提供了层次的支持。和相机处于同一层次的对象可见&#xff0c;否则不可见。在threejs中&#xff0c;最多可以设置32层&#xff0c;默认的层次是1。层次在有些系统中很有用&#xff0c;可以将不同的模式的对象设成不同的层次&#xff0c;这样&#xff0c;切换模…

Text段、Data段和BSS段

不同的compiler在编译的过程中对于存储的分配可能略有不同&#xff0c;但基本结构大致相同。 大体上可分为三段&#xff1a;Text段、Data段和BSS段。 text段用于存放代码&#xff0c;通常情况下在内存中被映射为只读&#xff0c;但data和bss是可写的。 数据存放通常分成如下几个…