#javascript #html #events #web #dojo
#javascript #HTML #Мероприятия #веб #dojo
Вопрос:
У меня есть следующий фрагмент Javascript Dojo:
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 создан по назначению, как вы можете видеть на следующем скриншоте:
Проблема в том, что каждый раз, когда я добавляю кнопку, работают только прослушиватели событий последней кнопки, т.Е. в случае со скриншотом кнопка обведена красным logs: Hello there, you called the remove handler [object MouseEvent]
, а предыдущую кнопку в таблице больше нельзя щелкнуть и перехватить необходимое событие. Извините, если код является грубым упрощением моей цели, я ценю любую предлагаемую помощь.
********* РЕДАКТИРОВАТЬ**************
Поэтому я выбрал другой подход и разместил всего 1 кнопку и удалял уровень за уровнем снизу вверх. Пока оно находится за пределами <table>
, оно функционирует..Что подводит меня к выводу о том, что НИКОГДА НЕ ПОМЕЩАЙТЕ DIJITS ИЛИ КНОПКИ В ТАБЛИЦУ После многих потерянных часов, я бы рекомендовал, если вам абсолютно необходима таблица в первую очередь, просто разместить кнопку рядом с таблицей по мере необходимости, используя CSS и floats Я оставлю этот вопрос без ответа, пока кто-нибудь не сможет предложить объяснение, почему подход с внутренней таблицей не работает.
Комментарии:
1. Похоже, проблема не в коде, опубликованном выше. Я предполагаю, что какая-то проблема при добавлении строк. Используете ли вы
innerHTML
при создании строк?2. Нет, каждая отдельная строка содержит три элемента <td> и (отражающий текст) и еще один <td>, в который помещена кнопка. Вот JS fiddle со строкой из таблицы типа HTML, который генерируется, и еще немного javascript, чтобы увидеть, как это было сделано. Видите ли вы какие-либо очевидные проблемы?
3. JS fiddle не содержит никакого кода javascript.
4. @TKambi обновил скрипку
5. Вы используете
this.HierarchyLevelsTable.innerHTML
. ОбновляяinnerHTML
, вы уничтожаете узлы dom, к которым были прикреплены события.
Ответ №1:
Во время работы с dojo. Вы никогда не должны использовать node.innerHTML
для добавления или обновления узлов. В основном это преобразует все dijits в HTML-строку и анализирует браузер как обычный HTML. что, в свою очередь, уничтожит объект dom и событие, связанное с ним.
Вместо этого создайте dom-объект с помощью dojo/dom-construct
и добавьте его с помощью appendChild
для DOM-узлов или addChild
в случае dijits контейнера.
Комментарии:
1. В моем случае узлы Dijit (кнопки) добавлялись в таблицу через строки, которые были созданы с помощью операции добавления
innerHTML
свойства таблицы, что привело к уничтожению прослушивателей событий кнопок, как объяснил выше Т. Камби!