前端-chromeF12 谷歌開發者工具詳解 Console篇
大家都有用過各種型別的瀏覽器,每種瀏覽器都有自己的特色,本人拙見,在我用過的瀏覽器當中,我是最喜歡Chrome的,因為它對於除錯指令碼及前端設計除錯都有它比其它瀏覽器有過之而無不及的地方。可能大家對console.log會有一定的瞭解,心裡難免會想除錯的時候用alert不就行了,幹嘛還要用console.log這麼一長串的字串來替代alert輸出資訊呢,下面我就介紹一些除錯的入門技巧,讓你愛上console.log
先的簡單介紹一下chrome的控制檯,開啟chrome瀏覽器,按f12就可以輕鬆的開啟控制檯
大家可以看到控制檯裡面有一首詩還有其它資訊,如果想清空控制檯,可以點選左上角那個來清空,當然也可以通過在控制檯輸入console.clear()來實現清空控制檯資訊。如下圖所示
現在假設一個場景,如果一個數組裡面有成百上千的元素,但是你想知道每個元素具體的值,這時候想想如果你用alert那將是多慘的一件事情,因為alert阻斷執行緒執行,你不點選alert框的確定按鈕下一個alert就不會出現。
下面我們用console.log來替換,感受一下它的魅力。
看了上面這張圖,是不是認識到log的強大之處了,下面我們來看看console裡面具體提供了哪些方法可以供我們平時除錯時使用。
1、先說一下原始碼定位
大家開啟測試網頁 看到頁面右下方有一個推薦的圖示嗎?右擊推薦圖示,選擇審查元素,開啟谷歌控制檯,如下圖所示
我們現在想知道votePost方法到底在哪?跟著我這樣做,在Console面板裡面輸入votePost然後回車
直接點選上圖示紅的連結,控制檯將定位到Sources面板中,展示如下圖所示
大家看了上面這個圖片之後估計頭都要暈了吧,這麼多js都整在一行,讓人怎麼看呀,不用擔心,按下圖操作即可(也就是點選中間面板左下方的Pretty print就行了)
這時我們再回到Console面板時會驚奇的發現原來的連結後面的1現在變成91了(其實這裡的數字1或者91就是代表votePost方法在原始碼中的行號 )現在看出Pretty print按鈕的強大之處了吧
知道了怎麼樣檢視某一個按鈕的原始碼,那接下來的工作便是除錯了,除錯第一步需要做的便是設定斷點,其實設定斷點很簡單,點選一下上圖所示的92即可,這時你會發現92行號旁邊會多了一個圖示,這裡解釋一下為什麼不在91處設定斷點,你可以試下,事實上根本就沒法在91處上設定斷點,因為它是函式的定義處,所以沒法在此設定斷點。
設定好了斷點後,你就會在右邊Breakpoints方框裡看到剛剛設定的斷點。
我們先來介紹一下用到的除錯快捷鍵吧(事實上我們也可以不用下表所示的快捷鍵,直接點選上圖所示右側欄最上層的一排按鈕來進行除錯,具體用哪個按鈕,把滑鼠放到按鈕上方一會就會顯示它相應的提示)
快捷鍵 | 功能 |
---|---|
F8 | 恢復執行 |
F10 | 步過,遇到自定義函式也當成一個語句執行,而不會進入函式內部 |
F11 | 步入,遇到自定義函式就跟入到函式內部 |
Shift + F11 | 步出,跳出當前自定義函式 |
其中值得一提的是,當我們點選“推薦”按鈕進行除錯的時候會發現,不管我們是按的F10進行除錯還是按F11進行逐步除錯,都沒法進行$.ajax函式內部,即使我們在函式內部設定了斷點也沒有辦法進入,這裡按F8才是真正起效果的,不信你試試。
當我們在除錯的時候,右側Scope Variables裡面會顯示當前作用域以及他的父級作用域,以及閉包。你不僅能在右側 Scope Variables(變數作用域) 一欄處看到當前變數,而且還能把滑鼠直接移到任意變數上,就可以檢視該變數的值。
用圖說話(哈哈)
剛剛我們介紹的只是在html裡面能夠看得到它綁定了onclick事件,這樣我們就找到它繫結的js函式,如果它是在jQuery頁面載入完成函式裡面繫結的,這時候我們怎麼知道它繫結的是哪個js函式呢,如果我們不知道繫結的js函式就更加不用說除錯進去了
下面介紹一下如何檢視,還是以剛剛那個測試網頁為例子吧,但是這次我們來看“提交評論”作說明吧,
右擊“提交評論”–>稽核元素,我們可以清楚的看到在這個按鈕上未繫結任何事件。在Console面板內輸入如下程式碼
function lookEvents (elem) { return $.data ? $.data( elem, "events", undefined, true ) : $._data( elem, "events" ); } var event = lookEvents($("#btn_comment_submit")[0]); // 獲取繫結的事件
如下圖所示:
按照上述介紹的方法定位到具體的blog-common.js裡面,找到postComment 然後一層層的找到具體的程式碼,再設定斷點就好了。
最後介紹一下一個神器,很好用的debugger
如果你自己寫的程式碼,你執行的時候想讓它在某一處停下來,只要寫上的debugger就好了,不信你試試!哈哈
回到頂部谷歌控制檯Elements面板
要想開啟谷歌控制檯,有兩種方式
- ctrl+shift+i
- f12
大家知道Elements面板最大的功能就是操作屬性和修改html。這裡我再說一些大家可能不太熟悉的特性,
- 拖拽節點, 調整順序
- 拖拽節點到編輯器
- ctrl + z 撤銷修改
這些功能是我覺得最有意思的,你們可以試試哦。
下面來具體說說幾個複雜點的功能
回到頂部檢視元素上繫結的事情
- 預設會列出 All Nodes, 這些包括代理繫結在該節點的父/祖父節點上的事件, 因為在在冒泡或捕獲階段會經過該節點
- Selected Node Only 只會列出當前節點上繫結的事件
- 每個事件會有對應的幾個屬性 handler, isAtribute, lineNumber, listenerBody, sourceName, type, useCapture
- handler是處理函式, 右鍵可以看到這個函式定義的位置, 一般 js 庫繫結事件會包一層, 所以這裡很難找到對應handler
- isAtribute 表明事件是否通過 html 屬性(類似onClick)形式繫結的
- useCapture 是 addEventListener 的第三個引數, 說明事件是以 冒泡 還是 捕獲 順序執行
樣式操作
可以通過 ctrl + z 取消
回到頂部總況
目前控制檯方法和屬性有:
["$$", "$x", "dir", "dirxml", "keys", "values", "profile", "profileEnd", "monitorEvents", "unmonitorEvents", "inspect", "copy", "clear", "getEventListeners", "undebug", "monitor", "unmonitor", "table", "$0", "$1", "$2", "$3", "$4", "$_"]
下面我們來一一介紹一下各個方法主要的用途。
一般情況下我們用來輸入資訊的方法主要是用到如下四個
回到頂部console.log
用於輸出普通訊息
回到頂部console.info
用於輸出提示性資訊
回到頂部console.error
用於輸出錯誤資訊
回到頂部console.warn
用於輸出警示資訊
回到頂部console.debug
用於輸出除錯資訊
用圖來說話
console物件的上面5種方法,都可以使用printf風格的佔位符。不過,佔位符的種類比較少,只支援字元(%s)、整數(%d或%i)、浮點數(%f)和物件(%o)四種。
格式化符號 | 實現的功能 |
---|---|
%s | 格式化成字串輸出 |
%d or %i | 格式化成數值輸出 |
%f | 格式化成浮點數輸出 |
%o | 轉化成展開的DOM元素輸出 |
%O | 轉化成JavaScript物件輸出 |
%c | 把字串按照你提供的樣式格式化後輸入 |
console.log("%d年%d月%d日",2011,3,26);
console.log("圓周率是%f",3.1415926);
%o佔位符,可以用來檢視一個物件內部情況
var dog = {};
dog.name = "大毛";
dog.color = "黃色";
console.log("%o", dog);
下面重點說一下console.log的一些技巧
1、重寫console.log 改變輸出文字的樣式
console.log("%c3D Text"," text-shadow: 0 1px 0 #ccc,0 2px 0 #c9c9c9,0 3px 0 #bbb,0 4px 0 #b9b9b9,0 5px 0 #aaa,0 6px 1px rgba(0,0,0,.1),0 0 5px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.3),0 3px 5px rgba(0,0,0,.2),0 5px 10px rgba(0,0,0,.25),0 10px 10px rgba(0,0,0,.2),0 20px 20px rgba(0,0,0,.15);font-size:5em");
console.log('%cRainbow Text ', 'background-image:-webkit-gradient( linear, left top, right top, color-stop(0, #f22), color-stop(0.15, #f2f), color-stop(0.3, #22f), color-stop(0.45, #2ff), color-stop(0.6, #2f2),color-stop(0.75, #2f2), color-stop(0.9, #ff2), color-stop(1, #f22) );color:transparent;-webkit-background-clip: text;font-size:5em;');
輸出的結果如下圖所示:
2、利用控制檯輸出圖片
3、指定輸出文字的樣式
回到頂部console.dirxml
用來顯示網頁的某個節點(node)所包含的html/xml程式碼
<body>
<table id="mytable">
<tr>
<td>A</td>
<td>A</td>
<td>A</td>
</tr>
<tr>
<td>bbb</td>
<td>aaa</td>
<td>ccc</td>
</tr>
<tr>
<td>111</td>
<td>333</td>
<td>222</td>
</tr>
</table>
</body>
<script type="text/javascript">
window.onload = function () {
var mytable = document.getElementById('mytable');
console.dirxml(mytable);
}
</script>
回到頂部console.group和console.groupEnd
>輸出一組資訊的開頭和輸出結束一組輸出資訊
看你需求選擇不同的輸出方法來使用,如果上述四個方法再配合group和groupEnd方法來一起使用就可以輸入各種各樣的不同形式的輸出資訊。
哈哈,是不是覺得很神奇呀!
回到頂部console.assert
對輸入的表示式進行斷言,只有表示式為false時,才輸出相應的資訊到控制檯
回到頂部console.count
(這個方法非常實用哦)當你想統計程式碼被執行的次數
回到頂部console.dir
(這個方法是我經常使用的 可不知道比for in方便了多少) 直接將該DOM結點以DOM樹的結構進行輸出,可以詳細查物件的方法發展等等
回到頂部console.time和console.timeEnd
計時開始和計時結束(看了下面的圖你瞬間就感受到它的厲害了)
回到頂部console.profile和console.profileEnd
配合一起使用來檢視CPU使用相關資訊
在Profiles面板裡面檢視就可以看到cpu相關使用資訊
回到頂部console.timeLine和console.timeLineEnd
配合一起記錄一段時間軸
回到頂部console.trace
堆疊跟蹤相關的除錯
上述方法只是我個人理解罷了。如果想檢視具體API,可以上官方看看,具體地址為:https://developer.chrome.com/devtools/docs/console-api
下面介紹一下控制檯的一些快捷鍵
回到頂部方向鍵盤的上下鍵
大家一用就知曉。比如用上鍵就相當於使用上次在控制檯的輸入符號
回到頂部$_
命令返回最近一次表示式執行的結果,功能跟按向上的方向鍵再回車是一樣的
上面的$_</code>需要領悟其奧義才能使用得當,而$0~$4則代表了最近5個你選擇過的DOM節點。
什麼意思?在頁面右擊選擇審查元素
,然後在彈出來的DOM結點樹上面隨便點選,這些被點過的節點會被記錄下來,而$0</code>會返回最近一次點選的DOM結點,以此類推,$1返回的是上上次點選的DOM節點,最多儲存了5個,如果不夠5個,則返回
undefined
。
$ // 簡單理解就是 document.querySelector 而已。
$$ // 簡單理解就是 document.querySelectorAll 而已。
$_ // 是上一個表示式的值
$0-$4 // 是最近5個Elements面板選中的DOM元素,待會會講。
dir // 其實就是 console.dir
keys // 取物件的鍵名, 返回鍵名組成的陣列
values // 去物件的值, 返回值組成的陣列
看一下chrome控制檯一個簡單的操作,如何檢視頁面元素,看下圖就知道了
你在控制檯簡單操作一遍就知道了,是不是覺得很簡單!
回到頂部Chrome 控制檯中原生支援類jQuery的選擇器
也就是說你可以用$
加上熟悉的css選擇器來選擇DOM節點
copy
通過此命令可以將在控制檯獲取到的內容複製到剪貼簿(如果在elements面板中選中某個節點,也可以直接按ctrl+c執行復制操作)
(哈哈 剛剛從控制檯複製的body裡面的html可以任意貼上到哪 比如記事本 是不是覺得功能很強大)
回到頂部keys和values
前者返回傳入物件所有屬性名組成的資料,後者返回所有屬性值組成的陣列
回到頂部console.table
回到頂部monitor & unmonitor
monitor(function),它接收一個函式名作為引數,比如function a
,每次a
被執行了,都會在控制檯輸出一條資訊,裡面包含了函式的名稱a
及執行時所傳入的引數。
而unmonitor(function)便是用來停止這一監聽。
看了這張圖,應該明白了,也就是說在monitor和unmonitor中間的程式碼,執行的時候會在控制檯輸出一條資訊,裡面包含了函式的名稱a
及執行時所傳入的引數。當解除監視(也就是執行unmonitor時)就不再在控制檯輸出資訊了。
Console.log樣式
格式化符號 | 實現的功能 |
---|---|
%s | 格式化成字串輸出 |
%d or %i | 格式化成數值輸出 |
%f | 格式化成浮點數輸出 |
%o | 轉化成展開的DOM元素輸出 |
%O | 轉化成JavaScript物件輸出 |
%c | 把字串按照你提供的樣式格式化後輸入 |
說了上面一堆公式,還是舉個例子讓你印象深刻一些,哈哈。
在控制檯輸入如下程式碼
console.log("%c3D Text"," text-shadow: 0 1px 0 #ccc,0 2px 0 #c9c9c9,0 3px 0 #bbb,0 4px 0 #b9b9b9,0 5px 0 #aaa,0 6px 1px rgba(0,0,0,.1),0 0 5px rgba(0,0,0,.1),0 1px 3px rgba(0,0,0,.3),0 3px 5px rgba(0,0,0,.2),0 5px 10px rgba(0,0,0,.25),0 10px 10px rgba(0,0,0,.2),0 20px 20px rgba(0,0,0,.15);font-size:5em");
console.log('%cRainbow Text ', 'background-image:-webkit-gradient( linear, left top, right top, color-stop(0, #f22), color-stop(0.15, #f2f), color-stop(0.3, #22f), color-stop(0.45, #2ff), color-stop(0.6, #2f2),color-stop(0.75, #2f2), color-stop(0.9, #ff2), color-stop(1, #f22) );color:transparent;-webkit-background-clip: text;font-size:5em;');
輸出的結果如下圖所示:
回到頂部