Javascript: удаление всех событий наведения курсора мыши из объекта
Этот вопрос задает Google charts, но более общий.
Наведение курсора мыши на легенду в моем графике приводит к следующей ошибке:
Uncaught TypeError: не удается прочитать свойство 'x' из null
Я не добавил никаких событий onmouseover и т. д., похоже, что он просто недоволен появлением null
в ряду (когда вы строите два ряда с разными значениями x, Google charts говорит, чтобы добавить пустые точки как null
и построить график с interpolateNull : true
).
Имеет у кого - нибудь еще была такая проблема? Есть ли способ отключить любые события наведения курсора мыши для легенды диаграммы?
Большое спасибо за любой совет, который вы можете дать.Обновление: существует минимальный jsfiddle, демонстрирующий эту ошибку здесь . Похоже, Google charts не любит, когда две точки x и y имеют одинаковые значения.
4 ответа:
Вы можете попытаться остановить соответствующие события мыши от достижения встроенных обработчиков.
Это требует добавления слушателя
mouseover
к легенде диаграммы. Слушатель вызоветevent.stopPropagation()
(и, что удивительно, не должен быть вызван во время фазыcapture
распространения события).Оказывается, что события также прослушиваются, так что остановите и их.
Для меня в Firefox работало следующее:
$('svg > g:first-of-type').bind('mouseover mousemove', function(e) { e.stopPropagation(); });
Я основываю этот ответ на решении, которое я нашел здесь: http://jsfiddle.net/asgallant/6Y8jF/2/
Суть в том, чтобы скрыть легенду Google и создать свою собственную. Во-первых, отключите встроенную легенду, передавlegend: {position: 'none'}
в качестве одного из параметров вchart.draw
.В функции
addDiv
, создающей держатель div для диаграммы, добавьте второй элемент для хранения легенды.function addDiv(parent_id, div_id) { $("#" + parent_id).append('<div id="' + div_id + '" class="chart-chart"></div><ul id="legend_' + div_id + '" class="chart-legend"></ul>'); }
Затем в своей функции
drawChart
постройте легенду:function drawChart(chart, original_table, x_attr, y_attr, x_axis_lbl, y_axis_lbl, x_min_max, div_id) { //pass div_id to this function to be able to get legend element var google_table = allSeriesToGoogleTable(original_table, x_attr, y_attr, ranking_titles); var colors = ["#3366cc","#dc3912","#ff9900"]; //use whatever colors you like var options = {'chartArea':{width:"60%"}, vAxis: {'title': y_axis_lbl}, 'hAxis': {'title': x_axis_lbl}, 'interpolateNulls':true, colors: colors, //use the same colors for the chart and the legend legend: {position: 'none'} //hide default legend }; var legend = $('#legend_' + div_id); for (var i = 1; i < ranking_titles.length; i++) { var li = $('<li></li>'), marker = $('<div class="legendMarker"></div>'), explanation = $('<span></span>'); explanation.text(ranking_titles[i]); // legend marker text marker.css( {backgroundColor: colors[i-1]} ); //marker color li.append(marker).append(explanation); legend.append(li); } if ( ! x_min_max === undefined ) //do something chart.draw( google_table, options ); // add the data table to the chart chart.google_table = google_table; }
Конечно, убедитесь, что вы включите CSS из скрипки, а также:
.chart-chart { float: left; } .chart-legend { margin: 30px 0 0 0; float: left; list-style: none; } div.legendMarker { height: 1em; width: 1em; display: inline-block; margin: 0 5px 0 0; }
Поскольку вы не смогли получить свой код в fiddle, это непроверено,но это должно помочь вам на 99%.
Эта документация может быть очень полезной: https://developers.google.com/chart/interactive/docs/gallery/linechart?hl=en#Configuration_Options
Однако я думаю, что ваш код содержит ошибки. Попробуйте выполнить отладку, начав с базовой конфигурации.
Если элемент имеет более одного события наведения курсора мыши, они должны быть добавлены с помощью
addEventListener
.И если вы хотите удалить события, добавленные с помощью
addEventListener
, вам нужноremoveEventListener
. Но этот метод нуждается в ссылке на функцию listener (см. https://developer.mozilla.org/en-US/docs/DOM/element.removeEventListener).Тогда, может быть, вы могли бы попробовать удалить все прослушиватели событий JavaScript элемента и его потомков?