echarts力导向图区分鼠标点击事件与拖拽事件(angularjs)

  • Post author:
  • Post category:其他


使用echarts的力导向图做了一个知识图谱,要求点击节点的时候,把节点的数据作为关键词搜索。知识图谱,以前没做过,也不知道用什么好,百度了一下看到有人说用echarts可以做,然后就用了echarts,后来发现,拖拽节点也会触发点击事件。不知道怎么实现echarts拖拽的时候不触发点击事件,就用了这种办法。

先放一个javascript中区分鼠标单击和拖动事件的链接:

http://blog.csdn.net/aitangyong/article/details/41006877

var timmerHandle = null;  
var isDrag = false;  
var isClick = false;
myChart.on("click", function (param){               
    setTimeout(function(){
        if(isClick && param.dataType == "node"){
            console.log("点击了节点");
        }
    },500);
});
myChart.on("mousedown", function (param){   
    //因为mouseDownFun每次都会调用的,在这里重新初始化这个变量  
    isDrag = false;  
    //延迟100ms  
    timmerHandle = setTimeout(setDragTrue,200);  
});
myChart.on("mouseup", function (param){   
    if (!isDrag){  
        //先把doMouseDownTimmer清除,不然200毫秒后setGragTrue方法还是会被调用的  
        clearTimeout(timmerHandle);   
        console.log("mouse up.");  
        isClick = true;
    }else{  
        isDrag = false;  
        console.log("draging over."); 
        isClick = false; 
    }             
});
function setDragTrue()  {  
    isDrag = true;  
}  

以下是完整代码:

<div id="map" mapping-charts webkit-dep="webkitDep"></div>
Module.directive("mappingCharts",function(){
    return {
        restrict:'ACE',
        scope:false,
        template:'<div style="height:600px;" webkit-dep="webkitDep"></div>',
        replace:false,
        link:function($scope,element,attrs,controller){
            var myChart = echarts.init(element.find('div')[0]);
            var webkitDep = attrs.webkitDep;
            var option;
            var timmerHandle = null;  
            var isDrag = false;  
            var isClick = false;
            $scope.$watch(webkitDep, function(v){
                if(v){
                    option = {  
                        legend: {  
                            // data: ['人物关系']//此处的数据必须和关系网类别中name相对应  
                            x: 'left',//图例位置
                            //图例的名称,这里返回短名称,即不包含第一个,当然你也可以包含第一个,这样就可以在图例中选择主干人物
                            data: $scope.webkitDep.categories.map(function (a) {
                                    return a.name;
                                })
                        },  
                        series: [{  
                            type: 'graph',  
                            layout: 'force',  
                            // animation: false,  
                            label: {  
                                normal: {  
                                    show:true,  
                                    position: 'right',
                                    //回调函数,你期望节点标签上显示什么
                                    formatter: function(params){
                                        // return params.name;
                                        var newParamsName = "";
                                        var paramsNameNumber = params.name.length;
                                        var provideNumber = 6;
                                        var rowNumber = Math.ceil(paramsNameNumber / provideNumber);
                                        if (paramsNameNumber > provideNumber) {
                                            for (var p = 0; p < rowNumber; p++) {
                                                var tempStr = "";
                                                var start = p * provideNumber;
                                                var end = start + provideNumber;
                                                if (p == rowNumber - 1) {
                                                    tempStr = params.name.substring(start, paramsNameNumber);
                                                } else {
                                                    if(p > 0){
                                                        tempStr = params.name.substring(start, end-1) + "...";
                                                        newParamsName += tempStr;
                                                        break;
                                                    }else{
                                                        tempStr = params.name.substring(start, end) + "\n";
                                                    }
                                                }
                                                newParamsName += tempStr;
                                            }

                                        } else {
                                            newParamsName = params.name;
                                        }
                                        return newParamsName
                                    },
                                }  
                            },
                            draggable: true,
                            data: $scope.webkitDep.nodes.map(function (node, idx) {  
                                node.id = idx;  
                                return node;  
                            }),  
                            categories: $scope.webkitDep.categories,  
                            force: {  
                                gravity:0.03,
                                layoutAnimation:true,
                                // xAxisIndex : 0, //x轴坐标 有多种坐标系轴坐标选项
                                // yAxisIndex : 0, //y轴坐标
                                edgeLength: 55,//连线的长度  
                                repulsion: 150  //子节点之间的间距  
                            },  
                            symbolSize:20,  
                            edges: $scope.webkitDep.links  
                        }]   
                    };  
                    myChart.setOption(option); 
                }
            });
            myChart.on("click", function (param){               
                setTimeout(function(){
                    if(isClick && param.dataType == "node"){//点击线是不能搜索的,因此判断触发点击事件的数据是否是节点
                        $("input[name=keyword]").val(option.series[0].data[param.dataIndex].name);
                        $rootScope.goSearchPage();
                    }
                },500);
            });
            myChart.on("mousedown", function (param){   
                //因为mouseDownFun每次都会调用的,在这里重新初始化这个变量  
                isDrag = false;  
                //延迟100ms  
                timmerHandle = setTimeout(setDragTrue,200);  
            });
            myChart.on("mouseup", function (param){   
                if (!isDrag){  
                    //先把doMouseDownTimmer清除,不然200毫秒后setGragTrue方法还是会被调用的  
                    clearTimeout(timmerHandle);   
                    console.log("mouse up.");  
                    isClick = true;
                }else{  
                    isDrag = false;  
                    console.log("draging over."); 
                    isClick = false; 
                }             
            });
            function setDragTrue()  {  
                isDrag = true;  
            }  
        }
    }
});

大佬们又更好的办法请不吝赐教!



版权声明:本文为qq_28259083原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。