Chrome 監(jiān)聽(tīng) console 打開(kāi)

這個(gè)算是 Chrome only 其他的我沒(méi)測(cè)試肢执,也不想測(cè)試留搔。因?yàn)槲业目刂婆_(tái)腳本僅僅在 Chrome 下加載。
如果你需要全平臺(tái)砂吞,那么這肯定不是你需要的結(jié)果署恍。

需求

其實(shí)我很早就想折騰這個(gè)了,但是蜻直,盯质,因?yàn)閼校狭撕芫酶哦钡街苣┖粝铮铱吹椒?wù)器上統(tǒng)計(jì),發(fā)現(xiàn)流量翻了一倍赎瑰,結(jié)果訪問(wèn)量還是一樣的時(shí)候王悍,我才下決心折騰。

知之為知之不知谷歌之

一開(kāi)始乡范,谷歌一番配名,發(fā)現(xiàn)有兩種思路。

第一個(gè)是 sindresorhus 大神寫(xiě)的 devtools-detect晋辆,算是全平臺(tái)兼容(除IE)渠脉,但獨(dú)立窗口打開(kāi)的時(shí)候是檢測(cè)不到的。
另一個(gè)是咱們國(guó)人 zswang 寫(xiě)的 jdetects瓶佳,目測(cè)也是 Chrome only芋膘,當(dāng)然我的靈感也來(lái)至于他。

雖然有兩個(gè)現(xiàn)成的霸饲,但這都不是我滿意的模式为朋,于是乎就有了本次 Chrome 控制臺(tái)環(huán)境探索之旅。

分析控制臺(tái)環(huán)境

根據(jù) zswangjdetects 得知厚脉,控制臺(tái)會(huì)解析節(jié)點(diǎn)元素的 id 屬性习寸。
那么為什么會(huì)解析呢?或者他還做了什么處理呢傻工?

打開(kāi)瀏覽器霞溪,按 F12 打開(kāi) console 后輸入 debugger 按回車,然后按兩次 F11中捆,OK 完成鸯匹。
如果你的 Chrome 50 的話,映入眼簾的是密密麻麻的一大串壓縮的字符泄伪,好在他們沒(méi) uglify殴蓬,否則我就默默關(guān)了,也不會(huì)有這篇文章了蟋滴。

點(diǎn)左下角 {} 格式化代碼后染厅,變的非常漂亮痘绎,但是沒(méi)有注釋了,我記得之前版本都是有注釋的肖粮,更容易閱讀简逮。
大致預(yù)覽下代碼,最終定位到 660 行的 _describe 方法處尿赚,其他都不管我也不知道干嘛的,分析需要的代碼即可蕉堰。

// 用易懂的形式凌净,描述各種對(duì)象方法,如正則屋讶,日期冰寻,node,數(shù)組皿渗,函數(shù) 等斩芭。
_describe: function(obj) {
  if (this.isPrimitiveValue(obj)) // 如果是原始值不描述
    return null;

  // 獲取類型名包括 ArrayLike,但不是 Object.prototype.toString乐疆,有興趣可以單獨(dú)查看源碼
  var subtype = this._subtype(obj);

  if (subtype === "regexp") // 正則和日期輸出 toString 后的結(jié)果划乖。
    return toString(obj);
  if (subtype === "date")
    return toString(obj);

  if (subtype === "node") { // dom 節(jié)點(diǎn)處理,這里是重點(diǎn)
    // 獲取節(jié)點(diǎn)名挤土,text comment 等只有 nodeName
    var description = obj.nodeName.toLowerCase();
    switch (obj.nodeType) { // 節(jié)點(diǎn)類型
      case 1: // Element 類型
        description += obj.id ? "#" + obj.id : ""; // 獲取元素 id
        var className = obj.className; // 獲取元素 class
        description += (className && typeof className === "string") ? "." + className.trim().replace(/\s+/g, ".") : "";
        break;
      case 10: // DocumentType 類型
        description = "<!DOCTYPE " + description + ">";
        break;
    }
    return description;
  }

  // 獲取內(nèi)部構(gòu)造函數(shù)名琴庵,可能類似 Object.prototype.toString
  var className = InjectedScriptHost.internalConstructorName(obj);

  // 類似數(shù)組的就輸出 對(duì)象名[長(zhǎng)度] 比如 Array[3], jQuery.fn.jQuery.init[2] 之類的
  if (subtype === "array") {
    if (typeof obj.length === "number")
      className += "[" + obj.length + "]";
    return className;
  }

  if (typeof obj === "function") // 函數(shù) toString 
    return toString(obj);

  if (isSymbol(obj)) { // Symbol 處理
    try {
      return (InjectedScriptHost.callFunction(Symbol.prototype.toString, obj)) || "Symbol";
    } catch (e) {
      return "Symbol";
    }
  }

  // 錯(cuò)誤類型處理
  if (InjectedScriptHost.subtype(obj) === "error") {
    try {
      var stack = obj.stack;
      var message = obj.message && obj.message.length ? ": " + obj.message : "";
      var firstCallFrame = /^\s+at\s/m.exec(stack);
      var stackMessageEnd = firstCallFrame ? firstCallFrame.index : -1;
      if (stackMessageEnd !== -1) {
        var stackTrace = stack.substr(stackMessageEnd);
        return className + message + "\n" + stackTrace;
      }
      return className + message;
    } catch (e) {}
  }
  return className;
}

OK,代碼挺簡(jiǎn)單的仰美,看完基本就知道為什么 jdetects 可以檢測(cè)控制臺(tái)是否被打開(kāi)了迷殿。
那么現(xiàn)在我們知道,其實(shí)完全可以借助 正則,日期,函數(shù)toString 實(shí)現(xiàn)咖杂,而且更簡(jiǎn)單庆寺,例如:

var re = /x/;
var i = 0;
console.log(re);

re.toString = function () {
  return '第 ' + (++i) + ' 次打開(kāi)控制臺(tái)';
};

簡(jiǎn)單又好用,也不需要定時(shí)器或 resize 事件監(jiān)視诉字,性能更是好到不用說(shuō)懦尝。需要注意的是這里的 re.toString 必須在 console.log 之后定義,否則沒(méi)打開(kāi)控制臺(tái) toString 也會(huì)執(zhí)行奏窑。
如果只是監(jiān)聽(tīng)控制臺(tái)打開(kāi)导披,這個(gè)幾行代碼足以,但是我還沒(méi)想到監(jiān)聽(tīng)控制臺(tái)關(guān)閉方法埃唯。

這么簡(jiǎn)單的代碼撩匕,我就不寫(xiě)成插件裝逼了,需要的時(shí)候直接用即可墨叛。在 runjs 上寫(xiě)了個(gè) demo止毕,打開(kāi)預(yù)覽下效果吧模蜡!
預(yù)覽: http://sandbox.runjs.cn/show/vjtgjbzg

后序

控制臺(tái)環(huán)境下有很多功能都很方便很好用,多讀讀會(huì)發(fā)現(xiàn)很多神奇的技巧扁凛。

本文同步至我的個(gè)人博客:http://www.52cik.com/2016/04/27/chrome-console-open.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忍疾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子谨朝,更是在濱河造成了極大的恐慌卤妒,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件字币,死亡現(xiàn)場(chǎng)離奇詭異则披,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)洗出,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)士复,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人翩活,你說(shuō)我怎么就攤上這事阱洪。” “怎么了菠镇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵冗荸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我利耍,道長(zhǎng)俏竞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任堂竟,我火速辦了婚禮魂毁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘出嘹。我一直安慰自己席楚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布税稼。 她就那樣靜靜地躺著烦秩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪郎仆。 梳的紋絲不亂的頭發(fā)上只祠,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音扰肌,去河邊找鬼抛寝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盗舰。 我是一名探鬼主播晶府,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼钻趋!你這毒婦竟也來(lái)了川陆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛮位,失蹤者是張志新(化名)和其女友劉穎较沪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體失仁,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡购对,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陶因。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垂蜗,死狀恐怖楷扬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贴见,我是刑警寧澤烘苹,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站片部,受9級(jí)特大地震影響镣衡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜档悠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一廊鸥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辖所,春花似錦惰说、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至酥宴,卻和暖如春啦吧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拙寡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工授滓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓褒墨,卻偏偏與公主長(zhǎng)得像炫刷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子郁妈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,789評(píng)論 25 707
  • chrome擴(kuò)展開(kāi)發(fā)入門(mén)教程 最近在開(kāi)發(fā)chrome插件浑玛,看到一篇非常適合入門(mén)的教程,特記錄一下 注:轉(zhuǎn)載 本文首...
    謝大見(jiàn)閱讀 6,419評(píng)論 1 25
  • 前言 Chrome瀏覽器我想是每一個(gè)前端er必用工具之一吧噩咪,一部分原因是它速度快顾彰,體積不大,支持的新特性也比其它瀏...
    LiLi原上草閱讀 1,282評(píng)論 0 0
  • 在做前端開(kāi)發(fā)時(shí)胃碾,我們需要用到一些調(diào)試工具用來(lái)調(diào)試我們的HTML涨享、CSS或者JS代碼,俗話說(shuō)預(yù)先善其事必先利其器仆百,這...
    Rella7閱讀 23,910評(píng)論 0 15
  • 閱讀打卡第56天:今天讀了厕隧,阿里巴巴和四十大盜,巴士拉銀匠哈桑的故事俄周,蠢漢吁讨,驢子與騙子。
    金凱樂(lè)麻麻閱讀 83評(píng)論 0 0