Dojo Event 动态创建的事件未处理
Dojo Event dynamically created events not handled
我有以下 Dojo Javascript 片段:
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 时,它会在 table 中动态创建一行,其中包含必要的信息并为每一行创建一个新按钮。请注意,HTML 和 Javascript 已大大简化以说明我的问题。我没有包含 addLevelButtonClickHandler()
方法中出现的所有行逻辑。 HTMl 是按预期构建的,如您在以下屏幕截图中所见:
问题是每次我添加一个按钮时,只有最后一个按钮的事件侦听器起作用,即在屏幕截图的情况下,红色日志中圈出的按钮:Hello there, you called the remove handler [object MouseEvent]
,以及 table 不再可以单击并捕获必要的事件。很抱歉,如果代码是我的目标 gross-simplification,我很感谢提供的任何帮助。
*********编辑***************
所以我采取了不同的方法,总共只放置了一个按钮,并且从下往上逐级删除。只要它位于 <table>
之外,它就会起作用。这使我得出结论 永远不要在 TABLE 中放置 DIJITS 或按钮 在丢失许多小时后,如果您首先绝对需要 table,我会建议您根据需要使用 CSS and floats 将按钮放在 table 旁边
在有人能够解释为什么内部 table 方法不起作用之前,我将不回答这个问题。
在与道场打交道时。你不应该使用 node.innerHTML
来添加或更新节点。它基本上会将所有 dijits 转换为 HTML 字符串并由浏览器作为常规 HTML 解析。这反过来会破坏 dom 对象和与之关联的事件。
改为使用 dojo/dom-construct
创建 dom 对象,并为 DOM 节点添加 appendChild
或在容器 dijits 的情况下添加 addChild
。
我有以下 Dojo Javascript 片段:
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 时,它会在 table 中动态创建一行,其中包含必要的信息并为每一行创建一个新按钮。请注意,HTML 和 Javascript 已大大简化以说明我的问题。我没有包含 addLevelButtonClickHandler()
方法中出现的所有行逻辑。 HTMl 是按预期构建的,如您在以下屏幕截图中所见:
问题是每次我添加一个按钮时,只有最后一个按钮的事件侦听器起作用,即在屏幕截图的情况下,红色日志中圈出的按钮:Hello there, you called the remove handler [object MouseEvent]
,以及 table 不再可以单击并捕获必要的事件。很抱歉,如果代码是我的目标 gross-simplification,我很感谢提供的任何帮助。
*********编辑***************
所以我采取了不同的方法,总共只放置了一个按钮,并且从下往上逐级删除。只要它位于 <table>
之外,它就会起作用。这使我得出结论 永远不要在 TABLE 中放置 DIJITS 或按钮 在丢失许多小时后,如果您首先绝对需要 table,我会建议您根据需要使用 CSS and floats 将按钮放在 table 旁边
在有人能够解释为什么内部 table 方法不起作用之前,我将不回答这个问题。
在与道场打交道时。你不应该使用 node.innerHTML
来添加或更新节点。它基本上会将所有 dijits 转换为 HTML 字符串并由浏览器作为常规 HTML 解析。这反过来会破坏 dom 对象和与之关联的事件。
改为使用 dojo/dom-construct
创建 dom 对象,并为 DOM 节点添加 appendChild
或在容器 dijits 的情况下添加 addChild
。