Chrome 开发工具使用
Chrome 开发工具使用
介绍
Chrome浏览器得益于其优秀的V8解释器,javascript执行速度和内存占有率表现非常优秀。对于html+css+javascript前台技术的学习或者开发,浏览器developer tool的使用时必不可少的,也能极大的提高学习或者开发效率。本文根据版本 34.0.1847.116 m。在window下,开启developer tool的快捷键为F12。(2014年4.29日整理—Laily)
1 developer tool结构
Developer tool的功能栏有8个,分别是
Elements(标签):用来调试网页的HTML源码和CSS代码。
Network(网络):查看网页的HTTP通信情况。
Sources(源码):调试JavaScript代码。
Timeline(时间抽):查看各种网页行为随时间变化的情况。
Profiles(性能):查看网页的性能情况,比如CPU和内存消耗。
Resources(资源):查看网页加载的各种资源文件(比如代码文件、字体文件、css文件等),以及在硬盘上创建的各种内容(比如本地缓存、Cookie、Local Storage等)。
Audits(监察):提供网页优化的建议。
Console(控制台):用来运行JavaScript命令。
整理自:
http://www.cnblogs.com/wukenaihe/archive/2013/01/27/javascript%E8%B0%83%E8%AF%95.html
http://blog.sina.com.cn/s/blog_6e637ea701017glv.html
http://javascript.ruanyifeng.com/tool/console.html
2 Element(元素)
Element控制面板能够让你查看所有的DOM tree中的内容,可以根据html内容找到页面中的元素或者根据页面中的定位标签,同时可以改变DOM的内容。由javascript代码产生的标签,也只能通过这种方式查看了(在你的IDE中无法看到)。
2.2 选元素找标签
如上图所示,我选中<div id=”fm”>标签之后,在页面中显示的对应的元素就会选中。如果,我现在要定位百度一下这个按钮,我可以通过左下角的放大镜,在页面中选中百度一下,DOM中也会把对应的标签给你找出来。这个功能在调试时绝对是利器。最下面显示的是现在选中标签在DOM中的层次关系。
2.3 临时修改内容
我们也可以对里面的内容进行临时性修改,可以直接在某个元素上双击修改元素的属性,或者你点右键选“Edit as Html”直接对元素的HTML进行编辑,或者删除某个元素,所有的修改都会即时在页面上得到呈现。如刚才找到的百度一下标签中的value改成“调试一下”后马上在页面中相应显示。
2.4 元素监听
你还可以对某个元素进行监听,在JS对元素的属性或者HTML进行修改的时候,直接触发断点,跳转到对改元素进行修改的JS代码处:
2.5 css修改
Elements标签页的右侧可以对元素的CSS进行查看与编辑修改:
你还可以通过这里看到各CSS选择器设置的CSS值的覆盖情况。
下面的Metrics可以看到元素占的空间情况(宽、高、Padding、Margin神马的):
注意到上面的Properties没有?这个很有用哦,可以让你看到元素具有的方法与属性,比查API手册要方便得多哦
2.6 标签注册事件查看
如果你想知道“百度一下”这个按钮注册了哪些功能,或者鼠标点击时执行了哪个javascript函数,就可以通过这个功能实现了。
3 网络控制面板
网络控制面板在两个方面还是非常还用的,一个是发现图片(css、js等)加载不了,可以通过network查看它请求的位置。第二个,是调试ajax时,可以查看它的请求和获取。如百度输入框中,输入关键字后会自动显示热门内容,这显然是一个ajax的使用。
注:要是点击进去没有内容就刷新一下。
点击左侧某一个具体去请求URL,可以看到该请求的详细HTTP请求情况:
我们可以在这里看到HTTP请求头、HTTP响应头、HTTP返回的内容等信息。
4 源码控制面板(js调试)
Javascript的调试,基本上是通过源码控制面板和命令行配合进行的。
4.1 Beautiful javascript
网上的js一般是压缩过的,阅读压缩过的javascript肯定是不是人能进行的,更别说添加断点了。在 Scripts 面板下面有个 Pretty print 按钮(这种符号 {}), 点击会将压缩 js 文件格式化缩进规整的文件, 这时候在设定断点可读性就大大提高了。
调整之前
调整之后
4.2 代码出错定位
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN” “http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
«strong>html xmlns="http://www.w3.org/1999/xhtml">
«strong>head>
«strong>title>javascript add</title>
«strong>script type=“text/javascript”>
<strong>var</strong> <strong>div</strong>=<strong>document</strong>.getElementByd("a");
function calSum(){
<strong>var</strong> <strong>a</strong>=parseInt(<strong>document</strong>.getElementById("num1").<strong>value</strong>);
<strong>var</strong> <strong>b</strong>=parseInt(<strong>document</strong>.getElementById("num2").<strong>value</strong>);
<strong>document</strong>.getElementById("num3").<strong>value</strong>=(<strong>a</strong>+<strong>b</strong>);
}
</script>
</head>
«strong>body>
<<strong>input</strong> <strong>type</strong>="text" <strong>id</strong>="num1"/>add<<strong>input</strong> <strong>type</strong>="text" <strong>id</strong>="num2"/>
<<strong>input</strong> <strong>type</strong>="button" <strong>id</strong>="btnCal" <strong>onclick</strong>="calum()" <strong>value</strong>="equal"/><<strong>input</strong> <strong>type</strong>="text" <strong>id</strong>="num3"/>
</body>
</html>
上面的代码中,getElementByd(“a”)部分显然是错误的,在IDE中有些错误是检查不出来的(特别是跟浏览器有关的部分)。加载该页面后,可以在控制台看到报错信息,然后直接定位至出错点。
4.3 添加断点及单步
4.3.1 断点中断
可以通过单击左侧添加断点,并在右侧显示。也可以通过watch expression添加查看的变量。
我们添加了一个断点,如果在页面上的操作执行到断点处,就会在断点处终止。然后,我们可以通过右侧最上面的按钮调试,与VS等IDE的调试非常相近。Call stack是显示函数的调用栈,在调试大规模的javascript程序是非常有用。
4.3.2 页面中断调试
除了给设定常规断点外, 还可以在某一特定事件发生时中断(不针对元素) , 在 Scripts 面板右侧, 有个 Event Listener Breakpoints, 这里列出了支持的所有事件, 不仅 click, keyup 等事件, 还支持 Timer(在 setTimeout setInterval 处理函数开始执行时中断), onload, scroll 等事件。
4.4 其他
以下是老版本chrome的界面,某些细节可能不一样,但是大体是类似的。
5.Timeline 面板(当前 Chrome 版本为 45.0.2454.99 m (64-bit))
Timeline 工具栏提供了对于在装载你的 Web 应用的过程中,时间花费情况的概览,这些应用包括处理 DOM 事件, 页面布局渲染或者向屏幕绘制元素。Timeline 可以通过事件,框架,和实时内存用量3个方面的数据来监测网页,通过这些数据,我们可以方便的找出页面中存在问题的地方。
强烈建议在浏览器隐身模式下使用这个工具,并且禁用一切无关的插件,因为这些插件会影响测试的结果
5.1 使用
在面板的最左侧有一个记录按钮,点击该按钮之后 Timeline 开始工作,之后刷新页面,然后再次点击该按钮使之停止记录信息并开始分析结果。分析完之后会出现如下信息。
6 Profiles标签页
这个控制面板允许我们查看函数运行时CPU占有率,还有内存占有率。这能够帮助我们优化代码,查看代码性能(内存还能查看闭包泄露等)。
按start可以分析,现在的内存占有率。进行操作后,再得到第二份内存分析报告,这样我们就能通过内存变化来进行分析了。在底栏,还有对比、总结等选项。
7.resource(资源)
Resources标签页可以查看到请求的资源情况,包括CSS、JS、图片等的内容,同时还可以查看到存储相关的如Cookies、HTML5的Database和LocalStore等,你可以对存储的内容编辑和删除。
这两个不是熟悉,不多说,具体还是请参考官方文档吧。
8.Audits标签页
这个对于优化前端页面、加速网页加载速度很有用哦(相当与Yslow):
点击run按钮,就可以开始分析页面,分析完了就可以看到分析结果了:
它甚至可以分析出页面上样式表中有哪些CSS是没有被使用的哦:
9.Console(控制台)
命令行对于我们有一个非常有用的地方,对于javascript提供的API或者API的功能不是非常熟悉。这个时候命令行就成为我们试验最好的地方。如,我们想查看document下面有哪些函数,我们就可以在命令行中输入,然后选中并尝试。对于jquery等开源框架的学习,这种方式也非常高效,学代码还是得跑起来才行。
我们可以在命令行里面直接改变内存中的内容,对于小函数我就可以用这样的方式直接替换。
我们按enter是对输入的内容运行,如果要换行需要按shift+enter。在这里面,我们直接在命令行里面里面讲calSum函数覆盖掉,a+b换成了a*b。运行结果如下所示。
这个除了查看错误信息、打印调试信息(console.log())、写一些测试脚本以外,还可以当作Javascript API查看用。
例如我想查看console都有哪些方法和属性,我可以直接在Console中输入“console”并执行:
怎么样,一目了然了吧 ?再例如我想查看日期函数都有哪些方法:
9.1 console对象
console对象代表浏览器的JavaScript控制台。虽然它还不是标准,但是各大浏览器都原生支持,已经成为事实上的标准。
console对象主要有两个作用:
-
显示网页代码运行时的错误信息。
-
提供了一个命令行接口,用来与网页代码互动。
console对象的接口有很多方法,可供开发者调用。
9.1.1 console.log方法
log方法用于在console窗口显示信息。
如果参数是普通字符串,log方法将字符串内容显示在console窗口。
console.log(“Hello World”)// Hello World
console.log(“a”,“b”,“c”)// a b c
如果参数是格式字符串(使用了格式占位符),log方法将占位符替换以后的内容,显示在console窗口。
console.log(” %s + %s = %s", 1, 1, 2)// 1 + 1 = 2
上面代码的%s表示字符串的占位符,其他占位符还有
-
%d, %i 整数
-
%f 浮点数
-
%o 对象的链接
-
%c CSS格式字符串
log方法的两种参数格式,可以结合在一起使用。
console.log(" %s + %s “, 1, 1, “= 2”)// 1 + 1 = 2
9.1.2 其他输出方法:debug,info,warn,error方法
除了log,console对象还有四个输出信息的方法:
-
debug:等同于log。
-
info:等同于log。
-
warn:输出信息时,在最前面加一个黄色三角,表示警告。
-
error:输出信息时,在最前面加一个红色的叉,表示出错。
这四个方法的用法与log完全一样。
console.error(“Error: %s (%i)”, “Server is not responding”,500)// Error: Server is not responding (500)console.warn(‘Warning! Too few nodes (%d)’, document.childNodes.length)// Warning! Too few nodes (1)
9.1.3 console.table方法
对于某些复合类型的数据,console.table方法可以将其转为表格显示。
var languages = [ { name: “JavaScript”, fileExtension: “.js” }, { name: “TypeScript”, fileExtension: “.ts” }, { name: “CoffeeScript”, fileExtension: “.coffee” }];console.table(languages);
上面代码的language,转为表格显示如下。
复合型数据转为表格显示的条件是,必须拥有主键。对于上面的数组来说,主键就是数字键。对于对象来说,主键就是它的最外层键。
var languages = { csharp: { name: “C#”, paradigm: “object-oriented” }, fsharp: { name: “F#”, paradigm: “functional” }};console.table(languages);
上面代码的language,转为表格显示如下。
9.1.4 console.assert方法
assert方法用来验证某个条件是否为真。如果为假,则显示一条事先指定的错误信息。它的格式如下。
console.assert(条件判断,输出信息)
使用方法如下。
console.assert(true === false,“判断条件不成立”)// Assertion failed: 判断条件不成立
下面是另一个例子,判断子节点的个数是否大于等于500。
console.assert(list.childNodes.length < 500, “节点个数大于等于500”)
9.1.5 time和timeEnd方法
这两个方法用于计时,可以算出一个操作所花费的准确时间。
console.time(“Array initialize”);var array= new Array(1000000);for (var i = array.length - 1; i >= 0; i–) { array[i] = new Object();};console.timeEnd(“Array initialize”);// Array initialize: 1914.481ms
time方法表示计时开始,timeEnd方法表示计时结束。它们的参数是计时器的名称。调用timeEnd方法之后,console窗口会显示“计时器名称: 所耗费的时间”。
9.1.6 分组方法:group和groupend
这两个方法用于将显示的信息分组。它只在输出大量信息时有用,分在一组的信息,可以用鼠标折叠/展开。
9.1.7 其他方法
-
console.dir:输出对象的信息,用于显示一个对象的所有属性。
-
console.clear:对console窗口进行清屏,光标回到第一行。
-
console.trace:当前执行的代码在堆栈中的调用路径。
9.2 命令行API
在控制台中,除了使用console对象,还可以使用一些控制台自带的命令行方法。
(1)$_
$_属性返回上一个表达式的值。
2+2// 4
$_// 4
(2)$0 - $4
控制台保存了最近5个在Elements面板选中的DOM元素,$0代表倒数第一个,$1代表倒数第二个,以此类推直到$4。
(3)$(selector)
$(selector)返回一个数组,包括特定的CSS选择器匹配的所有DOM元素。该方法实际上是document.querySelectorAll方法的别名。
var images = $(‘img’);for (each in images) { console.log(images[each].src);}
上面代码打印出网页中所有img元素的src属性。
(4)$x(path)
$x(path)方法返回一个数组,包含匹配特定XPath表达式的所有DOM元素。
$x(”//p[a]")
上面代码返回所有包含a元素的p元素。
(5)inspect(object)
inspect(object)方法打开相关面板,并选中相应的元素:DOM元素在Elements面板中显示,JavaScript对象在Profiles中显示。
(6)getEventListeners(object)
getEventListeners(object)方法返回一个对象,该对象的成员为登记了回调函数的各种事件(比如click或keydown),每个事件对应一个数组,数组的成员为该事件的回调函数。
(7)keys(object),values(object)
keys(object)方法返回一个数组,包含特定对象的所有键名。
values(object)方法返回一个数组,包含特定对象的所有键值。
var o = {‘p1’:‘a’, ‘p2’:‘b’};keys(o)// [“p1”, “p2”]values(o)// [“a”, “b”]
(8)monitorEvents(object[, events]) ,unmonitorEvents(object[, events])
monitorEvents(object[, events])方法监听特定对象上发生的特定事件。当这种情况发生时,会返回一个Event对象,包含该事件的相关信息。unmonitorEvents方法用于停止监听。
monitorEvents(window, “resize”);monitorEvents(window, [“resize”, “scroll”])
上面代码分别表示单个事件和多个事件的监听方法。
monitorEvents($0, “mouse”);unmonitorEvents($0, “mousemove”);
上面代码表示如何停止监听。
monitorEvents允许监听同一大类的事件。所有事件可以分成四个大类。
-
mouse:“mousedown”, “mouseup”, “click”, “dblclick”, “mousemove”, “mouseover”, “mouseout”, “mousewheel”
-
key:“keydown”, “keyup”, “keypress”, “textInput”
-
touch:“touchstart”, “touchmove”, “touchend”, “touchcancel”
-
control:“resize”, “scroll”, “zoom”, “focus”, “blur”, “select”, “change”, “submit”, “reset”
monitorEvents($("#msg"), “key”);
上面代码表示监听所有key大类的事件。
(9)profile([name]),profileEnd()
profile方法用于启动一个特定名称的CPU性能测试,profileEnd方法用于结束该性能测试。
profile(“My profile”)profileEnd(“My profile”)
(10)其他方法
命令行API还提供以下方法。
-
clear()方法清除控制台的历史。
-
copy(object)方法复制特定DOM元素到剪贴板。
-
dir(object)方法显示特定对象的所有属性,是console.dir方法的别名。
-
dirxml(object)方法显示特定对象的XML形式,是console.dirxml方法的别名。
9.3 debugger语句
debugger语句必须与除错工具配合使用,如果没有除错工具,debugger语句不会产生任何结果。
在chrome浏览器中,当代码运行到debugger指定的行时,就会暂停运行,自动打开console界面。它的作用类似于设置断点。
for(var i = 0;i<5;i++){ console.log(i); if (i===2) debugger;}
上面代码打印出0,1,2以后,就会暂停,自动打开console窗口,等待进一步处理。
9.4 移动端开发
9.4.1 模拟手机视口(viewport)
chrome浏览器的开发者工具,提供一个选项,可以模拟手机屏幕的显示效果。
老版本(估计以chrome 32为分界):打开“设置”的Overrides面板,选择相应的User Agent和Device Metrics选项。
较新的版本:在,进入开发者工具之后,直接按下Esc快捷键或者下图的按钮,可以看到第三个选项卡Emulation,(有的版本为override)
.
User Agent可以使得当前浏览器发出手机浏览器的Agent字符串,Device Metrics则使得当前浏览器的视口变为手机的视口大小。这两个选项可以独立选择,不一定同时选中。
9.4.2 模拟touch事件
我们可以在PC端模拟JavaScript的touch事件。
首先,打开chrome浏览器的开发者工具,选择“设置”中的Overrides面板,勾选“Enable touch events”选项。
然后,鼠标就会触发touchstart、touchmove和touchend事件。(此时,鼠标本身的事件依然有效。)
至于多点触摸,必须要有支持这个功能的设备才能模拟,具体可以参考Multi-touch web development。
9.4.3 模拟经纬度
chrome浏览器的开发者工具,还可以模拟当前的经纬度数据。打开Sensors,选中Override Geolocation选项,并填入相应经度和纬度数据。
参考链接
-
Chrome Developer Tools, Using the Console
-
Firebug Wiki, Console API
-
Axel Rauschmayer, The JavaScript console API
-
Marius Schulz, Advanced JavaScript Debugging with console.table()
-
Google Developer, Command Line API Reference