如何将切片拉出但禁用进一步拉出切片更改

时间:2017-12-29 20:46:50

标签: javascript amcharts

切片拉动可以轻松切换为全部或全部。我正在寻找一种拉出切片的方法,但不允许任何进一步切片。

示例:http://jsfiddle.net/4zg3hmn8/1/

clickSlice上添加一个可以防止默认,停止传播或返回false的侦听器不起作用:clickSlice事件在触发这些从属事件之前被触发。

使用clickSlice听众:http://jsfiddle.net/4zg3hmn8/2/

更多挖掘表明被触发的事件是mouseup,后者又调用clickSlice方法来解释从属事件行为。不幸的是,在mouseup上添加一个监听器对图表没有任何影响。

使用mouseup听众:http://jsfiddle.net/4zg3hmn8/3/

该事件被添加到私有javascript对象而非DOM元素上,因此我无法找到通过Javascript删除的方法(可以使用Chrome开发工具轻松删除)。

那怎么解决?

2 个答案:

答案 0 :(得分:1)

调用AmCharts.makeChart时,传入的配置对象用于扩展基本的默认图表对象。操作这个,我们可以传入基础对象中使用的addEventListener方法的副本,并有效地覆盖它,删除我们不想要的部分:

...
"startDuration": 0,
"valueField": "litres",
"titleField": "country",
"pulledField": "isPulled",
"balloon": {
   "fixedPosition": true
},
"addEventListeners": function(a, b) {
   var c = this
   a.mouseover(function(a) {
      c.rollOverSlice(b, !0, a)
   }).mouseout(function(a) {
      c.rollOutSlice(b, a)
   }).touchend(function(a) {
      c.rollOverSlice(b, a)
   }).mouseup(function(a) {
      alert('ah ah ah... didn\'t say the magic word!')
   }).contextmenu(function(a) {
      c.handleRightClick(b, a)
   })
},
...

使用mouseup听众:http://jsfiddle.net/4zg3hmn8/4/

答案 1 :(得分:1)

不推荐覆盖未记录的内部方法和事件,因为它可能导致未定义的行为。如果您只想保留默认切片,则可以使用clickSlice事件再次致电clickSlice,取消用户的初始点击。您需要设置自定义属性以告知事件忽略手动clickSlice调用,但是:

  "listeners": [{
    event: 'clickSlice',
    method: function(e) {
      if (!e.dataItem.ignore) {
        e.dataItem.ignore = true; //prevent infinite loop
        e.chart.clickSlice(e.dataItem.index); //call clickSlice to cancel out the user's click
        e.dataItem.ignore = false; //reset the ignore flag
      }
    },
  }],

更新了小提琴:http://jsfiddle.net/4zg3hmn8/5/