Добрый день! В i-bem.js можно обратиться к блоку в трех направлениях - родитель, дочерний, на себе. А как можно обратиться к соседнему (братскому) блоку в i-bem.js?? Пробовал через общего родителя, не получается. Видимо не правильно обращаюсь, либо всплытие только линейное, и братский блок не отлавливает событие сплывшее на родителе. Пожалуйста помогите разобраться
Наверное я мало предоставил информации. Попробую описать подробнее. Существует страница:
При нажатии button в ветке header ожидается:
Блоку header присваивается модификатор open-sitemap ``` modules.define('header', ['i-bem-dom', 'menu'], function(provide, bemDom, Menu) {
provide(bemDom.declBlock(this.name, {}, {
}));
});
modules.define('sitemap', ['i-bem-dom', 'sitemap__close'], function(provide, bemDom, Close) {
});
modules.define('sitemap__close', ['i-bem-dom', 'button'], function(provide, bemDom, Button) {
}); ```
Этот код работает, модификатор удаляется
События действительно вплывают строго вверх по дереву и не распространяются на сиблингов (по аналогии с нативными DOM-событиями).
Поставленную задачу можно решать через общего родителя — он поймает события от вложенных блоков и сможет вызвать необходимые методы на потомках.
@tadatuta а как можно идентифицировать какой именно блок вызвал событие? Ведь потомки (
header, sitemap
), общего родителя (page
) имеют одинаковое событиеclick
на дочернем блокеbutton
Дополнительно: в блокеheader
, живет 2button
. Нужно отловить только на одномbutton
Всплытие блока
menu
происходит на блокеheader
я пытался в блоке
header
создать событие на этом же блоке:В блоке
page
это событие не отлавливается.Как это событие передать родительскому блоку
page
?Можно по-своему обозвать, типа
Ну и в родителе уже ловить это событие, а в
e.target
смотреть, кто вызвал событие. Типа:Решил. Вылечилось этим
page.deps.js
: