快速移動(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è)可以滿意的。后來(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' //圖片類型支持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)楦吡列ЧT嚵硕嗉由弦恍┻壿嬇卸ê蛽Q用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 要點(diǎn)歸納(三) jQuery中的事件和動(dòng)畫(huà)(上:事件篇)
鋒利的jQuery 要點(diǎn)歸納 jQuery中的事件和動(dòng)畫(huà)(上:事件篇)2010-03-03
通過(guò)XMLHttpRequest和jQuery實(shí)現(xiàn)ajax的幾種方式
AJAX大家已經(jīng)都知道了,是為了實(shí)現(xiàn)異步通訊,提高用戶體驗(yàn)度,而將很多舊知識(shí)(XML,DOM,JavaScript,HTML,Jquery,Css……)重新融合的一個(gè)新的知識(shí)框架。而,XMLHttpRequest對(duì)象則是其中的重重之中,本篇文章主要給大家介紹通過(guò)XMLHttpRequest和jQuery實(shí)現(xiàn)ajax的幾種方式2015-08-08
jQuery制作仿Mac Lion OS滾動(dòng)條效果
本文是通過(guò)nanoscrollerjs簡(jiǎn)單實(shí)現(xiàn)Mac OS 系統(tǒng)滾動(dòng)條效果特效,以及本插件的使用方法和參數(shù),非常不錯(cuò),這里推薦給大家。2015-02-02
jQuery實(shí)現(xiàn)為圖片添加鏡頭放大效果的方法
這篇文章主要介紹了jQuery實(shí)現(xiàn)為圖片添加鏡頭放大效果的方法,提供了四種放大鏡效果供大家選擇使用,并附有完整的源碼下載地址,需要的朋友可以參考下2015-06-06
jquery實(shí)現(xiàn)聯(lián)想詞搜索框和搜索結(jié)果分頁(yè)的示例
今天小編就為大家分享一篇jquery實(shí)現(xiàn)聯(lián)想詞搜索框和搜索結(jié)果分頁(yè)的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
jQuery讓控件左右移動(dòng)的三種實(shí)現(xiàn)方法
常用的方法就是把控件的CSS position屬性設(shè)置為relative或 absolute,大家也可以學(xué)習(xí)下本文提供的其他方法2013-09-09
jquery圖片放大功能簡(jiǎn)單實(shí)現(xiàn)
圖片放大在某些例如商品細(xì)節(jié)放大圖比較常見(jiàn),本文寫(xiě)了一個(gè)圖片放大的示例適合日常應(yīng)付,有需求的朋友可以參考下2013-08-08
MultiSelect左右選擇控件的設(shè)計(jì)與實(shí)現(xiàn)介紹
由于項(xiàng)目中用到左右選擇的控件,網(wǎng)上找了一些相關(guān)的實(shí)現(xiàn),基本上有兩個(gè):1、基于JQuery UI的控件2、某個(gè)兄弟手寫(xiě)的一個(gè)控件,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06

