Добрый день! В 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: