2014-01-13 44 views
1

我有困難的dojo小部件沒有發射事件。爲什麼事件不是從dojo小部件元素中觸發的?

我試着用dojo.query將事件綁定到某些元素,但它不會觸發事件。 所以我嘗試了dijit.registry。但它也不會在點擊元素時觸發事件。

HTML

<div class="buttons"> 
    <input id="radio1" type="radio" data-dojo-type="dijit/form/RadioButton" name="radiobtn" /> <label for="radio1">one</label> 
    <input id="radio2" type="radio" data-dojo-type="dijit/form/RadioButton" name="radiobtn" /> <label for="radio2">Two</label> 
    <input id="radio3" type="radio" data-dojo-type="dijit/form/RadioButton" name="radiobtn" /> <label for="radio3">Three</label> 
</div> 

的Javascript

require(["dojo/parser", "dojo/query", "dijit/registry", "dijit/form/RadioButton", "dojo/domReady!"], function(parser, query, registry) { 
    parser.parse(); 

    on(query('.buttons input'), 'click', function() { 
     alert('Clicked');   
    }); 

    on(registry.byId('radio1'), 'click', function() { 
     alert('Clicked Radio1');  
    }); 
}); 

下面是這個問題的Demo

如何觸發事件與dojo.query dojo小部件元素?

回答

2

你不知道。如果您閱讀reference guide,您會注意到dojo/on模塊僅用於DOM事件。您的小部件也使用DOM節點,但它們不應該被使用,因爲它們被widget events封裝。

註冊,您應該使用on()功能的事件處理程序,例如:

registry.byId("radio1").on("click", function() { 
    console.log("Clicked"); 
}); 

我也更新了JSFiddle


如果你真的想用dojo/query(處理多個單選按鈕),那麼你可以做的是通過使用dijit/registry模塊的byNode()訪問基於該DOM節點的小工具。例如:

query(".dijitRadio").forEach(function(domNode) { 
    registry.byNode(domNode).on("click", function() { 
     console.log("Clicked"); 
    }); 
}); 

但是你得留意這一點。當DOM節點轉換爲小部件並由dijit/form/RadioButton使用的模板取代時,input字段不見了。獲取單選按鈕的DOM節點的最佳方法是使用dijitRadio類。

JSFiddle的另一個更新。


小記:這可能是一個更好的主意,如果你有興趣在一個單選按鈕的狀態變化(開/關)來處理onChange事件。

+0

有沒有什麼辦法可以將一些小部件組合起來進行綁定?那就是具有相同類的小部件需要激發一個共同的功能。 –

+0

我用可能解決問題的東西更新了我的答案。但是不用'.dijitRadio'選擇器,你可能需要'.buttons .dijitRadio'選擇器。 – g00glen00b

相關問題