Javascript:从对象中删除所有鼠标悬停事件

Javascript:从对象中删除所有鼠标悬停事件,javascript,google-visualization,Javascript,Google Visualization,这个问题问的是谷歌图表,但更一般。 我的图表中图例的鼠标悬停会出现以下错误: 未捕获的TypeError:无法读取null的属性“x” 我没有添加任何“onmouseover”事件等,它似乎只是对序列中出现的null不满意(当你用不同的x值绘制两个序列时,谷歌图表说添加空点作为null并用interpolutenull:true进行绘制) 还有其他人有这个问题吗?有没有办法禁用图表图例的鼠标悬停事件 非常感谢你给我的建议 更新:。谷歌图表似乎不喜欢两个x点和y点具有完全相同的值。此文档可能非常有

这个问题问的是谷歌图表,但更一般。

我的图表中图例的鼠标悬停会出现以下错误:

未捕获的TypeError:无法读取null的属性“x”

我没有添加任何“onmouseover”事件等,它似乎只是对序列中出现的
null
不满意(当你用不同的x值绘制两个序列时,谷歌图表说添加空点作为
null
并用
interpolutenull:true
进行绘制)

还有其他人有这个问题吗?有没有办法禁用图表图例的鼠标悬停事件

非常感谢你给我的建议


更新:。谷歌图表似乎不喜欢两个x点和y点具有完全相同的值。

此文档可能非常有用:


然而,我认为您的代码包含错误。试着从一个基本配置开始调试。

我的答案是基于我在这里找到的一个解决方案:

要点是隐藏谷歌的传奇,建立自己的传奇。首先,通过将
legend:{position:'none'}
作为
chart.draw的选项之一传入,禁用内置图例

在为图表创建holder div的
addDiv
函数中,添加第二个元素来保存图例

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>');
}    
当然,还要确保包括小提琴中的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;
}

由于您无法将代码放入FIDLE,因此这是未经测试的,但它应该可以让您达到99%的效果。

如果一个元素有多个鼠标悬停事件,则必须使用
addEventListener
添加它们

如果要删除使用
addEventListener
添加的事件,则需要
removeEventListener
。但是此方法需要对侦听器函数的引用(请参阅)


然后,您可以尝试

您可以尝试阻止适当的鼠标事件到达内置处理程序

这需要在图表的图例中添加一个
mouseover
侦听器。 监听器将调用
event.stopPropagation()
(令人惊讶的是,在事件传播的
capture
阶段不需要触发)

原来
mousemove
事件也在被监听,所以也要停止它们

以下内容在Firefox上对我很有用:

$('svg > g:first-of-type').bind('mouseover mousemove', function(e) { e.stopPropagation(); });

如果你能提供一个(),我们可能会帮助你。顺便说一句,也在这里发布代表性代码,使问题尽可能独立,以便将来的访问者使用。@DavidThomas我不确定如何允许使用JSFIDLE上载我的XML数据文件,所以我只是在这里弹出了它:请注意,这个版本有mouseover事件,但即使没有它们,只要鼠标悬停在图例上,它就会崩溃。我没有收到任何错误或崩溃,Chrome v21 Ubuntu。@dennmat你用鼠标悬停在第一个图形的图例上了吗?如果你这样做并检查控制台,我会得到描述的错误(我刚刚在Chrome 24.0.1312.69 Ubuntu上试用过)。@Oliver啊,我知道了,我确实收到了错误,抱歉,我以为它出现在图表上而不是图例上。当你只在页面上放置一个图表时会发生什么?请查看更新的JSFIDLE。。。显然,谷歌图表崩溃时,有一个重复点…+1伟大的JSFIDLE,可能是最好的答案;但是,如果可以保留原始Google渲染的图例,尽管这会更好,因为您的示例显示了图形中的一些重叠。。。我已经编辑了(编辑中的JSFIDLE链接)以显示最小的错误(没有您的解决方案)。那么,您能在绘制图表之前预处理数据以删除此类重复项吗?太好了。我更新为使用
$('#'+chart_div_id+'>div>div>svg>g:first of type')
,因为我的real(非jsfiddle)示例有多个图表)。这在不支持svg但支持vml的浏览器上不起作用,因此,如果这对您很重要,您应该在可能的情况下更新以包含该标记。注意:事件列表应扩展为
mouseover mousemove mousedown mouseup click dblclick
,以防止因鼠标单击而崩溃。
$('svg > g:first-of-type').bind('mouseover mousemove', function(e) { e.stopPropagation(); });