Javascript 未处理Dojo事件动态创建的事件
我有以下Dojo Javascript片段:Javascript 未处理Dojo事件动态创建的事件,javascript,html,events,web,dojo,Javascript,Html,Events,Web,Dojo,我有以下Dojo Javascript片段: postCreate: function () { this.inherited(arguments); var hitchWidgetToaddLevelButtonClickHandler = DojoBaseLang.hitch(this, addLevelButtonClickHandler); DojoOn(this.AddLevelButton, "click", hitchWidgetToaddLevelButt
postCreate: function () {
this.inherited(arguments);
var hitchWidgetToaddLevelButtonClickHandler = DojoBaseLang.hitch(this, addLevelButtonClickHandler);
DojoOn(this.AddLevelButton, "click", hitchWidgetToaddLevelButtonClickHandler);
function addLevelButtonClickHandler() {
hierarchyLevelNumber += 1;
var myButton = new Button({
label: "Click me!",
id: "level_button_" + hierarchyLevelNumber,
onClick: function(){
// Do something:
console.log("Hello there, ");
}
}).placeAt(someNode,"last").startup();
var registeredRemovalButton = DijitRegistry.byId(("level_button_" + hierarchyLevelNumber));
DojoOn(registeredRemovalButton, "click", function someFunction() {
console.log("how are you?");
});
}
}
和下面的HTML
<div id="settingsBorderContainer" data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="design:'headline', gutters:false, region:'top'" class="${theme}">
<table data-dojo-attach-point="HierarchyLevelsTable">
<tr>
<th>Level</th>
<th> Table Name </th>
<th> Column Name</th>
</tr>
<td id="someNode">
</td>
</table>
</div>
水平仪
表名
列名
这里的目标是,当单击AddLevelButton时,它会在表中动态创建一行,其中包含必要的信息,并为每一行创建一个新按钮。请注意,为了说明我的问题,HTML和Javascript在很大程度上被简化了。我没有包括addLevelButtonClickHandler()
方法中出现的所有行逻辑。HTMl是按预期构建的,如以下屏幕截图所示:
问题是,每次我添加按钮时,只有最后一个按钮的事件侦听器工作,即在屏幕截图中,按钮以红色日志圈起来:您好,您调用了移除处理程序[object MouseeEvent]
,表中的上一个按钮不再可以单击并捕获必要的事件。抱歉,如果代码是我的目标的一个粗略简化,我感谢任何提供的帮助
*********编辑**************
所以我采取了一种不同的方法,总共只放了1个按钮,并从下到上逐级删除。只要它位于
之外,它就可以正常工作。这让我得出这样的结论:在损失了很多小时后,千万不要在表格中放置DIJIT或按钮,如果您首先绝对需要一张表格,我建议您使用
在有人能够解释为什么内表方法不起作用之前,我不会回答这个问题 在使用dojo时。决不能使用
node.innerHTML
添加或更新节点。它基本上将所有dijit转换为HTML字符串,并通过浏览器解析为常规HTML。这反过来会破坏dom对象和与其关联的事件
相反,使用
dojo/dom construct
创建dom对象,并为dom节点添加appendChild
,或者在容器dijit的情况下添加addChild
。问题似乎不在上面的代码共享中。我的猜测是,添加行时会出现一些问题。创建行时是否使用innerHTML
?否,每一行有三个元素和(反映文本)以及按钮所在的另一个元素。下面是一个示例,其中包含一行从表中生成的HTML类型,以及一些其他javascript,以了解它是如何完成的。您看到任何明显的问题了吗?JS fiddle不包含任何javascript代码。@TKambi您使用的是this.HierarchyLevelsTable.innerHTML
。通过更新innerHTML
,您正在销毁事件附加到的dom节点通过表的innerHTML
属性的追加操作创建的行被添加到表中,这导致按钮的事件监听器被销毁,正如T Kambi上面解释的那样!