前端技术-调试工具(上)

页面制作之调试工具

常用的调试工具有Chrome浏览器的调试工具,火狐浏览器的Firebug插件调试工具,IE的开发人员工具等。它们的功能与使用方法大致相似。Chrome浏览器简洁快速,功能强大这里主要介绍Chrome浏览器的调试工具。

打开 Google Chrome 浏览器,通过下面任何一种方式进入开发人员工具: 
-点击位于浏览器用户界面右上角的“页面”下拉菜单,“更多工具”→“开发人员工具”。 
-右键点击网页上的任一元素,在弹出菜单中选择“审查元素”。 
-在 Windows操作系统上,使用 Ctrl+Shift+I 快捷键打开开发人员工具(或使用 Ctrl+Shift+J 直接进入 JavaScript 控制台)。

Chrome一共有8个功能子集。如下图:

image

每一个图标点击后都会打开相应的调试面板,帮助您获取各种不同的信息,如 DOM 树、资源占用情况、页面相关的脚本等。通过 Ctrl+[ 和 Ctrl+] 键,可以在这些项之间进行切换。每个模块及其主要功能为:

Element 标签页: 用于查看和编辑当前页面中的 HTML 和 CSS 元素。
Network 标签页:用于查看 HTTP 请求的详细信息,如请求头、响应头及返回内容等。
Source 标签页:用于查看和调试当前页面所加载的脚本的源文件。
TimeLine 标签页: 用于查看脚本的执行时间、页面元素渲染时间等信息。
Profiles 标签页:用于查看 CPU 执行时间与内存占用等信息。
Resource 标签页:用于查看当前页面所请求的资源文件,如 HTML,CSS 样式文件等。
Audits 标签页:分析页面加载的过程,进而提供减少页面加载时间、提升响应速度的方案,用于优化前端页面,加速网页加载速度等。
Console 标签页:用于显示脚本中所输出的调试信息,或运行测试脚本等。

学习这个章节,最主要的是多动手点点,左击/右击,先点看看,进而深入学习。

一.Elements:

在元素(Elements)面板中,可以看到整个页面的 DOM 树结构和每个元素的所有属性(即html和css),同时也可以实时地修改这些元素及其属性,并可以实时看到修改后的效果。

1.Styles

-点击image,点击页面上的元素,显示选中元素的HTML代码和样式;

-编辑HTML:在工具窗口左侧是html代码,可通过双击修改现有标签的属性值,也可选中html代码片段右击选择“Edit as HTML”进行html代码的修改;

-编辑属性:在工具窗口右侧显示的是被选元素的样式信息,可以通过双击现有属性来修改该元素的 style 属性或应用的某个选择器中的属性值,也可以通过取消勾选的方式去掉一些属性,同时页面实时变化。

-添加属性:鼠标双击您所想修改的元素的选择器的空白部分,即可添加属性。添加任何属性都必须以分号结束。你也可以直接点击+号,添加新选择器并进行属性操作。

jdfw

-可以直接在盒模型上更改margin和padding。

-搜索功能:当工具面板获得焦点后,快捷键ctrl+f会打开搜索框,键入元素关键字进行搜索。

-你还可以对某个元素进行监听,在JS对元素的属性或者HTML进行修改的时候,直接触发断点,跳转到对改元素进行修改的JS代码处:

image

-拖拽节点, 调整顺序。拖拽节点到编辑器:

jdfw

注:像素大小,可以通过鼠标的滚轮调整,调整单位1px(百分比调整单位1%);按住ALt,调整单位0.1px;同时按住Shift+ALt,调整单位10px。

总之,把可以点的都点一遍。

2.Computed

显示的是所选元素的最终样式(对应JS中的getComputedStyle()方法),Computed Style中的属性是只读的,不能实时修改,所以主要用来查看元素的最终属性值。

+Event Listeners

显示了绑定到当前元素的事件监听函数,而且会显示事件冒泡或捕获(即能够响应此事件的所有元素)。

右击标签,审查元素;出现工具栏-》菜单 Elements,查看右侧菜单-》EventListeners,查看元素上绑定了哪些事件:

image

默认会列出 All Nodes, 这些包括代理绑定在该节点的父/祖父节点上的事件, 因为在在冒泡或捕获阶段会经过该节点
Selected Node Only 只会列出当前节点上绑定的事件
每个事件会有对应的几个属性 handler, isAtribute, lineNumber, listenerBody, sourceName, type, useCapture

image

-handler是处理函数, 右键可以看到这个函数定义的位置, 一般 js 库绑定事件会包一层, 所以这里很难找到对应handler
-isAtribute 表明事件是否通过 html 属性(类似onClick)形式绑定的
-useCapture 是 addEventListener 的第三个参数, 说明事件是以冒泡还是捕 顺序执行
-右击handler选择“Show function definition”可以进入Sources里js文件中。

+DOM Breakpoints

这个后面再细讲。

+Properties

image

Properties:显示当前元素的DOM属性,按照类的继承层级排列,越靠下层级越高。最上面是一个HTMLDivElement的实例,第二个是HTMLDivElement的类。第三个,是HTMLElement类,HTMLDivElement类继承自HTMLDivElement类。接着分别是Element类,Node类,和Object类。如果选择不同的节点类型,就会出现不同的继承关系。

这个很有用,可以让你看到元素具有的方法与属性,比查API手册要方便,但要注意某些方法和属性在IE、FireFox等其他浏览器下面的支持情况。

二.Network

image

请求的每个资源在Network表格中显示为一行,每个资源都有许多列的内容(如红色区块1),不过默认情况下不是所有列都显示出来。

Name/Path: 资源名称以及URL路径;
Method: HTTP请求方法;
Status/Text: HTTP状态码/文字解释;
Type: 请求资源的MIME类型;

Initiator解释请求是怎么发起的,有四种可能的值:


Parser:请求是由页面的HTML解析时发送的;
Redirect:请求是由页面重定向发送的;
Script:请求是由script脚本处理发送的;
Other:请求是由其他过程发送的,比如页面里的link链接点击,在地址栏输入URL地址。


Size/Content: Size是响应头部和响应体结合起来的大小,Content是请求内容解码后的大小。进一步了解可以看这里Chrome Dev Tools - “Size” vs “Content”;
Time/Latency: Time是从请求开始到接收到最后一个字节的总时长,Latency是从请求开始到接收到第一个字节的时间;
Timeline: 显示网络请求的可视化瀑布流,鼠标悬停在某一个时间线上,可以显示整个请求各部分花费的时间。
以上是默认显示的列,不过我们可以在瀑布流的顶部右键,这样就可以选择显示或者隐藏更多的列,比如Cache-Control, Connection, Cookies, Domain等。

我们可以按照上面任意一项来给资源请求排序,只需要单击相应的名字即可。Timeline排序比较复杂,单击Timeline后,需要选择根据Start Time、Response Time、End Time、Duration、Latency中的一项来排序。

红色区块2中,一共有6个小功能:

Record Network Log: 红色表示此时正在记录资源请求信息;
Clear: 清空所有的资源请求信息;
Filter: 过滤资源请求信息;
Use small resource raws: 每一行显示更少的内容;
Perserve Log: 再次记录请求的信息时不擦出之前的资源信息;
Disable cache: 不允许缓存的话,所有资源均重新加载。

选择Filter后,就会出现如红色区块3所显示的过滤条件,当我们点击某一内容类型(可以是Documents, Stylesheets, Images, Scripts, XHR, Fonts, WebSockets, Other)后,只显示该特定类型的资源。在XHR请求中,可以在一个请求上右键选择“Replay XHR”来重新运行一个XHR请求。

有时候我们需要把Network里面内容传给别人,这时候可以在资源请求行的空白处右键然后选择Save as HAR with Content保存为一个HAR文件。然后可以在一些第三方工具网站,比如这里重现网络请求信息。

选定某一资源后,我们还可以Copy as cURL,也就是复制网络请求作为curl命令的参数,详细内容看 Copying requests as cURL commands

此外,我们还可以查看网络请求的请求头,响应头,已经返回的内容等信息,如下图:

image

资源的详细内容有以下几个:

HTTP request and response headers
Resource preview: 可行时进行资源预览;
HTTP response: 未处理过的资源内容;
Cookie names and values: HTTP请求以及返回中传输的所有Cookies;
WebSocket messages: 通过WebSocket发送和接收到的信息;
Resource network timing: 图形化显示资源加载过程中各阶段花费的时间。

注:

XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。比如,

<a href="https://github.com/NUKnightLab/TimelineJS">这里</a>

这里a标签的Xpath为:/html/body/div[2]/p[1]/a,解读为:html里面body标签的第二个div标签的第一个p标签下的a标签。

三.Sources

用于查看和调试当前页面所加载的脚本的源文件。

image

-通过左边的内容源,打开对应的 JavaScript 文件,鼠标点击文件的行号就可以设置和删除断点。添加的每个断点都会出现在右侧调试区的 Breakpoints 列表中,点击列表中断点就会定位到内容区的断点上。如果你有多个文件、多个断点的话,利用 Breakpoints 列表中的断点快速定位非常方便。

-对于每个已添加的断点都有两种状态:激活和禁用。刚添加的断点都是激活状态,禁用状态就是保留断点但临时取消该断点功能。在 Breakpoints 列表中每个断点前面都有一个复选框,取消选中就将禁用该断点。断点位置的右键菜单中也可以禁用断点。也可以在右侧功能区上面Chrome 断点设置 - hanguokai - 韩国恺的博客按钮临时禁用所有已添加的断点,再点一下恢复原状态。

-条件断点:在断点位置的右键菜单中选择“Edit Breakpoint...”可以设置触发断点的条件,就是写一个表达式,表达式为 true 时才触发断点。

-很多代码是压缩/混淆过的,点击“{}”可以格式化代码,再点一下就取消格式化。。

-在断点调试时,可以用鼠标选择想要查看的变量或表达式,然后右键菜单执行“Evaluate in Console”,就可以看到该表达式的当前的值了。

1.代码断点

设置断点:在 Sources 面板 js 文件行号处设置断点, 这里除了常规断点外, 还有个条件断点(右键 conditional breakpoint), 在设置的条件为 true 时才会断电, 在循环中需要断点时比较有用.
断点后可以查看 堆栈, 变量 信息:

chrome调试工具常用功能整理

在调用堆栈这里可以切换到堆栈中的任何地方重新执行(右键restart frame), 如果想查看断点前的信息时比较有用.

chrome调试工具常用功能整理

断点后的变量保存到全局
选中变量, 右键 Evalute in console
在 console 中选中输出的内容, 右键 store as global variable

chrome调试工具常用功能整理

2.事件断点

元素上事件断点:某一事件/某类事件
devtools 可以查看某一个元素上绑定了哪些事件: Elements > Event Listeners

chrome调试工具常用功能整理

3.DOM 断点

一般是 dom 结构改变时触发。 有时候我们需要监听某个 DOM 被修改情况,而不关心是哪行代码做的修改(也可能有多处都会对其做修改)。那么我们可以直接在 DOM 上设置断点。

image

如图所见,在元素审查的 Elements Panel 中在某个元素上右键菜单里可以设置三种不同情况的断点:


子节点修改
自身属性修改
自身节点被删除

选中之后,Sources Panel 中右侧的 DOM Breakpoints 列表中就会出现该 DOM 断点。一旦执行到要对该 DOM 做相应修改时,代码就会在那里停下来。

对上面元素上事件断点(mouseover) 后不容易找到业务代码, 使用 mutation 断点, 断点后配合 call stack 就可以找到业务代码了, 如下图

这种情况使用全局搜索(ctrl + shift + f) 代码中 css classname 也能找到业务代码, 然后直接断点也可以。

4.XHR 断点

右侧调试区有一个 XHR Breakpoints,点击+ 并输入 URL 包含的字符串即可监听该 URL 的 Ajax 请求,输入内容就相当于 URL 的过滤器。如果什么都不填,那么就监听所有 XHR 请求。一旦 XHR 调用触发时就会在 request.send() 的地方中断。

5.全局事件断点

devtools 还可以对事件发生时断点, 比如 click 发生时断点, 这个跟 元素上事件断点 不同, 不会限定在元素上, 只要是事件发生, 并且有 handler 就断点; 还可以对 resize, ajax, setTimeout/setInterval 断点.

下面这个图是 resize 时中断, 因为库都代理了, 还需要在断点处一步一步跟下去才能走到业务代码中.

//@ sourceURL 给 eval 出来的代码命名

有时候一些非常动态的代码是以字符串的形式通过 eval() 函数在当前 Javascript context 中创建出来,而不是作为一个独立的 js 文件加载的。这样你在左边的内容区就找不到这个文件,因此很难调试。其实我们只要在 eval 创建的代码末尾添加一行 “//@ sourceURL=name“ 就可以给这段代码命名(浏览器会特殊对待这种特殊形式的注释),这样它就会出现在左侧的内容区了,就好像你加载了一个指定名字的 js 文件一样,可以设置断点和调试了。下图中,我们通过 eval 执行了一段代码,并利用 sourceURL 将它命名为 dynamicScript.js ,执行后左侧内容区就出现了这个“文件”,而它的内容就是 eval 的中的内容。

Chrome 断点设置 - hanguokai - 韩国恺的博客

还可以看看这个给动态编译出来的 CoffeeScript 代码命名的示例:

var coffee = CoffeeScript.compile(code.value)+ "//@ sourceURL=" + (evalName.value || "Coffeeeeeeee!");
eval(coffee);

实际上,//@ sourceURL 不仅仅可以用在 eval 的代码中,任何 js 文件、甚至是 Javascript Console 输入的代码都可以用,效果一样!

几个常用的断点快捷键:


F8: 继续执行
F10: step over, 单步执行, 不进入函数
F11: step into, 单步执行, 进入函数
shift + F11: step out, 跳出函数
ctrl + o: 打开文件
ctrl + shit + o: 跳到函数定义位置
ctrl + shift + f: 所有脚本中搜索

四.TimeLine

用于查看脚本的执行时间、页面元素渲染时间等信息。

jdfw

可结合Profiles进行JavaScript性能分析。

在开始做性能优化的时候要设置一个基线,来明确这个页面的速度到底怎样。在时间线(timeline)标签下开始记录,载入页面然后停止记录,这样就设置了一个基线。(打开chrome开发者工具,点击“时间线”标签,然后点击窗口底部圆形的黑色“记录”图标开始记录)。chrome是智能的,只有页面开始载入的时候才会开始记录。一般多记录几次(约三次)然后取了平均值。

作者:jingwhale

转自:http://www.cnblogs.com/jingwhale/p/4508774.html

转载于:https://www.cnblogs.com/yuqlblog/p/4765577.html

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

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

相关文章

新版Microsoft Edge支持跨平台跨设备浏览

之前一直使用Google Chrome浏览器&#xff0c;可以随意安装插件扩展程序&#xff0c;无广告&#xff0c;这是我钟爱她的原因。但是之后不能登录Google账号&#xff0c;不能实现跨设备应用&#xff0c;就想找一款好用的替代品&#xff0c;近期发现了新版的Microsoft Edge&#x…

BZOJ1050 [HAOI2006]旅行

Description 给你一个无向图&#xff0c;N(N<500)个顶点, M(M<5000)条边&#xff0c;每条边有一个权值Vi(Vi<30000)。给你两个顶点S和T &#xff0c;求一条路径&#xff0c;使得路径上最大边和最小边的比值最小。如果S和T之间没有路径&#xff0c;输出”IMPOSSIBLE”&…

biosrecovery什么意思_BIOS中的每个中文是什么意思

BIOS中的每个中文是什么意思&#xff0c;请对照的翻译一下Time/System Time时间/系统时间Date/System Date日期/系统日期Level 2 Cache二级缓存System Memory系统内存Video Controller视频控制器Panel Type液晶屏型号Audio Controller音频控制器Modem Controller调制解调器(Mod…

百度网盘7.3.1.10版本增加工作空间功能,可实现百度网盘与电脑文件夹同步

百度网盘新增的工作空间是一款文件同步的产品&#xff0c;支持电脑本地与云端之间的文件同步&#xff0c;多设备间文件自动保持同步、支持查看文件每次都修改的历史版本。功能类似于onedrive。如果有同步需求的小伙伴可以尝试下载最新版的百度网盘试用该功能哦。下载网址&#…

ubuntu+idea intellij配置android开发环境

最近对移动开发产生兴趣&#xff0c;决定在未来几年内利用空余时间开发一些app或游戏什么的&#xff0c;鉴于ios开发成本较高&#xff0c;且自身对java相对熟悉&#xff0c;因此选择了学习android。都说android市场不很很好&#xff0c;收益较难&#xff0c;但是仍觉得只要功夫…

typeof的用法

typeof可以返回变量的类型&#xff0c;返回值为字符串&#xff0c;其值有 "undefined" "boolean" "string" "number" "object" "function" 而 typeof(null)会返回object 转载于:https://www.cnblogs.com/lhyhappy…

opencv 最大连通域_opencv 查找连通区域 最大面积实例

今天在弄一个查找连通的最大面积的问题。要把图像弄成黑底&#xff0c;白字&#xff0c;这样才可以正确找到。然后调用下边的方法&#xff1a;RETR_CCOMP:提取所有轮廓&#xff0c;并将轮廓组织成双层结构(two-level hierarchy),顶层为连通域的外围边界&#xff0c;次层位内层边…

JS 函数柯里化

在计算机科学中&#xff0c;柯里化是把接受多个参数的函数变换成接受一个单一参数&#xff08;最初函数的第一个参数&#xff09;的函数&#xff0c;并且返回接受余下的参数而且返回结果的新函数的技术。——详见 维基百科柯里化就是预先将某些参数传入&#xff0c;得到一个简单…

LTI系统的物理可实现性与希尔伯特变换

产品的设计一般为线性时不变系统&#xff0c;要求系统具有物理可实现性&#xff0c;从时域上看&#xff0c;h(t)具有因果性&#xff1b;从频域上看&#xff0c;|H(jw)|符合佩利—维纳准则。任何具有因果性的系统&#xff0c;|H(jw)|的实部R(w)满足希尔伯特变换&#xff0c;|H(j…

垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想

Delphi 是一个基本上被我遗忘的工具&#xff0c; 要不是在使用RapidSql , 我是收不到Embarcadero 公司发出的邀请来參加Delphi XE5的公布会的。 有人可能要问为什么是Embarcadero &#xff08;名称很拗口&#xff09;而不是Borland 开Delphi 公布会&#xff0c; 这是由于Borla…

iOS Appstore 版本更新

1&#xff0c;版本更新 通过比较构建号/版本号 检查更新 /// 构建号 50 // NSString * currentVersion [NSBundle mainBundle].infoDictionary["CFBundleVersion"];/// 版本号 2.2.0//CFBundleShortVersionStringNSString * currentVersion [NSBundle mainBund…

ubuntu下安装国际版QQ

在网上看到了好多的ubuntu下安装QQ的方法 好多 下面是看别人的文章 来测试的一篇 ubuntu下 安装国际版QQhttp://www.ubuntukylin.com/applications/showimg.php?langcn&id23下载 地址网盘:http://yun.baidu.com/share/link?shareid2983202140&uk202032639下载好以后 …

傅里叶变换应用——信号调制与解调

傅里叶变换的典型应用主要用于通信的信号调制与解调&#xff0c;信号调制的目的是将信号进行变换&#xff0c;使其便于传输。频率调制是将低频信号调制到高频载波信号上。同步信号解调是接受系统产生同步的高频载波信号进行解调&#xff0c;从调制信号中恢复原信号的过程。调制…

cocos2d-x返回Android游戏黑屏解决办法

返回Android游戏黑屏解决办法这几天逛cocos2d-x.org论坛&#xff0c;发现cocos2d-x的作者放出来一个帖子&#xff0c;用来解决返回Android游戏加载资源时黑屏的问题。帖子过些日子估计就沉了&#xff0c;所以转出来&#xff0c;以供后面查询。需要修改三个文件&#xff1a;1) c…

vue重要特性

重要特性 自定义input组件动态组件递归组件slot作用域slot异步组件内联模板子组件索引进阶 自定义指令状态管理vuex单文件组件生产部署路由xxx

连续时间系统与离散时间系统的时域分析对比

通过学习离散时间系统的时域分析&#xff0c;发现其与连续时间系统的时域分析有很多相似之处&#xff0c;自己做了一个专题拓展&#xff0c;从数学模型描述到时域分析方法对两大系统进行横向对比&#xff0c;总结两者之间的联系和异同点。

python获取当前时间的源代码_Python获取时间戳代码实例

1、获取秒级时间戳与毫秒级时间戳、微秒级时间戳import timeimport datetimet time.time()print (t) #原始时间数据print (int(t)) #秒级时间戳print (int(round(t * 1000))) #毫秒级时间戳print (int(round(t * 1000000))) #微秒级时间戳返回1499825149.257892 #原始时间数据…

AutoLayout bug集合

NSInternalInconsistencyException, reason: <NSISEngine: 0x16d5ef10>... http://stackoverflow.com/questions/28111635/ios-aspect-ratio-constraint-breaks-on-ios7-works-on-ios8 这好像是ios7.1的bug,对浮点数计算有误,一般添加按钮比例约束的时候multiplier值都是…

[SQL Server]重命名数据库【转】

原文链接&#xff1a;http://www.cnblogs.com/Ryan_j/archive/2011/04/03/2004428.html 重命名数据库很简单&#xff0c;选择数据库--右键--重命名数据库 或者 sp_renamedb oldDB ,newDB 但是你再新建的相同名字的数据库就会报错&#xff0c;提示数据库已经存在 比如test数据库…

DCOS实践分享(4):如何基于DC/OS整合SMACK(Spark, Mesos, Akka, Cassandra, Kafka)

这篇文章入选CSDN极客头条 http://geek.csdn.net/news/detail/71572 当前&#xff0c;要保证业务的市场竞争力&#xff0c;仅靠设计一个可用并且好看的产品&#xff0c;已经完全不能满足要求。全球消费者都希望产品能够足够的智能化&#xff0c;通过大数据分析来改善他们的用户…