2013-12-04 3 views
1

Я сделал слегка измененную гистограмму, чтобы добавить дополнительную панель поверх исходных данных, когда значение бара превышает целевое значение. Это просто, так что я могу изменить цвет панели на красный.D3 JS tooltips fire mouseover event

Теперь я пытаюсь запустить событие mouseover на исходном баре, когда красный загорается, но событие, похоже, не срабатывает должным образом. Если я изменил CSS на панели или попытаюсь прочитать данные из него, он отлично работает.

Mouseover событие следующим образом:

$('#chart-canvas').on('mouseover', '.over-target', function() { 
var xBar = $(this).attr('x'); 
$('#chart-canvas').find('.bar:not(.over-target)[x="'+xBar+'"]').trigger('mouseover'); 

});

Вот JSfiddle того, что у меня есть http://jsfiddle.net/6LCdW/11/

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

Спасибо за любую помощь

ответ

3

Короткая версия: вы установите pointer-events: none; для перекрывающихся баров.

Несколько дополнительных комментариев к вашему коду. Во-первых, я бы посоветовал не смешивать D3 и JQuery, если вам абсолютно не нужно - это позволит избежать много путаницы позже.

Во-вторых, способ добавления этих перекрывающихся баров D3 состоит в том, чтобы не добавлять их по одному, а скорее фильтровать данные, которые их добавляют. То есть код для их добавления будет

svg.selectAll(".bar.over-target") 
    .data(data.filter(function(d) { return +d.value > +d.target; })) 
    .enter() 
    .append("rect") 
    .attr("class", "bar over-target") 
    .attr("x", function(d) { return x(d.date); 
    .attr("width", x.rangeBand()) 
    .attr("y", function(d) { return y(d.value); }) 
    .attr("height", function(d) { return y(d.target) - y(d.value); }); 

Нет необходимости в явном цикле или условном заявлении. Полный пример here.

Чтобы ответить на второй вопрос, вы можете сделать это с помощью одного rect, если вы его заполняете gradient, который имеет две остановки в том же положении, чтобы произвести резкое изменение цвета.

+0

Это блестяще, спасибо Ларсу. Существуют ли какие-либо преимущества перед использованием цикла выше или градиента? – user1138966

+0

IMHO код выше более интуитивно понятен, чем цикл/условие. Преимущество градиента состоит в том, что вам не нужен отдельный элемент, но он сделает код более беспорядочным. –

+0

OK Я буду придерживаться того, что у меня есть. еще раз спасибо – user1138966