From ( Chrome Devtools 高级调试指南 ):https://juejin.cn/post/6844903961472974855
chrome devtools 设置黑色主题:https://blog.csdn.net/sinat_15347975/article/details/81151342
Chrome DevTools 实用技巧大全(收藏):https://blog.csdn.net/qianyu6200430/article/details/113903914
浏览器 开发者工具 在爬虫中常用来进行简单的抓包分析、JS逆向调试。
bug
跟踪、断点调试等API
数据是否正确、审查页面元素样式及布局、页面加载性能分析、自动化测试AdBlock、Gliffy、Axure
等打开方式:
常见禁用开发者工具手段:https://blog.csdn.net/cplvfx/article/details/108518077
官方文档:https://developer.chrome.com/docs/devtools/
可以直接点击页面的元素,会自动跳转到对应的源代码。用于在页面选择一个元素来审查和查看它的相关信息,当在Elements这个按钮页面下点击某个Dom元素时,箭头按钮会变成选择状态。
模拟各种终端设备,支持自定义终端。同时可以选择不同的尺寸比例,chrome 浏览器的模拟移动设备和真实的设备相差不大,是非常好的选择。适合查看手机页面的数据,点击【More tools】—> 【Sensors】可以模拟终端的地理位置、终端朝向等;工具栏可以选择要模拟的终端型号,其中 Responsive 是自适应。
设置、自定义:开发者工具设置,包括一些外观、快捷置、终端设备、地理位置设置等。 自定义和控制开发者工具,包括调整工具的位置、全局搜索、运行命令、其他工具等。
Elements
- 页面dom元素用来 查看、修改 页面上的元素,包括DOM标签,以及css样式的查看,修改,还有相关盒模型的图形信息,下图我们可以看到当我鼠标选择id 为lg_tar的div元素时,右侧的css样式对应的会展示出此id 的样式信息,此时可以在右侧进行一个修改,修改即可在页面上生效, 灰色的element.style样式同样可以进行添加和书写,唯一的区别是,在这里添加的样式是添加到了该元素内部,实现方式即:该div元素的style属性,这个页面的功能很强大,在我们做了相关的页面后,修改样式是一块很重要的工作,细微的差距都需要调整,但是不可能说做到每修改一点即编译一遍代码,再刷新浏览器查看效果,这样很低效,一次性在浏览器中修改之后,再到代码中进行修改
Console
- 控制台用于打印和输出相关的命令信息,其实console控制台除了我们熟知的报错,打印console.log信息外,还有很多相关的功能,下面简单介绍几个:
a: 一些对页面数据的指令操作
比如,打断点正好执行到获取的数据上,由于数据都是层层嵌套的对象,这个时候查看里面的 key/value 不是很方便,即可用这个指令开查看,obj 的 json string 格式的 key/value,我们对于数据里面有哪些字段和属性即可一目了然
b: 除了 console.log 还有其他相关的指令可用。console 也有相关的 API,其他更多功能可以查看 API
Sources
- 页面静态资源 ( 可以查看 js 资源页面 )Sources 页面内可以找到 浏览器当前页面 中的 js 源文件,方便我们查看和调试。所有的代码都是压缩之后的代码,可以点击下面的 {} 大括号 按钮 将代码转成可读格式
Sources Panel 的左侧分别是 Sources (资源) 和 Content scripts (脚本内容) 和 Snippets (片段)
关于打断点调试的内容,下面介绍,先来说一些,其他平时基本没人用但是很有用的小点,比如当我们想不起某个方法的具体使用时候,会打开控制台随意写一些测试代码,或者想测试一下刚刚写的方法是否会出现期待的样子,但是控制台一打回车本想换行但是却执行刚写的半截代码,所以推荐使用 Sources 下面的左侧的 Snippets ( 片段 ) 代码片段按钮,这时候点击创建一个新的片段文件,写完测试代码后把鼠标放在新建文件上run,再结合控制台查看相关信息(新建了一个名叫:app.js 的片段代码,在你的项目环境页面内,该片段可执行项目内的方法)
Content scripts 是 Chrome 的一种扩展程序,它是按照扩展的 ID 来组织的,这些文件也是嵌入在页面中的资源,这类文件可以读写和操作我们的资源,需要调试这些扩展文件,则可以在这个目录下打开相关文件调试,但是几乎我们的项目还没有相关的扩展文件,所以啥也看不到,平时也不需要关心这块
Network
- 网络可以看到所有的资源请求,包括网络请求,图片资源,html,css,js文件等请求,可以根据需求筛选请求项,一般多用于网络请求的查看和分析,分析后端接口是否正确传输,获取的数据是否准确,请求头,请求参数的查看
以上我选择了All,就会把该页面所有资源文件请求下来,如果只选择 XHR 异步请求资源,则我们可以分析相关的请求信息
Preserve log:是否在页面重加载后,清除请求列表。
Disable cache:是否启用缓存。
打开一个 Ajax 异步请求,可以看到它的请求头信息,是一个 POST 请求,参数有哪些,还可以预览它的返回的结果数据,这些数据的使用和查看有利于我们很好的和后端工程师们联调数据,也方便我们前端更直观的分析数据
Performance
- 设备加载性能分析Application
- 应用信息,PWA/Storage/Cache/Frames
Security
- 安全分析可以告诉你这个网站的安全性,查看有效的证书等
Audits
- 审计,自动化测试工具可以帮你分析页面性能,有助于优化前端页面,分析后得到的报告
适用于分析关键函数代码逻辑
各个选项功能:
Breakpoints:可以看到已经埋下的断点。
Scope:可以看到当前局部或者全局变量的值,可对值进行修改。
Call Stack:可以看到当前代码调用的堆栈信息,代码执行顺序为由下至上。
匹配 url 中关键词,匹配到则跳转到参数生成处,适用 于url 中的加密参数全局搜索搜不到,可采用这种方式拦截。
Event Listener Breakpoints,事件侦听器断点,当鼠标点击、移动、键盘按键等行为或者其他事件发生时可以触发断点,比如 Mouse —> click,可快速定位点击按钮后,所执行的 JS。
在 sources —> snippets 下可以新建 JS 脚本。
在 console 中输入如下代码,如只打印 _$
开头的变量值:
for (var p in window) {
if (p.substr(0, 2) !== "_$")
continue;
console.log(p + " >>> " + eval(p))
}
cmd + shift + p
在 Devtools
打开的情况下,键入 cmd + shift + p
将其激活,然后开始在栏中键入要查找的命令或输入"?"
号以查看所有可用命令。
win 快捷键是 :ctrl + shift + p
...
: 打开文件:
: 前往文件@
:前往标识符(函数,类名等)!
: 运行脚本文件>
: 打开某菜单功能> performance monitor
在Devtools
打开的情况下,键入cmd + shift + p
将其激活,然后开始在栏中键入要查找的命令或输入"?"
号以查看所有可用命令。
将显示性能监视器以及相关信息,例如CPU,JS堆大小和DOM节点。
> FPS
选择第一项> screen
选择Capture node screenhot
调试 js 代码,肯定是我们常用的功能,那么如何打断点,找到要调试的文件,然后在内容源代码左侧的代码标记行处点击即可打上一个断点
看下面这张图,我在一个名为 toggleTab 的方法下打了两个断点,当开始执行我们的点击切换 tab 行为后,代码会在执行的断点出停下来,并把相关的数据展示一部分,此时可以在已经执行过得代码处,把鼠标放上去,即可查看相关的具体数据信息,
同时我们可以使用 右侧的功能键进行调试,右侧最上面一排分别是:
下面是各种具体的功能区
当我们的代码执行到某个程序块方法处,这个方法上可能你并没有设置相关的断点,此时你可以 F11 进入此程序块,但是往往我们的项目都是经过很多源代码封装好的方法,有时候进入后,会走很多底层的封装方法,需要很多步骤才能真正进入这个函数块,此时将鼠标放在此函数上,会出现相关提示,会告诉你在该文件的哪一行代码处,点击即可直接看到这个函数,然后临时打上断点,按F10或者点击右上角的第二个按钮即可直接进入此函数的断点处
每一个功能区,都有它相关的左右,先来看一张图,它都有哪些功能
Call Stack 调用栈:当断点执行到某一程序块处停下来后,右侧调试区的 Call Stack 会显示当前断点所处的方法调用栈,从上到下由最新调用处依次往下排列。图中可以看出,我们最先走了 toggleTab 这个方法,然后走到了一个更新对象的方法上,当前调用在哪里,箭头会帮你指向哪里,同时我们可以点击,调用栈列表上的任意一处,即可回头再去看代码
Call Stack 列表的下方是 Scope Variables 列表可以查看此时 局部变量 和 全局变量 的值。
如果你想重新从某个调用方法处执行,可以右键 Restart Frame, 断点就会跳到此处开头重新执行,Scope 中的变量值也会依据代码从新更改,这样就可以回退来从新调试,错过的调试也可以回过头来反复查看
Breakpoints 关于断点:所有当前 js 的断点都会展示在这个区域,你可以点击按钮用来 "去掉/加上" 此处断点,也可以点击下方的代码表达式,调到相应的程序代码处。
XHR Breakpoints
在 XHR Breakpoints处,点击右侧的 +号,可以添加请求的 URL,一旦 XHR 调用触发时就会在 request.send() 的地方中断
DOM Breakpoints:
可以给你的 DOM 元素设置断点,有时候真的需要监听和查看某个元素的变化情况,赋值情况,但是我们并是不太关心哪一段代码对它做的修改,只想看看它的变化情况,那么可以给它来个监听事件,这个时候 DOM Breakpoints 中会如图
当要给 DOM 添加 断点 的时候,会出现选择项分别是如下三种修改
选中之后,Sources Panel 中右侧的 DOM Breakpoints 列表中就会出现该 DOM 断点。一旦执行到要对该 DOM 做相应修改时,代码就会在那里停下来
如上图:监听form
标签,在input
框获得焦点时,触发断点调试
Event listener Breakpoints
最后 Event Listener 列表,这里列出了各种可能的事件类型。勾选对应的事件类型,当触发了该类型的事件的 JavaScript 代码时就会自动中断
DOM
断点调试当你要调试特定元素的DOM中的更改时,可以使用此选项。这些是DOM更改断点的类型:
Subtree modifications
: 子节点删除或添加时Attributes modifications
: 属性修改时Node Removal
: 节点删除时如上图:监听form
标签,在input
框获得焦点时,触发断点调试
Blackbox Script
剔除多余脚本断点。
例如第三方(Javascript
框架和库,广告等的堆栈跟踪)。
为避免这种情况并集中精力处理核心代码,在Sources
或网络选项卡中打开文件,右键单击并选择Blackbox Script
Event Listener Breakpoints
Sources
面板Event Listener Breakpoints
如上图:监听了键盘输入事件,就会跳到断点处。
local overrides
使用我们自己的本地资源覆盖网页所使用的资源。
类似的,使用DevTools
的工作区设置持久化,将本地的文件夹映射到网络,在chrome
开发者功能里面对css 样式的修改,都会直接改动本地文件,页面重新加载,使用的资源也是本地资源,达到持久化的效果。
Sources > Overrides > Enable local Overrides
,选择本地文件夹Elements
,编辑样式,自动生成本地文件。Sources
,检查文件,编辑更改。该项可以自动修改除XHR异步请求的资源,下载的文件若未格式化,可以点左下角。
local overrides
模拟Mock
数据来自:chrome 开发者工具 - local overrides
对于返回json 数据的接口,可以利用该功能,简单模拟返回数据。
比如:
api
为: http://www.xxx.com/api/v1/list
在根目录下,新建文件www.xxx.com/api/v1/list
,list
文件中的内容,与正常接口返回格式相同。
对象或者数组类型,从而覆盖掉原接口请求。
前提: 用谷歌浏览器浏览网页
第一步:在谷歌浏览器 Sources中找到需要调整的线上 js 文件,并把该 js 文件下载到桌面。
第二步:用谷歌浏览器 爬梯/越狱(fanqiang/yueyu), 安装 ReRes插件。
第三步:用 ReRes 插件把网页访问的 a.js 文件指向本地下载的 a.js 文件,就可以线下调试 js 了。
第四步:用浏览器扩展程序中勾上这2个选项,然后刷新网页就可以线下调试了,也即此时线上使用的是本地 JS 了。
注意:不调试了,要把 ReRes 调试工具给关掉(也即:下面2个选项不勾选),否则下次发版更新,就还是使用本地 JS,容易误导。
From:https://zhuanlan.zhihu.com/p/24770877
文章是 Chrome DevTools 介绍系列的一部分,查看全部文章可以关注 Github 上的 Chrome DevTools 详解,也可以关注这个系列所在的项目:front-end-study。
在 Chrome 中调试 JS 代码,那你不得不与 Chrome DevTools 的 Sources 面板打交道,所以文章主要通过介绍 Sources 面板上的各部分功能来介绍如何调试网页中的 JS。
以 https://github.com/CompileYouth/front-end-study 为例。面板被分为左中右三个部分,左边是文件导航,中间是文件的具体内容,右边可以统称为调试面板。整个面板就像一个 IDE
Sources:这个面板很好理解,展示了网页所用到的所有文件
Content scripts:Content scripts 指的是 Chrome 拓展注入在网页中的脚本。
比如我安装了一个 FeHelper (前段助手) 的 Chrome 拓展,打开 Content scripts 面板会看到:
Snippets:Snippets 的含义是片段,在这里指的是一小段程序,这个一小段程序跟在其他地方不一样的是,可以访问这个页面中的变量和函数等。
中间面板的其他操作都比较显而易见,只是有 4 点需要简单提一下。
标记 1、2 处可以隐藏/展开左右两个面板,标记 3 处格式化代码,使得代码变得易于阅读,当代码被压缩时尤其有用。另外需要提一下的是打开文件的快捷方式,可以用 Cmd + p / Ctrl + p 在任何一个功能面板上搜索一个文件,按 enter 键在 Sources 面板上打开。
右边的调试面板比较复杂,需要借助调试的例子来解释作用。不过我们可以先大概熟悉一下:
右侧的面板为上下结构,
下面结合调试实例来解释这些按钮/面板的功能。
打开一个文件,中间的面板中显示了代码,代码的左侧有代码行号,代码行号所在的位置叫做行号槽,点击行号槽,为相应的行添加断点,并在相应的行号上面加上一个类似肩章的五边形图标。特别提一下的是,这个图标的颜色是蓝色的。如下:
另外,如果一条语句由多行组成,如果在这条语句的行中添加断点的话,那么断点将会被加到下一条语句。举例如下:
在上面的代码中,你可以在 13 行添加断点,但如果你想在 14-17 行添加断点的话,那么断点将会被添加到 19 行。另外,你也不能为空行添加断点,那也会被添加到下一条语句上。比如你想在 18 行添加断点,但实际会被添加到 19 行。
右键一个没有添加断点的行号,选择 "Add conditional breakpoint",输入你的条件,当条件满足时,断点才会生效。回车后,效果如下:
可以看见,条件断点跟一般断点的区别就是颜色变成了黄色。
行内断点是你可以在一行内添加多个断点。看下面的例子:
跟前面添加断点方式一样,我先在 15 行添加了一个断点,当程序中断在 15 行时,出现了上图的例子。但与一般的例子不同的是,上面有 3 处标红的位置,表示 3 处断点。但第 1 个断点跟后 2 个不一样的是,第 1 个断点是默认处于激活状态,而后 2 个则不是,只有点击激活后才能生效。
忽略:如果你想暂时忽略某个断点,右键断点,选择 "Disable breakpoint"
修改:修改断点生效的条件。你可以将一个非条件断点通过这个方式修改成条件断点,也可以将条件断点变成非条件断点
删除:你可以直接点击断点,或者右键 "Remove breakpoint"
右键行号槽的时候,有一个选项是:"Blackbox Script"。
那什么是黑盒脚本呢?
我们写项目时,很多时候是要引用第三方库或框架的,当我们调试时,调试的对象应该是我们自己写的代码,但很多时候,我们经常在焦灼地进行下一步下一步时,突然代码跳到了第三方库或框架的源码上去,这让我们焦灼的内心更添了一把柴火。黑盒脚本就是用来解决这个问题的。它能够将一个脚本文件标记为 "Blackbox Script",那么我们就永远不可能进入这个文件内部,这个文件对我们来讲就是一个黑盒子。为什么要强调“永远”呢?因为不仅普通的断点不能访问这个被标记了的脚本,其他的,比如说 DOM 断点、事件断点等等都无法访问那个脚本文件内部。
这个面板会显示你所有的通过行号留下的断点。你可以右键管理某个或全部断点:
除了普通的中断类型,我们下面再介绍几款其他类型的。
在 Elements 面板,右键 body 元素,插入 "attribute modifications breakpoint",在 Sources 面板中显示如下:
查看 DOM 断点的详细信息请查看另一篇博客:Elements
XHR 断点跟 DOM 断点很类似,通过 XHR 断点可以很容易的找到 ajax 调用的触发点和调用堆栈。最新的 Chrome DevTools 中要么为所有 ajax 调用添加断点,要么都不添加断点。
展开 Event Listener Breakpoints 可以看到一组事件类型,展开一个事件类型可以看到具体的事件名称。
Sources
面板Event Listener Breakpoints
每个事件名称和事件类型前面都有个复选框,选中即指当页面中触发了所选的事件的话,就会触发中断。
如上图:监听了键盘输入事件,就会跳到断点处。
local overrides
使用我们自己的本地资源覆盖网页所使用的资源。
类似的,使用DevTools
的工作区设置持久化,将本地的文件夹映射到网络,在chrome
开发者功能里面对css 样式的修改,都会直接改动本地文件,页面重新加载,使用的资源也是本地资源,达到持久化的效果。
Sources > Overrides > Enable local Overrides
,选择本地文件夹显示全局监听器,在浏览器中 window 是全局对象,所以在 Global Listeners 面板中显示绑定在 window 对象上的事件监听。
这个跟上面几种不一样,这个是放在功能按钮组里面的。
选中 "Pause on exceptions" 按钮,如上图,当执行的脚本出现异常时会触发中断。
介绍了如何添加断点的方式以及几款中断类型,下面介绍一下如何利用断点进行调试。
Scope 面板显示了你当前定义的所有属性的值,例子如上图。除了 Scope 面板,你还可以在左侧的代码区域,中断的旁边看到语句中包含的变量的值。
除此以外,你还可以把鼠标放在变量上面,也显示对应变量的值。
Scope 会显示三种类型的值: Local、Closure 和 Global。
当代码中断在一处时,Call Stack 面板会显示代码的执行路径。比如在 a() 中调用了 b(),b() 中调用了 c(),那么中断如果在 c() 内部的话,那么 Call Stack 面板会依次显示 c、b、a。
在 JS 中,我们常常会写匿名函数,显而易见,在调试时,尤其在查看调用栈时,这样很不友好,所以建议尽量为每个函数命名。
如果还记得前面所讲的黑盒脚本(Blackbox Script)的话,这里就再重复一句,是的,黑盒脚本永远不可见,所以你即使在查看调用栈时你也没法看到黑盒脚本里的内容。这种情况下会出现下面这样的结果:
前面讲 Scope 面板时介绍了三种查看中断状态下的变量值,还有一个隐蔽的小技巧也能查看,按 esc 按键打开 Console drawer(不清楚是什么可以看Console),然后在里面输入你想查看的值,回车,bingo~
如果你以为 Chrome DevTools 就简单看看这些值那就太小瞧她了,在中断状态下,还能动态修改变量的值。比如中断处有个变量叫 v,值是 1,如果我直接按 "Resume script execution" 的话,那么下一次的 v 也是 1,但如果我在按恢复执行按钮之前,我在 Console drawer 中输入 v = 2 回车,那么,下一处的 v 就是 2 了。
还有更厉害的,你不仅可以修改变量的值,你还可以修改代码!当程序中断时,你可以在 Sources 面板修改你的代码。
正如名字所表示的,观察,观察什么呢?主要观察变量。
前面我们讲过,当程序中断时,可以查看这个状态下的变量的值,但局限是只能一个一个查看,而 Watch 的好处是可以让我们同时查看多个变量。你可以通过 "+" 来添加变量,当添加的变量存在时会显示对应的值,不存在的话则会显示 "not availble"。需要注意的是,这里的变量不会随着代码的执行而发生改变,所以到了下一个状态时,你需要点击刷新按钮来获得关注的变量的新的值。
现在的项目几乎都是经过编译过的,所以当我们调试时会与编译后的代码打交道,但那并不是我们想要的。不要急,Chrome DevTools 提供了预处理过的代码与源码的映射,主要表现在两点:
不过需要注意的是,上面所讲的能查看源码的前提是 Chrome DevTools 在设置中提供了相应权限,具体是:Settings - Sources - Enable Javascript source maps / Enable CSS source maps,勾选这两项即可。不过,默认情况下就是勾选。
Postman使用详解:https://blog.csdn.net/fxbin123/article/details/80428216
postman 官网:https://www.postman.com/
在开发过程中,后端的接口都是由发起 AJAX 请求而获取到的相关数据,但是很多情况是我们的业务还没有做到那块时,后端的接口都已经准备好了,但是为了便于后期的工作,将接口请求的数据模拟访问,然后对接口联调很重要,也很方便,因为我们不可能把每个请求代码都写到文件里编译好了再去浏览器内查看,这时候可以安装一个 postman ,该程序使用非常简单,功能同时也非常强大,输入你的请求,选择好请求的 method,需要请求参数的挨个填好,send 之后,就可以看到返回的数据。
可以执行常见任务的功能,例如选择DOM
元素,触发事件,监视事件,在DOM
中添加和删除元素等。
这像是Chrome
自身实现的jquery
加强版。
$(selector, [startNode])
:单选择器document.querySelector
的简写 语法:
$('a').href;
$('[test-id="logo-img"]').src;
$('#movie_player').click();
控制台还会预先查询对应的标签,十分贴心。 还可以触发事件,如暂停播放:
此函数还支持第二个参数startNode,该参数指定从中搜索元素的“元素”或Node。此参数的默认值为document
?(选择器,[startNode])
:全选择器document.querySelectorAll
的简写,返回一个数组标签元素 语法:?('.button')
可以用过循环实现切换全选
或者打印属性
此函数还支持第二个参数startNode,该参数指定从中搜索元素的“元素”或Node。此参数的默认值为document 用法:
var images = ?('img', document.querySelector('.devsite-header-background'));
for (each in images) {
console.log(images[each].src);
}
$x(path, [startNode])
:xpath
选择器$x(path)
返回与给定xpath
表达式匹配的DOM元素数组。
例如,以下代码返回页面上的所有元素:$x("//p")
xpath
多用于爬虫抓取,前端的同学可能不熟悉。
getEventListeners(object)
:获取指定对象的绑定事件getEventListeners(object)
返回在指定对象上注册的事件侦听器。返回值是一个对象,其中包含每个已注册事件类型(例如,click
或keydown
)的数组。每个数组的成员是描述为每种类型注册的侦听器的对象。 用法:getEventListeners(document);
相对于到监听面板里查事件,这个API
便捷多了。
console
除了不同等级的warn
和error
打印外
还有其它非常实用的打印。
%s
、%o
、%d
、和%c
const text = "文本1"
console.log(`打印${text}`)
除了标准的ES6
语法,实际上还支持四种字符串输出。 分别是:
console.log("打印 %s", text)
%s
:字符串%o
:对象%d
:数字或小数还有比较特殊的 %c
,可用于改写输出样式。
console.log('%c 文本 1', 'font-size:50px; background: ; text-shadow: 10px 10px 10px blue')
当然,你也可以结合其它一起用(注意占位的顺序)。
const text_2 = "文本 2"
console.log('%c %s', 'font-size:50px; background: ; text-shadow: 10px 10px 10px blue', text)
你还可以这么玩:
console.log('%c Auth ',
'color: white; background-color: #2274A5',
'Login page rendered');
console.log('%c GraphQL ',
'color: white; background-color: #95B46A',
'Get user details');
console.log('%c Error ',
'color: white; background-color: #D33F49',
'Error getting user details');
当我们需要打印多个对象时,经常一个个输出。且看不到对象名称,不利于阅读:
以前我的做法是这么打印:
console.log('hello', hello);
console.log('world', world);
这显然有点笨拙繁琐。其实,输出也支持对象解构:
console.log({hello, world});
console.assert()
当你需要在特定条件判断时打印日志,这将非常有用。
语法:console.assert(assertion,obj)
用法
const value = 1001
console.assert(value===1000,"value is not 1000")
console
编组:console.group()
当你需要将详细信息分组或嵌套在一起以便能够轻松阅读日志时,可以使用此功能。
console.group('用户列表');
console.log('name: 张三');
console.log('job: 前端');
// 内层
console.group('地址');
console.log('Street: 123 街');
console.log('City: 北京');
console.log('State: 在职');
console.groupEnd(); // 结束内层
console.groupEnd(); // 结束外层
console.time()
没有Performance API
精准,但胜在使用简便。
let i = 0;
console.time("While loop");
while (i < 1000000) {
i++;
}
console.timeEnd("While loop");
console.time("For loop");
for (i = 0; i < 1000000; i++) {
// For Loop
}
console.timeEnd("For loop");
console.table()
这个适用于打印数组对象。。。
let languages = [
{ name: "JavaScript", fileExtension: ".js" },
{ name: "TypeScript", fileExtension: ".ts" },
{ name: "CoffeeScript", fileExtension: ".coffee" }
];
console.table(languages);
DOM
对象节点:console.dir()
打印出该对象的所有属性和属性值. console.dir()
和console.log()
的作用区别并不明显。若用于打印字符串,则输出一摸一样。
console.log("Why,hello!");
console.dir("Why,hello!");
在输出对象时也仅是显示不同(log
识别为字符串输出,dir
直接打印对象。)。
唯一显著区别在于打印dom
对象上:
console.log(document)
console.dir(document)
一个打印出纯标签,另一个则是输出DOM
树对象。
WebView
使用Chrome
开发者工具在原生Android
应用中调试WebView
。
1. 配置WebViews
进行调试。
在 WebView
类上调用静态方法setWebContentsDebuggingEnabled
。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
2. 手机打开usb
调试,插上电脑。
3. 在Chrome
地址栏输入:Chrome://inspect
正常的话在App
中打开WebView
时,chrome
中会监听到并显示你的页面。 4. 点击页面下的inspect
,就可以实时看到手机上WebView
页面的显示状态了。(第一次使用可能会白屏,这是因为需要去https://chrome-devtools-frontend.appspot.com
那边下载文件)
除了inspect
标签,还有 Focus tab
:
Android
设备上的相同操作其他应用里的WebView
也可以,例如这是某个应用里的游戏,用的也是网页:
Node.js
具体可以查看阿里云社区的这篇:
Node.js应用程序故障排除手册-正确启用Chrome DevTools
使用 Chrome Devtools 调试 Node.js 程序:https://my.oschina.net/u/4592353/blog/4864388
From:https://www.cnblogs.com/yuerdong/p/9883951.html
Chrome 是 Google 出品的一款非常优秀的浏览器,其内置了开发者工具(Windows 系统中按下 F12 即可开启),可以让我们方便地对 JavaScript 代码进行调试。
打开谷歌浏览器,然后打开调试功能栏( 快捷键 F12 ),然后打开 Sources 面板。
调试的快捷键( 鼠标可以放到按钮上,会自动显示对应快捷键 )
有两种方法可以给代码添加断点
(1)找到要调试的文件,然后在内容源代码左侧的代码标记行处点击,即可打上一个断点。
(2)刷新浏览器,当页面代码运行到断点处便会暂停执行。
(1)我们在 js 源文件中需要执行断点操作的代码前加上 debugger。
(2)刷新浏览器,当页面代码运行到断点处会暂停执行
(1)右键点击设置的断点,选择 Edit breakpoint...
(2)输入执行断点的条件表达式,当表达式为 true 时断点调试才会生效。有了条件断点,我们在调试代码的时候能够更加精确地控制代码断点的时机
(1)当断点执行到某一程序块处停下来后,右侧调试区的 Call Stack 会显示当前断点所处的方法调用栈,从上到下由最新调用处依次往下排列。
(2)Call Stack 列表的下方是 Scope Variables 列表,可以查看此时局部变量和全局变量的值。
(1)调试时当前调用在哪里,Call Stack 列表里的箭头便会指向哪里。同时当我们点击调用栈列表上的任意一处,便会调到相应的位置,方便我们再回头去看看代码。
(2)如果想重新从某个调用方法处执行,可以右键选择 Restart Frame。断点就会跳到此处开头重新执行,同时 Scope 中的变量值也会依据代码重新更改,这样就可以方便地回退来重新调试,省得我们再重新刷新整个页面。
除了可以给 js 代码设置断点,我们还可以给 DOM 元素设置断点。因为我们有时候需要监听和查看某个元素的变化、赋值情况,但是并是不太关心哪一段代码对它做的修改,只想看看它的变化情况,那么可以给它来个监听事件。
(1)我们右键点击需要监听的 DOM 节点,选择“Break On...”菜单项,在出现的三个选择项中任选一个便会添加断点。
(2)这三个选择项分别对应如下三种修改情况:
(3)设置好断点后,当 DOM 元素要被修改时,代码就会在自动停留在修改处。
我们可能会在不同的文件、不同的位置添加许多断点。这些都会显示在 Source 页面里的 Breakpoints、DOM Breakpoints 区域中:
点击断点前面的复选框可以暂时“去掉/加上”该断点,点击断点可跳转到相应的程序代码处
使用快捷键:ctrl + p
ctrl + shift + f
为了减小体积,有时候我们发现一些 js 源码都是压缩之后的代码,我们可以点击下面的 {} 大括号按钮将代码转成可读格式。
(1)有时我们调试程序时需要查看服务端返回的数据内容,这个在 Network 选项卡中就可看到。但如果后台返回的是没有格式化的 JSON 数据,查看起来会异常痛苦
(2)我们可以通过 chrome 控制台的 copy 接口来实现 JSON 数据的格式化。
(3)首先请求项的右键菜单中选择 Copy Response 拷贝响应内容。
(4)命令行中先输入 copy(),然后将拷贝的数据粘贴到括号中
(5)回车后 copy 接口便会自动将数据进行格式化,并保存到剪贴板中。我们将其粘贴到文本编辑器中就可以看到效果:
(1)在 Souces 页面下的 Snippets 栏目中,我们可以随时进行 JS 代码的编写,运行结果会打印到控制台。
(2)代码是全局保存的,我们在任何页面,包括新建标签页,都可以查看或运行这些代码。我们不再需要为了运行一小段 JS 代码而新建一个 HTML 页面。
(3)Snippets 的方便之处在于,我们只需要打开 Chrome 就可以编写一份任意页面都可以运行的JS代码
(1)点击“New Snippet”按钮,创建一个新的片段文件
(2)在代码区域输入 js 代码
(3)按下“Ctrl + Enter”或者点击右下方的按钮执行代码,可以看到代码执行成功且反应到当前页面上了。
Chrome 调试器的 Async 模式是为调试异步函数所设计一个功能
下面是一段使用 Promise 的代码:
//做饭
function cook(){
console.log('开始做饭。');
var p = new Promise(function(resolve, reject){ //做一些异步操作
setTimeout(function(){
console.log('做饭完毕!');
resolve('鸡蛋炒饭');
}, 1000);
});
return p;
}
//吃饭
function eat(data){
console.log('开始吃饭:' + data);
var p = new Promise(function(resolve, reject){ //做一些异步操作
setTimeout(function(){
console.log('吃饭完毕!');
resolve('用过的碗和筷子');
}, 2000);
});
return p;
}
cook()
.then(eat)
.then(function(data){
console.log(data);
});
(1)我们都知道 Promise 的回调是异步执行的,默认情况下调用栈只记录到回调函数本身,我们无法找到代码执行的顺序,这给我们调试带来巨大的困难。
(2)开启 Async 模式后,异步函数之前的调用栈都会被记录下来,而且调用栈中代码执行状态也得到了保留。
From :http://www.admin10000.com/document/6159.html
超完整的 Chrome 浏览器客户端调试大全:http://web.jobbole.com/89344
IBM 官网:使用 Chrome 开发者工具进行 JavaScript 问题定位与调试
Chrome 开发者工具 使用教程:Google Chrome 浏览器 开发者工具 使用教程 | DeveWork
在 Web 开发者中,Google Chrome 是使用最广泛的浏览器。六周一次的发布周期和一套强大的不断扩大开发功能,使其成为了 web 开发者必备的工具。你可能已经熟悉了它的部分功能,如使用 console 和 debugger 在线编辑 CSS。在这篇文章中,我们将分享15个有助于改进你的开发流程的技巧。
如果你使用过 sublime text,那么你可能不习惯没有 Go to anything 这个功能的覆盖。你会很高兴听到 chrome 开发者功能也有这个功能,当 DevTools 被打开的时候,按 Ctrl+P(cmd+p on mac),就能快速搜寻和打开你项目的文件。
如果你希望在源代码中搜索要怎么办呢?在页面已经加载的文件中搜寻一个特定的字符串,快捷键是 Ctrl + Shift + F (Cmd + Opt + F),这种搜寻方式还支持正则表达式哦
在 Sources 标签中打开一个文件之后,在 Windows 和 Linux中,按 Ctrl + G,(or Cmd + L for Mac),然后输入行号,DevTools就会允许你跳转到文件中的任意一行。
另外一种方式是按 Ctrl + O,输入:
和 行数,而不用去寻找一个文件。
DevTools 控制台支持一些 变量 和 函数 来选择 DOM元素:
$0
是最新的记录,以此类推。想要了解更多控制台命令,戳这里:Command Line API
当编辑一个文件的时候,你可以按住 Ctrl(cmd for mac),在你要编辑的地方点击鼠标,可以设置多个插入符,这样可以一次在多个地方编辑。
勾选在 Console 标签下的保存记录选项,你可以使 DevTools 的 console 继续保存记录而不会在每个页面加载之后清除记录。当你想要研究在页面还没加载完之前出现的 bug 时,这会是一个很方便的方法。
Chrome’s Developer Tools 有内建的美化代码,可以返回一段最小化且格式易读的代码。Pretty Print 的按钮在 Sources 标签的左下角。
对于开发移动友好页面,DevTools 包含了一个非常强大的模式,这个谷歌视频介绍了其主要特点,如调整屏幕大小、触摸仿真和模拟糟糕的网络连接
(ps:原文中这个视频文件丢失了,这个图是小编补充,你可以自己去测试这个工具,很有用)
设备模式的另一个很酷的功能是模拟移动设备的传感器,例如触摸屏幕和加速计。你甚至可以恶搞你的地理位置。这个功能位于元素标签的底部,点击 “show drawer” 按钮,就可看见 Emulation 标签 --> Sensors
.
当在样式编辑中选择了一个颜色属性时,你可以点击颜色预览,就会弹出一个颜色选择器。当选择器开启时,如果你停留在页面,鼠标指针会变成一个放大镜,让你去选择像素精度的颜色。
DevTools 有一个可以模拟 CSS 状态的功能,例如元素的 hover 和 focus,可以很容易的改变元素样式。在 CSS 编辑器中可以利用这个功能
Web 浏览器在构建如 文本框、按钮 和 输入框 一类元素时,其它基本元素的视图是隐藏的。不过,你可以在 Settings -> General
中切换成 Show user agent shadow DOM
,这样就会在元素标签页中显示被隐藏的代码。甚至还能单独设计他们的样式,这给你了很大的控制权。
当在 Sources 标签下编辑文件时,按下 Ctrl + D (Cmd + D) ,当前选中的单词的下一个匹配也会被选中,有利于你同时对它们进行编辑。
在颜色预览功能使用快捷键 Shift + Click,可以在 rgba、hsl 和 hexadecimal 来回切换颜色的格式
Workspaces 是 Chrome DevTools 的一个强大功能,这使 DevTools 变成了一个真正的 IDE。Workspaces 会将 Sources 选项卡中的文件和本地项目中的文件进行匹配,所以你可以直接编辑和保存,而不必复制/粘贴外部改变的文件到编辑器。
为了配置 Workspaces,只需打开 Sources 选项,然后右击左边面板的任何一个地方,选择 Add Folder To Worskpace,或者只是把你的整个工程文件夹拖放入 Developer Tool。现在,无论在哪一个文件夹,被选中的文件夹,包括其子目录和所有文件都可以被编辑。为了让 Workspaces 更高效,你可以将页面中用到的文件映射到相应的文件夹,允许在线编辑和简单的保存。
了解更多关于 Workspaces 的使用,戳这里:Workspaces
原文:15 Must-Know Chrome DevTools Tips and Tricks 译文:ido321
前端已经被玩儿坏了!像 console.log()可以向控制台输出图片 等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前端技能,一些属于技巧,一些则是闻所未闻的冷知识,一时间还消化不过来。现分类整理出来分享给大家,也补充了一些平时的积累和扩展了一些内容。
这个很多人应该还是知道的,在浏览器地址栏可以直接运行JavaScript代码,做法是以javascript:开头后跟要执行的语句。比如:javascript:alert('hello from address bar :)');
需要注意的是如果是通过copy paste代码到浏览器地址栏的话,IE及Chrome会自动去掉代码开头的javascript:,所以需要手动添加起来才能正确执行,而Firefox中虽然不会自动去掉,但它根本就不支持在地址栏运行JS代码
博文《让Chrome 接管邮件连接,收发邮件更方便了》中有使用到,利用在浏览器地址栏中执行JavaScript代码将Gmail设置为系统的邮件接管程序。
如果说上面那条小秘密知道的人还算多的话,这条秘笈知道的人就要少一些了,在非IE内核的浏览器地址栏可以直接运行HTML代码!
比如在地址栏输入以下代码然后回车运行,会出现指定的页面内容。
data:text/html,
Hello, world!
还是浏览器地址栏上做文章,将以下代码贴到地址栏运行后浏览器变成了一个原始而简单的编辑器,与Windows自带的notepad一样,吼吼。
data:text/html,
归根结底多亏了 HTML5 中新加的 contenteditable 属性,当元素指定了该属性后,元素的内容成为可编辑状态。
推而广之,将以下代码放到console执行后,整个页面将变得可编辑,随意践踏吧~
document.body.contentEditable='true';
很多时候需要从一个URL中提取域名,查询关键字,变量参数值等,而万万没想到可以让浏览器方便地帮我们完成这一任务而不用我们写正则去抓取。方法就在JS代码里先创建一个a标签然后将需要解析的URL赋值给a的href属性,然后就得到了一切我们想要的了。
var a = document.createElement('a');
a.href = 'http://www.cnblogs.com/wayou/p/';
console.log(a.host);
利用这一原理,稍微扩展一下,就得到了一个更加健壮的解析URL各部分的通用方法了。下面代码来自James的博客。
function parseURL(url) {
var a = document.createElement('a');
a.href = url;
return {
source: url,
protocol: a.protocol.replace(':',''),
host: a.hostname,
port: a.port,
query: a.search,
params: (function(){
var ret = {},
seg = a.search.replace(/^\?/,'').split('&'),
len = seg.length, i = 0, s;
for (;iif (!seg[i]) { continue; }
s = seg[i].split('=');
ret[s[0]] = s[1];
}
return ret;
})(),
file: (a.pathname.match(/\/([^\/?#]+)$/i) || [,''])[1],
hash: a.hash.replace('#',''),
path: a.pathname.replace(/^([^\/])/,'/$1'),
relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [,''])[1],
segments: a.pathname.replace(/^\//,'').split('/')
};
}
在一张 HTML 页面中,所有设置了ID属性的元素会在JavaScript的执行环境中创建对应的全局变量,这意味着document.getElementById像人的阑尾一样显得多余了。但实际项目中最好老老实实该怎么写就怎么写,毕竟常规代码出乱子的机会要小得多。
现在很流行的CDN即从专门的服务器加载一些通用的JS和CSS文件,出于安全考虑有的CDN服务器使用HTTPS方式连接,而有的是传统的HTTP,其实我们在使用时可以忽略掉这个,将它从URL中省去。
这一点在之前一篇译文博客《jQuery编程最佳实践》中也有提到。
将script标签设置为type='text'然后可以在里面保存任意信息,之后可以在JavaScript代码中很方便地获取。
var text = document.getElementById('template').innerHTML
相信你看完以下代码后能够预料到会出现什么效果。
*{
cursor: none!important;
}
以下两行简单的CSS3代码可达到将文字模糊化处理的目的,出来的效果有点像使用PS的滤镜,so cool!
p {
color: transparent;
text-shadow: #111 0 0 5px;
}
有好多次博主都有这样的需求,垂直居中显示某个DIV,我们知道CSS中天然有水平居中的样式text-align:center。唯独这个垂直居中无解。
当然你可以将容器设置为display:table,然后将子元素也就是要垂直居中显示的元素设置为display:table-cell,然后加上vertical-align:middle来实现,但此种实现往往会因为display:table而破坏整体布局,那还不如直接用table标签了呢。
下面这个样式利用了translate来巧妙实现了垂直居中样式,需IE9+。
.center-vertical {
position: relative;
top: 50%;
transform: translateY(-50%);
}
相比而言,水平居中要简单得多,像上面提到的text-align:center,经常用到的技巧还有margin:0 auto。但对于margin大法也只在子元素宽度小于容器宽度时管用,当子元素宽度大于容器宽度时此法失效。
如法炮制,利用left和transform同样可实现水平居中,不过意义不大,毕竟text-align和margin差不多满足需求了。
.center-horizontal {
position: relative;
left: 50%;
transform: translateX(-50%);
}
利用重复指定box-shadow来达到多个边框的效果
在线演示
/*CSS Border with Box-Shadow Example*/
div {
box-shadow: 0 0 0 6px rgba(0, 0, 0, 0.2), 0 0 0 12px rgba(0, 0, 0, 0.2), 0 0 0 18px rgba(0, 0, 0, 0.2), 0 0 0 24px rgba(0, 0, 0, 0.2);
height: 200px;
margin: 50px auto;
width: 400px
}
通过设置style标签的display:block样式可以让页面的style标签显示出来,并且加上contentEditable属性后可以让样式成为可编辑状态,更改后的样式效果也是实时更新呈现的。此技巧在IE下无效。拥有此技能者,逆天也!
通过设置父级窗口的padding-bottom可以达到让容器保持一定的长度比的目的,这在响应式页面设计中比较有用,能够保持元素不变形。
this content will have a constant aspect ratio that varies based on the width.
通过CSS中的calc方法可以进行一些简单的运算,从而达到动态指定元素样式的目的。
.container{
background-position: calc(100% - 50px) calc(100% - 20px);
}
利用Math.random和toString生成随机字符串,来自前一阵子看到的一篇博文。这里的技巧是利用了toString方法可以接收一个基数作为参数的原理,这个基数从2到36封顶。如果不指定,默认基数是10进制。略屌!
function generateRandomAlphaNum(len) { var rdmString = ""; for (; rdmString.length < len; rdmString += Math.random().toString(36).substr(2)); return rdmString.substr(0, len); }
JavaScript中是没有整型概念的,但利用好位操作符可以轻松处理,同时获得效率上的提升。
|0和~~是很好的一个例子,使用这两者可以将浮点转成整型且效率方面要比同类的parseInt,Math.round 要快。在处理像素及动画位移等效果的时候会很有用。性能比较见此。
var foo = (12.4 / 4.13) | 0;//结果为3 var bar = ~~(12.4 / 4.13);//结果为3
顺便说句,!!将一个值方便快速转化为布尔值 !!window===true 。
下载的代码通过重写浏览器的alert让它可以记录弹窗的次数。
(function() { var oldAlert = window.alert, count = 0; window.alert = function(a) { count++; oldAlert(a + "\n You've called alert " + count + " times now. Stop, it's evil!"); }; })(); alert("Hello World");
关于重写原生方法,这里有个恶作剧大家可以拿去寻开心。Chrome的console.log是支持对文字添加样式的,甚至log图片都可以。于是可以重写掉默认的log方法,把将要log的文字应用到CSS的模糊效果,这样当有人试图调用console.log()的时候,出来的是模糊不清的文字。好冷,我表示没有笑。
是从这篇G+帖子的评论里看到的。使用之后的效果是再次调用log会输出字迹模糊不清的文字。
var _log = console.log; console.log = function() { _log.call(console, '%c' + [].slice.call(arguments).join(' '), 'color:transparent;text-shadow:0 0 2px rgba(0,0,0,.5);'); };
我们都知道交换两个变量值的常规做法,那就是声明一个中间变量来暂存。但鲜有人去挑战不声明中间变量的情况,下面的代码给出了这种实现。蛮有创意 的。
var a=1,b=2;a=[b,b=a][0];
在JavaScript的世界,万物皆对象。除了null和undefined,其他基本类型数字,字符串和布尔值都有对应有包装对象。对象的一个特征是你可以在它身上直接调用方法。对于数字基本类型,当试图在其身上调用toString方法会失败,但用括号括起来后再调用就不会失败了,内部实现是用相应的包装对象将基本类型转为对象。所以(1).toString()相当于new Number(1).toString()。因此,你的确可以把基本类型数字,字符串,布尔等当对象使用的,只是注意语法要得体。
同时我们注意到,JavaScript中数字是不分浮点和整形的,所有数字其实均是浮点类型,只是把小数点省略了而以,比如你看到的1可以写成1.,这也就是为什么当你试图1.toString()时会报错,所以正确的写法应该是这样:1..toString(),或者如上面所述加上括号,这里括号的作用是纠正JS解析器,不要把1后面的点当成小数点。内部实现如上面所述,是将1.用包装对象转成对象再调用方法。
当你需要写一个if语句的时候,不妨尝试另一种更简便的方法,用JavaScript中的逻辑操作符来代替。
var day=(new Date).getDay()===0; //传统if语句 if (day) { alert('Today is Sunday!'); }; //运用逻辑与代替if day&&alert('Today is Sunday!');
比如上面的代码,首先得到今天的日期,如果是星期天,则弹窗,否则什么也不做。我们知道逻辑操作存在短路的情况,对于逻辑与表达式,只有两者都真才结果才为真,如果前面的day变量被判断为假了,那么对于整个与表达式来说结果就是假,所以就不会继续去执行后面的alert了,如果前面day为真,则还要继续执行后面的代码来确定整个表达式的真假。利用这点达到了if的效果。
对于传统的if语句,如果执行体代码超过了1 条语句,则需要加花括号,而利用逗号表达式,可以执行任意条代码而不用加花括号。
if(conditoin) alert(1),alert(2),console.log(3);
上面if语句中,如果条件成立则执行三个操作,但我们不需要用花括号将这三句代码括起来。当然,这是不推荐的,这里是冷知识课堂:)
下面的代码已经不言自明了,没什么好多说的。
if (window.location != window.parent.location) window.parent.location = window.location;
Chrome专属,IE绕道的console方法。可以将JavaScript关联数组以表格形式输出到浏览器console,效果很惊赞,界面很美观。
//采购情况 var data = [{'品名': '杜雷斯', '数量': 4}, {'品名': '冈本', '数量': 3}]; console.table(data);