D3.js: удалить force.drag из выделения
У меня есть (довольно простой) вопрос: как "un-call" force.drag на выбор, сделанный D3.js? Скажем, я создал набор элементов и назвал "вызов" на нем, давая ему перетащить обратный вызов направленной по силе макета. Это выглядело так:
d3.selectAll('rect').call(force.drag);
Теперь будет возможно удалить это поведение из некоторых узлов позже. Мои подходы включали сброс различных слушателей, таких как 'click', 'drag' и т.д., Используя
d3.select('rect#no-drag').on('click', null);
Ни один из них не работал. Кто-нибудь знает, как удалить обратный вызов?
Ответы
Ответ 1
Вы близки. Событие перетаскивания инициируется событием mousedown
с пространством имен, называемым drag
. См.: https://github.com/mbostock/d3/blob/master/src/behavior/drag.js#L5
Итак, чтобы удалить это, вы можете сделать:
d3.select('rect#no-drag').on('mousedown.drag', null);
Ответ 2
Этот вопрос не задает вопрос о том, как иметь мелкозернистый контроль над элементом перетаскивания, но я пришел сюда, чтобы узнать, как переключать перетаскивание в зависимости от условий, а также спрашивает, как получить перетащить обратно после удалив его в комментариях.
Таким образом, для тех, кто ищет, как условно разрешить событие перетаскивания, используйте drag.filter.
drag.filter
принимает обратный вызов, который должен возвращать логическое значение. Если обратный вызов возвращает true, происходит перетаскивание, в противном случае сопротивление не запускается.
Это намного чище, чем удаление перетаскивания из выделения, а затем попытка его повторного применения.
Ответ 3
Эта строка как-то не мобильна (хром/андроид)
d3.select('rect#no-drag').on('mousedown.drag', null);