Подтвердить что ты не робот

Как иметь несколько событий изменения размера окна d3

У меня есть три элемента svg на одной странице, каждая из которых назначается D3. Каждый из них имеет собственную логику изменения размера страницы, назначаемую простой модуль, который я написал, чтобы сделать их отзывчивыми.

Проблема заключается в том, что только последнее событие изменения размера запускается, поскольку оно, похоже, перезаписало события изменения размера более ранней страницы. Является ли это ожидаемым поведением d3.select(window).on('resize', ...)? Я привык к $(window).resize(...), который отлично работает при многократном вызове.

Я видел этот предыдущий ответ, что в D3 возможны несколько событий изменения размера. Я что-то делаю глупо?

Вот простой пример я застрял на jsFiddle:

d3.select(window).on("resize", function() {
   d3.select("#d3console").append("div").html("d3 resize event A!"); 
});

d3.select(window).on("resize", function() {
   d3.select("#d3console").append("div").html("d3 resize event B!"); 
});

$(window).bind("resize", function() {
   d3.select("#jQconsole").append("div").html("jQ resize event A!"); 
});

$(window).bind("resize", function() {
   d3.select("#jQconsole").append("div").html("jQ resize event B!"); 
});

Какие выходы:

d3 resize event B!
d3 resize event B!
jQ resize event A!
jQ resize event B!
jQ resize event A!
jQ resize event B!

Я знаю, что можно сохранить шунтирование предыдущей функции изменения размера в цепочку так же. Просто ожидал различного поведения от D3.

4b9b3361

Ответ 1

Вам нужно пространство имен для прослушивателей, например. on('resize.one') и on('resize.two')

Из Документов API:

Если прослушиватель событий уже был зарегистрирован для одного и того же типа в выбранном элементе, существующий прослушиватель удаляется до добавления нового слушателя. Чтобы зарегистрировать несколько слушателей для одного и того же типа событий, за типом может следовать необязательное пространство имен, такое как "click.foo" и "click.bar".

Ответ 2

Это может быть хорошей идеей использовать ResizeObserver, как здесь, чтобы каждый модуль мог устанавливать/удалять свой собственный наблюдатель изменения размера.