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