快速移動(dòng)鼠標(biāo)觸發(fā)問(wèn)題及解決方法(ECharts外部調(diào)用保存為圖片操作及工作流接線mouseenter和mouseleave)
記錄兩個(gè)項(xiàng)目開(kāi)發(fā)中遇到的問(wèn)題,一個(gè)是ECharts外部調(diào)用保存為圖片操作,一個(gè)是workflow工作流連接曲線onmouseenter和onmouseleave事件由于鼠標(biāo)移動(dòng)過(guò)快觸發(fā)問(wèn)題。
一、外部按鈕調(diào)用ECharts圖表的保存為圖片操作
最近使用ECharts庫(kù)繪制圖表,依據(jù)需求希望可以把圖表設(shè)置的保存為圖片操作可以在圖表外部調(diào)用,主要是希望可以和項(xiàng)目之前的下載圖片操作界面保持一致。然后上網(wǎng)找了一些方法,看了看也沒(méi)遇到一個(gè)可以滿(mǎn)意的。后來(lái),突然想到了echart開(kāi)放了源碼,可以看看源碼,找到下載的方法,然后調(diào)用不就可以了(可能是我技術(shù)忒次,看了看不只到如何直接調(diào)用方法,所以把源方法copy下來(lái),改了改,只需要傳遞圖表的容器id即可)
echart圖表示例(工具欄中有下載圖片按鈕)
附上代碼記錄一下
//傳遞圖表容器idfunction downloadImpByChart(chartId){ var myChart = echarts.getInstanceByDom(document.getElementById(chartId)); var url = myChart.getConnectedDataURL({ pixelRatio: 5, //導(dǎo)出的圖片分辨率比率,默認(rèn)是1 backgroundColor: '#fff', //圖表背景色 excludeComponents:[ //保存圖表時(shí)忽略的工具組件,默認(rèn)忽略工具欄 'toolbox' ], type:'png' //圖片類(lèi)型支持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); } };
這樣,我們就可以不使用它自帶的下載操作了,就可以在外部自定義按鈕、超鏈接,直接調(diào)用上面的方法就可以實(shí)現(xiàn)外部調(diào)用保存圖片功能了。
二、onmouseenter和onmouseleave移動(dòng)速度過(guò)快導(dǎo)致不能正確的時(shí)機(jī)觸發(fā)事件機(jī)制
上圖說(shuō)明一下
希望鼠標(biāo)在曲線上移動(dòng)時(shí)不僅可以高亮展示曲線,還要在鼠標(biāo)位置增加剪刀圖標(biāo),按下剪刀時(shí)可以刪除曲線。之前就直接在曲線上使用的mouseener和mouseleave方法,然后鼠標(biāo)在多條曲線上快速移動(dòng)時(shí),就會(huì)出現(xiàn)諸多問(wèn)題(剪刀不會(huì)在光標(biāo)離開(kāi)時(shí)消失,多條曲線都變?yōu)楦吡列Ч?。試了多加上一些邏輯判定和換用mouseover和mouseout方法均不管用。后來(lái)突然想到,可以使用mousemove方法。判定鼠標(biāo)是否在剪刀圖表的區(qū)域范圍內(nèi),若在則高亮該條曲線,不再,則所有曲線恢復(fù)默認(rèn)樣式。然后居然成功了。困擾了一整天的問(wèn)題終于解決了。(由于mousemove在鼠標(biāo)移動(dòng)時(shí)需要不斷的去監(jiān)聽(tīng)和觸發(fā)事件,所以最好可以有一個(gè)狀態(tài)標(biāo)識(shí)表明在該狀態(tài)在再去調(diào)用高亮曲線和繪制剪刀的方法。圖上的調(diào)用時(shí)機(jī)是,當(dāng)鼠標(biāo)進(jìn)入曲線時(shí),設(shè)定一個(gè)全局變量為true,此后的mousemove操作根據(jù)該變量判定)
記錄一下部分關(guān)鍵代碼
鼠標(biāo)就進(jìn)入高亮及繪制剪刀圖表
$(document).on("mouseenter","svg .curve",function(e){ //每次進(jìn)入后都將恢復(fù)成原始狀態(tài) $("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"); }); //編輯狀態(tài)下需要顯示可操作圖標(biāo) 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; } //然后高亮當(dāng)前曲線 if($(this).attr("start")!=undefined && $(this).attr("end")!=undefined){ //設(shè)置透明度 $("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"); } });
移動(dòng)鼠標(biāo)判定觸發(fā)操作
$(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() //判定當(dāng)前光標(biāo)位置,若不在剪刀圖表區(qū)域內(nèi)則恢復(fù)默認(rèn)樣式 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,其實(shí)工作流的問(wèn)題,如果單單只是高亮曲線,mouseenter和mouseleave的效果就足夠了。不過(guò)示例中,需要在曲線上覆蓋一個(gè)剪刀圖標(biāo),這就會(huì)跟原來(lái)曲線的mouseenter和mouseleave有沖突。因?yàn)閯h除曲線的觸發(fā)元素是剪刀圖標(biāo)。
- 淺談JQ中mouseover和mouseenter的區(qū)別
- 關(guān)于事件mouseover ,mouseout ,mouseenter,mouseleave的區(qū)別
- Jquery利用mouseenter和mouseleave實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)彈出層且可以點(diǎn)擊
- 為非IE瀏覽器添加mouseenter,mouseleave事件的實(shí)現(xiàn)代碼
- 跨瀏覽器的 mouseenter mouseleave 以及 compareDocumentPosition的使用說(shuō)明
- javascript 兼容FF的onmouseenter和onmouseleave的代碼
- javascript中mouseenter與mouseover的異同
相關(guān)文章
jquery 最簡(jiǎn)單易用的表單驗(yàn)證插件
jquery 最簡(jiǎn)單易用的表單驗(yàn)證插件,不論是從應(yīng)用還是學(xué)習(xí)插件的寫(xiě)法都是值得一看的。2010-02-02jquery實(shí)現(xiàn)清新實(shí)用的網(wǎng)頁(yè)菜單效果
這篇文章主要介紹了jquery實(shí)現(xiàn)清新實(shí)用的網(wǎng)頁(yè)菜單效果,涉及jquery通過(guò)鼠標(biāo)事件控制頁(yè)面元素的動(dòng)態(tài)隱藏與顯示實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08jquery offset函數(shù)應(yīng)用實(shí)例
點(diǎn)擊一個(gè)按鈕,然后在按鈕的下方顯示一個(gè)div,當(dāng)按鈕位于角落時(shí),div的位置設(shè)定就需要調(diào)整,不然,div將顯示不完全.我打算使用offset()方法實(shí)現(xiàn)此功能2012-11-11web開(kāi)發(fā)人員學(xué)習(xí)jQuery的6大理由及jQuery的優(yōu)勢(shì)介紹
jQuery是一個(gè)用來(lái)簡(jiǎn)化HTML客戶(hù)端開(kāi)發(fā)的JS(JavaScrip)庫(kù),它支持HTML DOM處理,同時(shí)還融合了部分HTML和CSS2013-01-01jQuery 選擇方法及$(this)用法實(shí)例分析
這篇文章主要介紹了jQuery 選擇方法及$(this)用法,結(jié)合實(shí)例形式分析了jQuery 選擇方法及$(this)相關(guān)使用技巧與注意事項(xiàng),需要的朋友可以參考下2020-05-05jQuery實(shí)現(xiàn)簡(jiǎn)單全選框
這篇文章主要為大家詳細(xì)介紹了jQuery實(shí)現(xiàn)簡(jiǎn)單全選框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09一個(gè)很簡(jiǎn)單的jquery+xml+ajax的無(wú)刷新樹(shù)結(jié)構(gòu)(無(wú)css,后臺(tái)是c#)
一個(gè)很簡(jiǎn)單的jquery+xml+ajax的無(wú)刷新樹(shù)結(jié)構(gòu)(無(wú)css,后臺(tái)是c#)2010-06-06jquery二級(jí)導(dǎo)航內(nèi)容均分的原理及實(shí)現(xiàn)
頭部導(dǎo)航二級(jí)導(dǎo)航有些內(nèi)容太長(zhǎng),一列的話太過(guò)難看,就要分成兩列,要做到按塊盡量均分,排列順序沒(méi)有限制2013-08-08Jquery實(shí)現(xiàn)多個(gè)表格的全選復(fù)選框功能方式
這篇文章主要介紹了Jquery實(shí)現(xiàn)多個(gè)表格的全選復(fù)選框功能方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12