События мыши перестают работать после графика d3, масштабирование загружается

На моей странице есть несколько событий, определенных с помощью событий контроллера Spine. Они назначаются селекторам с помощью делегата jQuery и работают нормально:

events:
  'click #zoom a': 'zoom'
  'mouseenter #zoom a': -> $("#yZoom_help").show()
  'mouseleave #zoom a': -> $("#yZoom_help").delay(1600).fadeOut 1600

Асинхронно в какой-то момент позже я настроил некоторые вещи с d3. В частности, я настраиваю поведение масштабирования на холсте, связке осей и т. д.

@x_scale = d3.scale.linear() 
  .domain([@lcData.start, @lcData.end])
  .range([0, @width])    
@y_scale = d3.scale.linear()
  .domain([@lcData.ymin, @lcData.ymax])
  .range([@h_graph, 0])

@zoom_graph = d3.behavior.zoom()
  .x(@x_scale)
  .scaleExtent([1, @max_zoom])
  .on("zoom", @graph_zoom)

@canvas = d3.select("#graph_canvas")   
  .attr("width", @width)
  .attr("height", @h_graph)
  .call(@zoom_graph)
  .node().getContext("2d")     

# ... some other things left out

Проблема в том, что после того, как я пройду через этот материал настройки d3, события мыши на элементах, отличных от d3, перестанут работать. Они просто вообще не работают. Элементы имеют самый высокий z-индекс и не скрыты никакими элементами холста или svg, но они перестают обнаруживать любые события мыши.

d3 должен активировать только события мыши на холсте, верно? Происходит ли какая-то магия d3, которая захватывает мышь на всей странице? Например, d3 вставляет этот div в тело:

Magic d3 div?

EDIT: если вы хотите понять, что я имею в виду, перейдите по этой ссылке:

http://korhal.andrewmao.net:9294/#/sources/APH10154043

В левом верхнем углу есть маленькая иконка, которая меняет цвет при наведении. Это тот, который связан с событиями мыши; он должен отображать сообщение. Как только страница загружается, она перестает работать. Если вы хотите увидеть, как это работает, просто перезагрузите страницу и отключите вызов JSONP в отладчике, что предотвратит выполнение функции, устанавливающей d3.


person Andrew Mao    schedule 21.09.2012    source источник


Ответы (1)


То, что здесь произошло, на самом деле не имело никакого отношения к d3. Кажется, я случайно дважды вызывал @render во время загрузки моего приложения Spine, из-за чего все элементы отвязывались от своих событий при добавлении представления.

Перепривязку можно было сделать вызовом @delegateEvents(@events) с последующим @refreshElements, но в данном случае лучше было просто исправить лишний вызов @render.

Связанный с магистралью вопрос: Почему события Backbone при замене html не работают?

person Andrew Mao    schedule 26.09.2012