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