Firebug使用详解-飞外

原文地址:http://www.cnblogs.com/xiachufeng/archive/2010/08/02/1790411.html

Javascript的调试, 是开发Web应用尤其是AJAX应用很重要的一环, 目前对Javascript进行调试的工具很多, 我比较喜欢使用的是Firebug。 Firebug是Joe Hewitt开发的一套与Firefox集成在一起的功能强大的web开发工具, 可以实时编辑、调试和监测任何页面的CSS、HTML和JavaScript。

本文主要是为初学者介绍一下Firebug的基本功能与如何使用Firebug。

由于本人水平与能力有限,

在文章中的可能会有很多错误与遗漏,

希望大家能谅解和指正!

1、 安装

Firebug是与Firefox集成的,

所以我们首先要安装的事Firefox浏览器。

安装好浏览器后,

打开浏览器,

选择菜单栏上的“工具”菜单,

选择“附加软件”,

在弹出窗口中点击右下角的“获取扩展”链接。

在打开的页面的search输入框中输入“firebug”。

等搜索结果出来后点击Firbug链接(图1-1红色圈住部分)进入Firebug的安装页面。


当Firefox重启完后我们可以在状态栏最右边发现一个灰色圆形图标(),

这就表示Firebug已经安装好了。

灰色图标表示Firebug未开启对当前网站的编辑、调试和监测功能。

而绿色()则表示Firebug已开启对当前网站进行编辑、调试和监测的功能。

而红色图标()表示已开启对当前网站进行编辑、调试和监测的功能,

而且检查到当前页面有错误,

当前图标表示有5个错误。

2、 开启或关闭Firebug

单击Firebug的图标或者按F12键你会发现页面窗口被分成了两部分,

上半部分是浏览的页面,

下半部分则是Firebug的控制窗口(图2-1)。

如果你不喜欢这样,

可以按CTRL+F12或在前面操作后单击右上角的上箭头按钮,

弹出一个新窗口作为Firebug的控制窗口。


因为我们开启Firebug的编辑、调试和监测功能,

所以目前只有两个可以选择的链接:“Enable Firebug”与“Enable Firebug for this web site”。

如果你想对所有的网站进行编辑、调试和检测,

你可以点击“Enable Firebug”开启Firebug,

则以后无论浏览任何网站,

Firebug都处于活动状态,

随时可以进行编辑、调试和检测。

不过一般的习惯我们只是对自己开发的网站进行编辑、调试和检测,

所以我们只单击“Enable Firebug for this web site”开启Firebug就行了。

开启Firebug窗口(图2-2)后,

我们可以看到窗口主要有两个区域,

一个是功能区,

一个是信息区。

选择功能区面会相应在当前标签显示位置显示一个边框表示该标签范围。这个选项的作用是设置是否用不同颜色背景表示标签范围。


4、 控制台(Console)

单击功能区面源代码查看功能

单击功能区面源代码的功能,

但它显示的只是页面文件本身的源代码,

通过脚本输出的HTML源码是看不到。

而Firebug则是所见即所得,

是最终的源代码。


!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"

html

head

title 简单的例子 /title

meta http-equiv="content-type" content="text/html; charset=utf-8"

style

#div1{background:red;100px;height:100px;}

#div2{background:blue;100px;height:100px;margin:10px;padding:10px;border:5px solid black;color:white;}

#div3{background:yellow;50px;height:50px;margin-left:25px;}

/style

/head

body scroll="no"

div 方块一 /div

div 方块二 /div

script

document.getElementById('div1').innerHTML+=' div 方块三 /div

/script

/body

/html


在例子中我们通过JavaScript在“div1”中加入了“div3”,

在Firefox中查看源代码你是看不到“div1”中包含有代码“ div 方块三 /div ”的,

但是Firebug中我们是可以看见的(图5-2选中部分)。


右边是一个功能区,

可以从这里查看到HTML Element中的CSS定义、布局情况和DOM结构。

从图5-2中我们可以看到,

源代码按DOM结构分层次显示的,

通过层次折叠功能,

我们就可以很方便分析代码。

在功能区的面中“div1”的显示区域上被一个半透明的方块遮盖了。


而在源代码中可以看到,

“方块二”的源代码“ div 方块二 /div ”已被加亮显示(红色部分)。

如果你单击某个显示区域,

则该区域的源代码会被选中。


譬如我们知道某个HTML Element的ID是“div2”,

但在层层叠叠的源代码中不好找,

在页面中鼠标也很难找到,

那我们就在功能区的搜索框中输入“div2”,

再看看源代码区域,“div2”被加亮显示出来了(图5-6红色部分)。

在这个简单的例子可能看不出很好的效果,

大家可以尝试一下把“div1”先折叠起来,

然后在搜索框输入“div3”,

你可以看到“div1”会自动展开,

并将“div3”加亮显示,

如果还觉得不够理想,

可以找一个源代码比较多的例子测试一下。


单击显示区域选择源代码,

我们还可以通过单击源代码中的HTML标记(开始或结束标记都可以)来选择。

我们尝试一下把鼠标移动到HTML标记,

会发现鼠标指针变成了手的形状,

这说明我们可以通过单击选择该源代码。

选择源代码后,

我们就可以通过右边的功能区查看、编辑和调试它的CSS定义和盒子模型(CSS盒子模型请参阅相关说明,这里就不再赘述了),

还有一个很好的功能就是当外部编辑器修改了源代码(没有删除该源代码,只是修改),

我们在浏览器重新加载页面后,选择的源代码不会改变,

我们可以很方便的观察源代码的变化与效果。

有没有经常为调试某个页面效果在源代码编辑器和浏览器之间切换,

一次又一次的刷新而感到懊恼?

有了Firebug你就不用再懊恼了。

你可以直接在源代码中进行编辑,

然后查看效果。

如果只是修改已经存在的属性,

例如要修改“div2”的内部文本,

则直接将鼠标移动到文本上面,

等鼠标指针换成“I”,

单击即可进行编辑了。

其它已存在的属性和属性值也可以这样直接进行编辑。

如果要为某Element添加属性,

请将鼠标移动到该Element上,

等光标变为“I”的时候,

单击鼠标右键,

从菜单中选择“New Attribute..”,

在显示的编辑框中输入你要添加的属性名称就可以了。


我们尝试一下为“div2”增加一个“onclick”属性,

单击的结果是将“div2”的显示文本修改为“单击”。

把光标移动到“div2”上,

然后单击鼠标右键,

选择“New Attribute..”(图5-7),

在编辑框中输入“onclick”,

最后按一下回车键(图5-8),

出现属性值输入框后,

输入“this.innerHTML=’单击’”,

回车后我们可以继续添加下一个属性,

这次测试不需要,

所以按ESC结束我们的输入。

我们来检验一下修改结果,

单击页面“div2”的区域(图5-9),

“div2”的显示文本已修改为“单击”了,

而源代码也改变了。

有没有发现,

“div2”被加亮显示了?

这又是Firebug的一个功能。

只要我们通过页面中的操作修改了Element的属性,

Firebug就会在源代码中通过加亮的方式指示当前操作修改那些属性值。

譬如我们单击某个链接修改了一个iframe里的src,

那么这个src的属性值就会被加亮显示。

又譬如我们单击某个链接修改了一个image里的图像,

那么它的src属性值也会被加亮显示。

我们可以通过Options菜单里的“Highlight Changes”设置是否加亮显示改变。

而“Expand Changes”则是设置被改变的源代码折叠起来看不见时展开让它可见。

而“Scroll Changes into view”则是源代码很多,

被改变的源代码不在可视区域时,

将被改变的源代码滚动到可视区域。


选择你要更改Element,

然后单击功能区面会同时刷新显示。


然后在右边的窗口选择“Style”标签,

这里显示的就是当前Element的CSS定义了。

我们在这里可以对CSS定义进行添加、编辑、删除、禁止等操作。

我们尝试一下把“div2”的背景色禁止了看看。

将鼠标移动到“background”这行(图5-11),

我们可以看到在这行的最右边会有一个灰色的禁止图标,

只要单击这个禁止图标,

就可以禁止了这个CSS属性了。

我们单击这个图标看看效果,

页面中的“div2”已经变成白色背景了,

而禁止图标也变成红色,

而文本会则变成灰色(图5-12),

这说明已经禁止了“background”了。

当然了,

这个操作也可以通过鼠标右键的“Disable XXXXX”来实现(XXXXX表示当前选择的CSS属性)。

我们再次单击禁止图标,

恢复“background”属性。

我们这次要把“background”的颜色由蓝色(blue)修改为绿色(green)。

我们把鼠标移动到“background”属性值“blue”上(图5-13)。

怎么会出现一个蓝色背景的方框?

这是Firebug提供背景预览功能,

让我们很直观的知道当前背景是什么。

如果背景是图片的话,

显示的将是背景图片的缩略图。

继续我们的操作,

单击属性值,

在出现的编辑框中将“blue”修改为“green”。

好了,

背景已经修改为绿色了。

现在的显示文本是左对齐的,

我想让它居中对齐,

这需要在CSS里加一个“text-align”的属性,

值为“center”。

请在CSS上单击鼠标右键,

在菜单中选择“New Property..”,

在编辑框中输入“te”,

Firebug已通过自动完成功能帮我们输入“text-align”了(图5-14),

按Tab键或回车,

在属性值中我们输入“c”,

Firebug再次帮我们自动完成了“center”(图5-15),

按Tab键或回车完成输入,

如果不需要继续输入新属性,

按ESC或单击鼠标取消输入。

文本“方块二”现在已经居中显示了。

如果忘记了某个属性值有那些选项怎么办?

不要紧,

在输入属性值的时候可以通过上、下箭头选择我们需要的属性值。

在“Style”标签里我们可以选择“Options”菜单里的“Show Computed Style”查看浏览器默认的风格定义。


为了调整一个Element的margin、border、padding和相对位置,

我们往往需要花很多工夫去修改源代码,

然后刷新页面查看效果。

有了Firebug,

你就可以轻松应对了。

我们将右边的区域切换到“Layout”标签(图5-16),

你会看到一个盒子模型,

里面从外到里通过不同的线和颜色划分出了offset、margin、border、padding和内容五个区域,

里面4个区域在每个边上都有1个数值,

表示该方向上的调整值。

我们先在左边选择“div2”,

然后把鼠标分别移动到“Layout”里的不同区域(图5-17),

然后留意一下页面,

页面在顶部多了一条水平标尺,

在左边多一条垂直标尺,

而4条实线指示出了当前鼠标指示的区域实际位置,

通过与标尺的交点可以知道该区域离页面显示区域左上角的偏移量(单位是px),

当然我们也可以通过layout中的数字计算出这些偏移量。

在图中,

我们还可以看到,

在内容区域的外面还有3个不同颜色的区域,

它们从里到外用不同颜色表示了padding、border、margin的位置和偏移量。

只要将鼠标移动到不同区域,

页面中的4条实线也会改变位置,

指示出页面中相应的区域。

我们还可以通过修改Layout中的数值,

对显示效果进行调整。

例如我们要将“div2”的内容显示区域扩大到200×200,

将鼠标移动最左边的100上,

光标变成“I”后,

单击鼠标,

然后在输入框中输入200,

按回车可继续修改高度值,

输入200,

回车后完成修改。

页面中的“div2”区域已经扩展到200×200了,

而源代码也增加了“ ”(图5-18)。

我们切换标签到“Style”,

会发现多了“element.style {height:200px;200px;}”(图5-19),

而CSS定义里面的高度和宽度都划了横线,

表示不起作用了,

“element.style”表示直接定义在Element源代码上的CSS属性。

有时候某些Element会有相同的属性,

也有自己特殊的属性,

而特殊的属性想写在Element的源代码上,

就可以在Style里单击鼠标右键选择“Edit Element Style..”进行添加。

如果有兴趣的话,

大家可以尝试修改“Layout”里的其它属性值,

看看页面的变化,

这里我就不再一一说明了。

如果不想在页面中显示标尺和4条实线,

可以不选择“Options”菜单里的“Show Rules and Guides”。


在源代码显示区域我们还可以通过鼠标右键复制源代码和显示内容,

这里就不一一说明了。

DOM的说明请看查看DOM结构一节,

两者是一样的。

在源代码区域中如果觉得源代码显示太密,

可以将“Options”菜单里的“Show White Space”选项打开,

每个源代码块之间会用空白行隔离。

如果要查看源代码的注释内容,

请将“Options”菜单里的“Show Comments”选项打开。

这里要提醒大家一下,

在HTML里调试出正确的源代码和CSS后,

别忘记将源代码和CSS的修改结果复制到你的源代码文件中,

不然你的调试结果在页面刷新后会付之东流。

切记!切记!

6、 查看CSS定义

将功能区面中所有的CSS定义,

包括链接的CSS文件。

通过功能区的文件选择按钮可以选择不同的含有CSS的文件(图6-1红色圈住部分)。


这个可以参考HTML的“Style”操作。

“Edit”按钮功能和HTML的“Edit”功能类似。

7、 脚本调试

将功能区面中所有的脚本进行调试,

包括链接的脚本。

和CSS一样,

可以通过文件选择按钮选择不同的脚本文件。

如果要在脚本中设置一个断点,

可以单击行号旁边的空白区域,

这时会出现一个红色的点表示在这里设置了断点(图7-1),

当脚本运行到此会停止运行,

等待你的操作。

在右边的小窗口将标签切换到“Breakpoints”可以查看我们设置的所有断点(图7-2),

单击左上角的checkbox可以让断点不起作用,

如果要删除断点可以单击右上角的删除图标。

通过“Options”菜单的“Disable All Breakpoints”可暂时禁止所有断点,

而“Remove All Breakpoints”可删除所有断点。

在断点标记的红点上单击右键还可以设置断点条件,

在符合条件的时候才会停止脚本的执行。


首先在测试页脚本里增加一个test的函数,

函数的主要操作是运行一个1000次的循环,

将循环的参数值显示在“div2”里:


for(var i=0;i 1000;i++){

document.getElementById('div2').innerHTML=i;

}

}


然后在“for(var i=0;i 1000;i++){”这行上设置一个断点,

并设置条件为“i=100”(图7-3),

然后单击“div2”开始执行函数test。


你可以通过这个方法很方便的了解到当前变量的值。

你还可以通过右边窗口的“Watch”标签查看到“i”的值(图7-5)。


在“Watch”标签窗口我们可以通过“Options”菜单选择查看用户自定义属性(Show User-defined Properties)、

用户自定义函数(Show User-defined Functions)、

DOM属性(Show DOM Properties)、

DOM函数(Show DOM Functions)和DOM常数(Show DOM Constants)。

我们还可以通过单击“New watch expression…”(图7-6淡黄色背景部分)加入自己想跟踪的内容。

例如我们想跟踪一下“div2”的显示内容,

就可以单击“New watch expression…”,

加入“document.getElementById('div2').innerHTML”,

输入中可通过TAB键自动完成关键字的输入(图7-7)。

如果不想跟踪了,

可单击最右边的删除图标取消跟踪。


脚本在断点停止后,

我们就可以利用搜索框旁的4个跟踪按钮进行代码跟踪了(图7-7)。

面的DOM结构。

通过“Options”菜单可自定义选择查看用户自定义属性(Show User-defined Properties)、

用户自定义函数(Show User-defined Functions)、

DOM属性(Show DOM Properties)、

DOM函数(Show DOM Functions)或DOM常数(Show DOM Constants)等内容。

通过双击你可以修改DOM里面的属性值。

9、 查看网络状况

作为开发人员,

是否会经常听到老板或客户抱怨页面太慢了?

于是你就怀疑是否脚本太多了?

忘记压缩图片了?

服务器太慢了?

网络太慢?

确实是头疼的事情。

有了Firebug,

你就可以很容易的对这个问题进行分析和判断了。

请将Firebug的当前标签切换到“Net”(图9-1)。


从图中我们可以看到,

页面中每一个文件都用一个灰色条表示它相对其它文件是从什么时候开始的,

时间是多少。

在底部我们看到页面发送了多少个请求,

总量是多少,

有多少是有缓存的,

总共花费了多少时间等信息。

如果只想了解某一样文件的情况,

你可以单击功能区面或XMLHttpRequest,

则还可以查看提交的变量。

通过查看提交的变量和返回信息,

我们可以很方便的调试程序是否正确提交了需要的变量和返回了正确的数据。

例如从图36中,

我们可以看到向“topics-remote.php”发送了一个请求,

提交的参数有“_dc”、“callback”、“limit”和“start”四个,

值分别为“1188637444000”、“stcCallback1001”、“25”与“0”,

从这里我们可以很方便的知道我们脚本操作提交的参数是否正确。

切换到“Response”页可以看到返回的结果(图9-3),

在这里你可以对返回结果进行检查。

如果你感觉在这里查看结果很乱,

你可以单击鼠标右键,

在弹出菜单中选择“Copy Response body”复制结果到编辑器查看,

你还可以选择“Open in New Tab”打开一个新标签浏览。


通过右键菜单你可以复制文件地址(Copy Location)、

HTTP请求头信息(Copy Request Headers)和HTTP响应头信息(Copy Response Headers)。

如果不想使用该功能,

可以选择Options菜单的“Disable Network Monitoring”关闭该功能。

10、 命令行调试

在“Console”标签了有一个命令行工具,

我们可以在这里运行一些脚本对页面进行调试。

我们在命令行中输入“document.getElementById('div2').innerHTML”看看效果(图10-1),

别忘了用TAB键实现快速输入关键字。

在信息区显示了当前“div2”的显示内容。


要输入“document.getElementById”是不是觉得很麻烦?

这里有一个简单的办法,

用“$$”符号代替“document.getElementById”,

我们再在命令行中输入“$$('div2').innerHTML”,

然后看看结果,

是一样(图10-2)。


当你通过“Inspect”锁定了一些HTML Element时,

你可以通过“$$1”来访问最后一个Element,

依次类推,

我们可以通过“$$n”(n 1)访问依次倒序访问锁定的Element。

我们来实践一下,

刷新一下测试页面,

然后按下“Inspect”按钮,

鼠标单击“方块二”,

然后在按下“Inspect”按钮,

单击“方块一”。

将firebug窗口切换回“Console”标签,

然后输入“$$1”,

回车后再输入“$$2”,

查看一下结果(图10-3),

正是我们用锁定过的Element。


在命令行还可以通过“$$$$(HTML 标记)”返回一个Element数组。

我们在测试页输入“$$$$(‘div’)”看看(图10-4)。

我们再输入“$$$$(‘div’)[0]”看看(图10-5)。

是不是很便于我们对HTML进行调试。


默认情况下,命令行相关的是顶层window对象,使用该命令可切换到frame里的window独享。


监视一个对象。tabName表示在那个标签页对该对象进行监视,可选值为“html”、“css”、“script”和“dom”。


跟踪对象的事件。Types的可选值为“composition”、 “contextmenu”、 “drag”、 “focus”,、“form”、“key”、 “load”、“mouse”、“mutation”、“paint”、“scroll”、“text”、“ui”和“xul”。


不跟踪对象的事件。Types的可选值为“composition”、 “contextmenu”、 “drag”、 “focus”,、“form”、“key”、 “load”、“mouse”、“mutation”、“paint”、“scroll”、“text”、“ui”和“xul”。


11、 在脚本文件中加入调试命令

有没有对脚本调试中经常需要alert感到厌烦?

有了Firebug,

你就可以放下alert了,

因为Firebug有功能比alert更强大的console.log。

先让我们来认识一下console.log,

在测试文件脚本区域我们输入一下代码:


刷新一下页面,

将firebug切换到“console”标签看看(图11-1),

在信息区显示出了我们要输出的信息“Hello”。

当然了,

单凭这个就说console.log有点夸大,

我们修改一下test函数,

把“document.getElementById('div2').innerHTML=i;”修改为:


是不是挺不错的?

console.log可以象c语言的printf一样实现格式化输出。

我们再在脚本区加入一个语句:


不能表示出不同的信息,

那么你可以通过console.debug、 console.info、 console.warn和console.error来代替console.log,

这些函数分别会用不同的背景颜色和文字颜色来显示信息。

我们来看看测试一下这些函数的输出,

在脚本中加入:


console.debug('This is console.debug!');

console.info('This is console.info!');

console.warn('This is console.warn!');

console.error('This is console.error!');


有时候,为了更清楚方便的查看输出信息,

我们可能需要将一些调试信息进行分组输出,

那么可以使用console.group来对信息进行分组,

在组信息输出完成后用console.groupEnd结束分组。

我们测试一下把刚才的4个输出作为一个分组输出,

修改代码为:


console.group('开始分组:');

console.debug('This is console.debug!');

console.info('This is console.info!');

console.warn('This is console.warn!');

console.error('This is console.error!');

console.groupEnd();


有时候,

我们需要写一个for循环列出一个对象的所有属性或者某个HTML Element下的所有节点,

有了firebug后,

我们不需要再写这个for循环了,

我们只需要使用console.dir(object)或console.dirxml(element)就可以了。

在测试页中加入代码测试一下:


console.dir(document.getElementById('div1'));

console.dirxml(document.getElementById('div1'));


for(var i=0;i 1000;i++){

document.getElementById('div2').innerHTML=i;

//console.log('当前的参数是:%d',i);

}

console.timeEnd('test');

}


看看结果(图11-8)。

在这里要注意的是console.time和console.timeEnd里的参数要一致才会有正确的输出,

而该参数就是信息的标题。


看看结果(图11-9)。

结果显示是在坐标(97,187)的鼠标单击事件执行了test函数,

而调用的脚本是在simple.html文件里的面怎么办?

如果在页面脚本中加入console.log()将调试信息写到Friebug,

在IE中肯定是提示错误的,

怎么办?

不用担心,

Frirebug提供了Frirbug Lite脚本,

可以插入页面中模仿Firebug控制台。

我们可以从一下地址firebug lite:

http://www.getfirebug.com/releases/firebuglite1.0-b1.zip

然后在页面中加入:


script language="javascript" src="/路径/firebug.js" /script


如果你不想在IE中模仿Friebug控制台,

只是不希望console.log()脚本出现错误信息,

那么在页面中加入一下语句:


script language="javascript" src="/路径/firebugx.js" /script


{

var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",

"group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

window.console = {};

for (var i = 0; i names.length; ++i)

window.console[names[i]] = function() {}

}


还有更多的功能和技巧需要在平时的使用中慢慢积累,

因此这篇文章只是一个简单的介绍,

还有很多东西是没有涉及到的,

而且因为我本身水平与能力有限,

所以文中会有很多错误与遗漏,

希望大家能多多谅解与指正!

多谢!

例子最终源代码: !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" html debug='true' head title 简单的例子 /title meta http-equiv="content-type" content="text/html; charset=utf-8" style #div1{background:red;width:100px;height:100px;} #div2{background:blue;width:100px;height:100px;margin:10px;padding:10px;border:5px solid black;color:white;} #div3{background:yellow;width:50px;height:50px;margin-left:25px;} /style script language="javascript" src="firebug/firebug.js" /script /head body scroll="no" div 方块一 /div div onclick='test()' 方块二 /div script document.getElementById('div1').innerHTML+=' div 方块三 /div '; /* console.log('Hello'); console.log(2,4,window,test,document); console.group('开始分组:'); console.debug('This is console.debug!'); console.info('This is console.info!'); console.warn('This is console.warn!'); console.error('This is console.error!'); console.groupEnd();*/ // console.dir(document.getElementById('div1')); // console.dirxml(document.getElementById('div1')); function test(){ console.time('test'); for(var i=0;i 1000;i++){ document.getElementById('div2').innerHTML=i; //console.log('当前的参数是:%d',i); } console.timeEnd('test'); console.trace(); } /script /body /html