2012-08-15 33 views
6

我有一個Javascript應用程序,它依賴於在textarea中捕獲鍵盤事件。當使用firebug(1.10.2)在Firefox(14.x)上測試和調試時,我注意到當我的斷點處於活動狀態並且調試器正在工作時,我的應用程序的行爲不同。檢測何時用於調試的Firebug(或任何其他網絡調試器)

我知道如何檢測Firebug,但我想知道當Firebug實際用於調試時是否可以檢測(使用Javascript)?

編輯:這裏是一些隨機網站

This site捕撈量的輸入框中的關鍵事件爲例,打印出的字符代碼,並替換爲文本表示按鍵(即「輸入」了輸入密鑰)或大寫(如果是字母)。

當我與Chrome的調試和放置一個斷點上監聽功能,當達到斷點(預期)沒有任何反應,當我恢復文本打印出正常的腳本。

當我用Firefox上的Firebug進行調試時:讓我們先說我按下「e」字母,輸入欄包含文本「E」。我打開斷點並按字母「z」。 Firebug停止在斷點處,但輸入欄現在具有文本「Ez」而不是「E」。當我恢復腳本時,按預期將此文本替換爲「Z」。

我嘗試了另一個Firefox調試器(Venkman 0.9.89),發生了同樣的事情。所以我的猜測是這是一個Firefox問題,而不是調試器問題。所以這個問題可能會更普遍,它是否可以在Javascript代碼被調試時被檢測到?

+13

這是一個非常* *奇怪的要求。你的應用程序的行爲有什麼不同?也許你應該解決並修復你的應用程序的行爲,而不是試圖解決它 - 它在調試時通常不應該有不同的表現,並且可能存在一個架構問題。那麼其他很多調試器呢?你將不得不將它們都檢測出來...... – 2012-08-15 09:27:21

+0

當Firebug工作時,即使你沒有斷點或與非Firebug運行的其他區別,它的工作方式也不同嗎? – 2012-08-15 09:43:57

+0

我正在捕獲事件,處理它並阻止它。在調試執行該工作的方法時,事件實際發生在我的方法被調用之前,因此我無法阻止它。由於我的應用程序在Firebug關閉的情況下工作,我認爲這種行爲不是Firefox的問題。找到另一個調試器沒有發生在我身上,謝謝你的想法!另外,雖然Firebug已打開但未進行調試,但一切正常。 – Bikush 2012-08-15 09:46:08

回答

2

這是我做的,檢測螢火蟲:

if (window.console && (window.console.firebug || window.console.exception)) { 
    // At this point, Firebug is enabled 
} 

第一個測試是非常重要的,以確保控制檯實際存在的第二個將測試Firebug的,儘管它只能用於舊版本的工作它。第三個是有作爲的Firebug增加了「異常」這是因爲財產「例外」是螢火蟲的插件添加。

(無關,但興趣:window.console.exception是使用螢火蟲顯示一條消息到控制檯的方法。例如,鍵入:

>>> window.console.exception("A message", {param:'Value'}) 

你會看到一個錯誤,會顯得很熟悉,使用dump傳遞的對象

+0

正如我在我的問題中提到,我知道這個檢查。無論如何謝謝!由於Firebug開發人員從window.console中刪除了firebug對象,因此有人會遇到問題,並且可能會發現此答案有用。 – Bikush 2012-08-17 08:01:22

+0

我沒有在你的問題中看到對'window.console.exception'的引用,也沒有對'window.console.firebug'的引用!但是,我可能會失明。如果您認爲它回答了問題,請接受我的回答! – Merc 2012-08-17 13:25:00

+0

我的問題是如何檢測實際的調試過程,而不是Firebug的存在。 – Bikush 2012-08-17 14:55:08

0

嘛!

芝加哥商業交易所,希望這個答案會幫助別人。

設函數,我們要進行調試被如:

function debugged() 
{ 
    debugger; 
} 
setTimeout(debugged, 3000); 

添加此調試檢測代碼:

setTimeout(this.x = function(a){ s = Math.abs(new Date() - a.c - 1000); a.c = new Date(); setTimeout(a.foo,1000, a); if(s>100)console.log("debug") },1000, {c: new Date(), foo:this.x}) 

所以如果我們在一些地方和開放的調試器中運行它,它會觸發斷點和調試事件將被逮住(你可以通過控制檯中出現的「調試」字看到它)。這是一個概念,你也許會改變檢測週期時間,提高調試標誌的一種方式。由於單線程的JavaScript。