Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 580|回复: 0

ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave由于鼠标移动速度过快导致问题解决办法

[复制链接]
  • TA的每日心情
    奋斗
    2024-6-6 10:50
  • 签到天数: 750 天

    [LV.10]以坛为家III

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    706216
    发表于 2021-6-27 22:36:35 | 显示全部楼层 |阅读模式

    记录两个项目开发中遇到的问题,一个是ECharts外部调用保存为图片操作,一个是workflow工作流连接曲线onmouseenter和onmouseleave事件由于鼠标移动过快触发问题。

    一、外部按钮调用ECharts图表的保存为图片操作

    最近使用ECharts库绘制图表,依据需求希望可以把图表设置的保存为图片操作可以在图表外部调用,主要是希望可以和项目之前的下载图片操作界面保持一致。然后上网找了一些方法,看了看也没遇到一个可以满意的。后来,突然想到了echart开放了源码,可以看看源码,找到下载的方法,然后调用不就可以了(可能是我技术忒次,看了看不只到如何直接调用方法,所以把源方法copy下来,改了改,只需要传递图表的容器id即可)

    echart图表示例(工具栏中有下载图片按钮)

    附上代码记录一下

    //传递图表容器id
    function
    downloadImpByChart(chartId){ var myChart = echarts.getInstanceByDom(document.getElementById(chartId)); var url = myChart.getConnectedDataURL({ pixelRatio: 5,  //导出的图片分辨率比率,默认是1 backgroundColor: '#fff',  //图表背景色 excludeComponents:[  //保存图表时忽略的工具组件,默认忽略工具栏 'toolbox' ], type:'png'  //图片类型支持png和jpeg }); var $a = document.createElement('a'); var type = 'png'; $a.download = myChart.getOption().title[0].text + '.' + type; $a.target = '_blank'; $a.href = url; // Chrome and Firefox if (typeof MouseEvent === 'function') { var evt = new MouseEvent('click', { view: window, bubbles: true, cancelable: false }); $a.dispatchEvent(evt); } // IE else { var html = '' + '<body style="margin:0;">' + '<img src="' + url + '" style="max-width:100%;" title="' + myChart.getOption().title[0].text + '" />' + '</body>'; var tab = window.open(); tab.document.write(html); } };

    这样,我们就可以不使用它自带的下载操作了,就可以在外部自定义按钮、超链接,直接调用上面的方法就可以实现外部调用保存图片功能了。

    二、onmouseenter和onmouseleave移动速度过快导致不能正确的时机触发事件机制

      上图说明一下

    希望鼠标在曲线上移动时不仅可以高亮展示曲线,还要在鼠标位置增加剪刀图标,按下剪刀时可以删除曲线。之前就直接在曲线上使用的mouseener和mouseleave方法,然后鼠标在多条曲线上快速移动时,就会出现诸多问题(剪刀不会在光标离开时消失,多条曲线都变为高亮效果)。试了多加上一些逻辑判定和换用mouseover和mouseout方法均不管用。后来突然想到,可以使用mousemove方法。判定鼠标是否在剪刀图表的区域范围内,若在则高亮该条曲线,不再,则所有曲线恢复默认样式。然后居然成功了。困扰了一整天的问题终于解决了。(由于mousemove在鼠标移动时需要不断的去监听和触发事件,所以最好可以有一个状态标识表明在该状态在再去调用高亮曲线和绘制剪刀的方法。图上的调用时机是,当鼠标进入曲线时,设定一个全局变量为true,此后的mousemove操作根据该变量判定

    记录一下部分关键代码

    鼠标就进入高亮及绘制剪刀图表

     $(document).on("mouseenter","svg .curve",function(e){
    
                //每次进入后都将恢复成原始状态
                $("svg .node").each(function(){
                    this.setAttribute("opacity","1");
                });
                $.each(relation.links,function(l,link){
                    var in_node_id=link.input.nodeId;
                    var out_node_id=link.output.nodeId;
                    $("#"+out_node_id+link.output.pointName+in_node_id+link.input.pointName)[0].setAttribute("opacity","1");
                    $("#"+out_node_id+link.output.pointName+in_node_id+link.input.pointName).attr("class","curve");
                });
    
                //编辑状态下需要显示可操作图标
                if(args.state=="edit"){
                    del_Curve.ref_Curve=this;
                    del_Curve.has_del_curve=true;
                    if($("#del-curve-icon").length>0){
                        $("#del-curve-icon").css({
                            position:"absolute",
                            top: e.pageY-obj.offset().top-10,
                            left: e.pageX-obj.offset().left-10,
                            color:"#ff0000"
                        }).show();
                    }else{
                        var del_icon=$("<i id='del-curve-icon' class='fa fa-scissors'></i>").css({
                            position:"absolute",
                            top: e.pageY-obj.offset().top-10,
                            left: e.pageX-obj.offset().left-10,
                            color:"#ff0000",
                            fontSize:"20px"
                        });
                        obj.parent().append(del_icon);
                    }
                    del_Curve.xAxis=$("#del-curve-icon").offset().left;
                    del_Curve.yAxis=$("#del-curve-icon").offset().top;
                }
                //然后高亮当前曲线
                if($(this).attr("start")!=undefined && $(this).attr("end")!=undefined){
                    //设置透明度
                    $("svg .node").each(function(){
                        this.setAttribute("opacity","0.1");
                    });
                    $.each(relation.links,function(l,link){
                        var in_node_id=link.input.nodeId;
                        var out_node_id=link.output.nodeId;
                        $("#"+out_node_id+link.output.pointName+in_node_id+link.input.pointName)[0].setAttribute("opacity","0.1");
    
                    });
    
                    obj.children("g").eq(0).children("g").eq(0).before($(this));
                    $(this).attr("class","curve curve-hover");
                    var in_node=$("#"+$(this).attr("start")).children("g").eq(0).children("circle").eq(1);
                    in_node.attr("class",in_node.attr("class")+" node-hover");
                    $("#"+$(this).attr("start"))[0].setAttribute("opacity","1");
                    var out_node=$("#"+$(this).attr("end")).children("g").eq(0).children("circle").eq(1);
                    out_node.attr("class",out_node.attr("class")+" node-hover");
                    $("#"+$(this).attr("end"))[0].setAttribute("opacity","1");
                }
    
            });

    移动鼠标判定触发操作

    $(document).on("mousemove",function(e){if(del_Curve.has_del_curve){
                    var del_icon_width=$("#del-curve-icon").width();
                    var del_icon_height=$("#del-curve-icon").height()
              //判定当前光标位置,若不在剪刀图表区域内则恢复默认样式
    if(e.pageX<del_Curve.xAxis || e.pageX>(del_Curve.xAxis+del_icon_width) || e.pageY<del_Curve.yAxis || e.pageY>(del_Curve.yAxis+del_icon_height)){ del_Curve.has_del_curve=false; $("svg .node").each(function(){ this.setAttribute("opacity","1"); }); $.each(relation.links,function(l,link){ var in_node_id=link.input.nodeId; var out_node_id=link.output.nodeId; $("#"+out_node_id+link.output.pointName+in_node_id+link.input.pointName)[0].setAttribute("opacity","1"); $("#"+out_node_id+link.output.pointName+in_node_id+link.input.pointName).attr("class","curve"); }); $(del_Curve.ref_Curve).attr("class","curve"); var in_node=$("#"+$(del_Curve.ref_Curve).attr("start")).children("g").eq(0).children("circle").eq(1); in_node.attr("class",in_node.attr("class").replace("node-hover","").trim()); var out_node=$("#"+$(del_Curve.ref_Curve).attr("end")).children("g").eq(0).children("circle").eq(1); out_node.attr("class",out_node.attr("class").replace("node-hover","").trim()); $("#del-curve-icon").hide(); } } })

    okay,其实工作流的问题,如果单单只是高亮曲线,mouseenter和mouseleave的效果就足够了。不过示例中,需要在曲线上覆盖一个剪刀图标,这就会跟原来曲线的mouseenter和mouseleave有冲突。因为删除曲线的触发元素是剪刀图标。

    以上,记录两个开发中遇到的问题,方便以后可以直接拿来使用或明白换个方式解决问题一些冲突问题。

    感谢阅读。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-17 22:24 , Processed in 0.097512 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表