2014-05-21 61 views
0

通常,我將添加一個事件處理程序到dojo小部件。例如,更改事件的處理程序。然後,我的代碼中的某些內容會觸發更改事件 - 但我不知道是什麼。所以,通常你只需在你最喜歡的調試器中設置一個斷點,然後查看調用堆棧,並且可以快速跟蹤導致事件觸發的原因。但是,我的活動調用堆棧通常在dojo的lang.hitch處結束,我猜測這是因爲dojo將函數傳遞給window.setTimeout,所以當func在js事件隊列上執行時,調用堆棧中的大部分有用信息都消失了。調試dojo小部件事件 - setTimeout與調用堆棧

這是一個小的可執行樣本。

<b id="cb"></b> 
<script src="//ajax.googleapis.com/ajax/libs/dojo/1.9.3/dojo/dojo.js"></script> 
<script> 
require(["dijit/form/CheckBox", "dojo/domReady!"], function(CheckBox){ 
    var checkBox = new CheckBox({ 
     onChange: function(b){ 
      console.log(b); 
     } 
    }, "cb"); 

    // manually trigger change event. 
    // i want to be able to see this line in the debuggers call stack. 
    checkBox.set("checked", true); 
}); 
</script> 

有沒有簡單的方法來克服這個令人討厭的調試障礙?就像也許,一個告訴dojo不要通過setTimeout執行事件處理程序的設置?

在這種情況下,看起來_WidgetBase.js defer()是一個叫setTimeout的人,但我知道在dojo中我經常遇到這個問題,並且希望有一個比編輯源代碼更好的方法。

+0

您是否看過文章[使用Chrome DevTools調試異步JavaScript?](http://www.html5rocks.com/en/tutorials/developertools/async-call-stack/) – JoseM

+0

@JoseM更好比我所希望的要多:)你應該將它作爲答案發布。 – goat

回答