Echarts图表控件使用总结1(Line,Bar):http://www.cnblogs.com/hanyinglong/p/Echarts.html

1.前言

  a.前两天简单写了一篇在MVC中如何使用Echarts的文章,文章地址:http://www.cnblogs.com/hanyinglong/p/Echarts.html,里面实现了Echart刷新和显示的功能,如图所示:

    

  b.但是今天上班发现遇到了一些问题,也是很细节的问题,那么下面我们就来探讨一下这几种问题的解决方法,如果大家还有什么更好地建议的话,希望大家能够留言。

  c.本人水平有限,难免写出来可能会出现错误,如果大家遇到有问题的地方希望能够留言,我将和你探讨并且更新错误内容。  

  d.下面我将阐述我遇到的两个需求和一个问题,那么针对这些问题的解决方法,如果大家还遇到其它什么需求或者问题,请留言。

2.问题

  a.Echarts开启自动刷新的时候,如果浏览器长时间不关闭或者退出自动刷新程序的网页的时候,如果时间足够长,会发现浏览器会自动关闭,原因是Echart内存没有来得及释放,导致内存溢出。

  b.如果Echarts在开发的时候我们选择既有树状也有线状(图片右上角),那么当我们单击线状查看的时候会发现当程序自动执行的时候就会又回到原始状态。

  c.当我们同时显示好几条数据的时候,单击某个数据会不显示,再单击会显示(图片中间最上面),那么如果我们只想看某一种的话这时候单击剩下最后一种的时候发现程序自动执行刷新又回到原始状态了。

  d.页面缓存的实现,当我们选择20秒刷新,如果关闭浏览器再次打开,又会回到原始状态,故而我们需要考虑解决缓存问题。

3.解决方法

  a.对于内存溢出的解决方法,Echart提供了clear和Dispose方法,在循环刷新之前调用即可解决这个问题

  b.对于问题b的解决方法在上篇文章中已经实现了,思路是:注册ecConfig.EVENT.MAGIC_TYPE_CHANGED事件,当单击的时候读取param.magicType.bar即可读取到用户单击的是什么类型(line,bar,....),然后在发送请求的时候将此类型当做参数传递到后台按照上篇博客的写法即可实现。

  c.对于问题c的解决方法思路如下:

    (1) 注册:ecConfig.EVENT.LEGEND_SELECTED,当单击的时候读取读取到单击的信息之后,存放在缓存中,在下次打开的时候进行处理。

  d.修改比较严重,后端都有修改,如果大家需要使用,请仔细检查。下面附前端JS代码。

  e.上面是本篇博客所有遇到的问题,简要说明一下,JS代码如下,其它代码请参考上篇博客的代码,没有做任何改动。

3.实现代码

  a.公用代码

 var bmscommon = function () { };
bmscommon = {
//处理Ajax请求
ajax: function(options) {
var defaults = {
async: false,
cache: true,
type: "POST",
contentType: "application/json"
};
defaults = $.extend(defaults, options);
//ajax请求
jQuery.ajax({
url: defaults.url,
type: defaults.type,
cache: defaults.cache,
async: defaults.async,
contentType: defaults.contentType,
data: defaults.data,
dataType: "json",
onwait: "正在加载数据,请稍后...",
success: function(result) {
if (defaults.fn) {
defaults.fn.call(result);
}
return result;
}
});
},
/* cookie处理
* common.cookie('name','value',{expires:7,path:'/',domain:'jquery.com',secure:true})
*/
cookie: function(name, value, options) {
if (typeof value != "undefined") {
options = options || {};
if (value === null) {
value = "";
options.expires = -1; //失效
}
var expires = "";
if (options.expires && (typeof options.expires == "number" || options.expires.toUTCString)) {
var date;
if (typeof options.expires == 'number') {
date = new Date();
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
} else {
date = options.expires;
}
expires = ";expires=" + date.toUTCString();
}
var path = options.path ? ";path=" + options.path : "";
var domain = options.domain ? ";domain=" + options.domain : "";
var secure = options.secure ? ";secure" : "";
document.cookie = [name, "=", encodeURIComponent(value), expires, path, domain, secure].join('');
} else {
var cookieValue = null;
if (document.cookie && document.cookie != "") {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == (name + "=")) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
return this;
},
//处理日期
date: function(obj, format, defval) {
var data;
if (/\/Date\((\d+)\)\//gi.test(obj)) {
data = eval(obj.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
} else {
data = new Date(obj);
if (defval != null && data.toDateString() == (new Date(null)).toDateString()) {
return defval;
}
} function formatDate(date, mat) {
var paddNum = function(num) {
num += "";
return num.replace(/^(\d)$/, "0$1");
};
//指定格式字符
var cfg = {
yyyy: date.getFullYear() //年 : 4位
,
yy: date.getFullYear().toString().substring(2) //年 : 2位
,
M: date.getMonth() + 1 //月 : 如果1位的时候不补0
,
MM: paddNum(date.getMonth() + 1) //月 : 如果1位的时候补0
,
d: date.getDate() //日 : 如果1位的时候不补0
,
dd: paddNum(date.getDate()) //日 : 如果1位的时候补0
,
hh: paddNum(date.getHours()) //时
,
mm: paddNum(date.getMinutes()) //分
,
ss: paddNum(date.getSeconds()) //秒
};
mat || (mat = "yyyy-MM-dd");
return mat.replace(/([a-z])(\1)*/ig, function(m) { return cfg[m]; });
} return formatDate(data, format);
}
};

  b.操作Echart插件

 /* 功能:实现读取数据库中的需要监控的数据在前端展示,JS操作Echarts插件
* 创建人:Kencery 创建时间:2015-7-30
* 修改人:Kencery 修改时间:2015-8-6
* 修改人:Kencery 修改时间:2015-8-13
*/ var etaoshi = window.etaoshi || {};
etaoshi.bms = etaoshi.bms || {}; etaoshi.bms.orderInfo = (function() {
var defaults = {
url: "/OrderInfo/ReadDataRefreshChats",
main: "main",
dropDownId: "dropDownId",
btnStopRefresh: "btnStopRefresh",
btnHandRefresh: "btnHandRefresh",
};
var map = {}; //存储临时变量 var initialize = function() {
//第一步:读取选择的刷新时间。
var seconds = bmscommon.cookie("refreshSeconds");
if (seconds) {
$("#" + defaults.dropDownId + " option[value=" + seconds + "]").attr("selected", "selected");
} initializeEchats(); //第二步:调用方法首次刷新结果
setInterValEchart(); //第三步骤:定时执行程序
};
var bindEvent = function() {
$("#" + defaults.dropDownId).on("change", function() { refreshSecondChange(); });
$("#" + defaults.btnStopRefresh).on("click", function() { stopRefresh(); });
$("#" + defaults.btnHandRefresh).on("click", function() { handRefresh(); });
}; var initializeEchats = function() {
bmscommon.ajax({
type: "get",
url: defaults.url,
cache: true,
data: {},
fn: function() {
var defaultMain = document.getElementById(defaults.main);
var $Id = $(defaultMain).attr("id"); //用来给缓存作为标示
var option = getJsonOptions(this, $Id); //处理构造参数
initFillData(option, defaultMain, $Id);
}
});
};
var initFillData = function (option, main, $Id) {
var tempclear = map[$Id + "_id"];
if (tempclear) {
tempclear.clear();
tempclear.dispose();
delete tempclear;
map[$Id + "_id"] = null;
}
var myChart = echarts.init(main); //初始化Echarts图标信息
if (!tempclear) {
map[$Id + "_id"] = myChart;
}
// 为echarts对象加载数据
myChart.setOption(option, true);
//添加事件
myChart.on(echarts.config.EVENT.MAGIC_TYPE_CHANGED, function(param) {
//将信息存放在Cookie缓存中
if (param.magicType.bar) {
bmscommon.cookie($Id + "_selected_magic", "bar", {
expires: 365,
path: '/'
});
} else {
bmscommon.cookie($Id + "_selected_magic", "line", {
expires: 365,
path: '/'
});
}
});
myChart.on(echarts.config.EVENT.LEGEND_SELECTED, function(param) {
var tempcookielegend = {}, selected = param.selected;
$.each(selected, function(i, n) {
if (!n) {
tempcookielegend[i] = false;
}
});
bmscommon.cookie($Id + "_selected_legend", JSON.stringify(tempcookielegend), {
expires: 365,
path: '/'
});
});
};
var setInterValEchart = function() {
map["setInterVal"] = window.setInterval(function () {
initializeEchats();
}, parseInt($("#" + defaults.dropDownId).find("option:selected").text() * 1000));
}; var refreshSecondChange = function() {
bmscommon.cookie("refreshSeconds", $("#" + defaults.dropDownId).val(), {
expires: 365,
path: '/'
});
clearInterval(map["setInterVal"]);
initializeEchats(); //先执行一遍
setInterValEchart(); //在调用定时执行
};
var stopRefresh = function() {
clearInterval(map["setInterVal"]);
};
var handRefresh = function() {
initializeEchats();
}; var getJsonOptions = function(datas, $Id) {
var dataSeriesList = datas.SeriesList;
//最大值,最小值,平均值添加
$.each(dataSeriesList, function(j, n) { //前端处理JS添加最大值和最小值以及平均值。
if (n) {
//添加最大值和最小值
var market = {};
var data1 = [];
var max = {}, min = {};
min.type = 'min';
min.name = '最小值';
data1.push(min);
max.type = 'max';
max.name = '最大值';
data1.push(max);
market.data = data1;
n.markPoint = market;
//平均值
var markLine = {};
var dataAvg = [];
var avg = {};
avg.type = 'average';
avg.name = '平均值';
dataAvg.push(avg);
markLine.data = dataAvg;
n.markLine = markLine;
}
});
//line,bar判断
try {
var type = bmscommon.cookie($Id + "_selected_magic") == null ? "bar" : bmscommon.cookie($Id + "_selected_magic");
$.each(dataSeriesList, function(i, n) {
if (n) {
n.type = type;
}
});
} catch(e) {
} //处理单击显示各种不同图形的控制
try {
datas.selected = JSON.parse(bmscommon.cookie($Id + "_selected_legend"));
if (!datas.selected) {
datas.selected = {};
}
} catch(e) {
} var option = {
title: {
text: '订单号剩余量监控',
},
tooltip: {
show: true,
trigger: 'axis'
},
toolbox: {
show: true,
feature: {
mark: { show: true },
dataView: { show: true, readOnly: false },
magicType: { show: true, type: ['line', 'bar'] },
restore: { show: true },
saveAsImage: { show: true }
}
},
legend: {
data: datas.Legend,
selected: datas.selected
},
calculable: true,
xAxis: [
{
name: datas.XName,
type: 'category',
data: datas.XAxis //所有日期读取
}
],
yAxis: [{
name: '剩余量',
type: 'value',
scale: true,
precision: 2,
splitNumber: 12,
splitArea: { show: true }
}],
series: dataSeriesList
};
return option;
}; return {
init: function(options) {
$.extend(defaults, options || {}); //将options的值赋值给上述对象
initialize(); //初始化信息
bindEvent(); //触发事件
}
};
}());

Echarts图表控件使用总结2(Line,Bar)—问题篇的更多相关文章

  1. Echarts图表控件使用总结1(Line,Bar)

    问题篇(详解):http://www.cnblogs.com/hanyinglong/p/4708337.html 1.前言 a.在系统开发过程中可能会使用到图表控件,一个好的图标控件可以使我们的网站 ...

  2. echart图表控件配置入门(二)常用图表数据动态绑定

    上一节 <echart图表控件配置入门(一)>介绍了echarts图表控件的入门配置,使开发人员可以快速搭建出一个静态的图表.但是在实际开发过程这还是不够的,不可能所有的图表控件都是静态数 ...

  3. 图表控件== 百度 echarts的入门学习

    花了3天的时间 去学习跟试用之前两款的图表控件 hightcharts(商业,人性化,新手非常方便试用,图表少了点) 跟chartjs==>搭配vue更好 控件,整体而言都还可以. http:/ ...

  4. echart图表控件配置入门(一)

    现在主流的web图表控件主要有hightchart.fusionchart.echart: echart作为百度前端部门近期推出的一个基于html5的免费图表控件,以其丰富图表类型和良好的兼容性速度得 ...

  5. ASP.NET Core MVC TagHelper实践HighchartsNET快速图表控件-开源

    ASP.NET Core MVC TagHelper最佳实践HighchartsNET快速图表控件支持ASP.NET Core. 曾经在WebForms上写过 HighchartsNET快速图表控件- ...

  6. 在AngularJS中的使用Highcharts图表控件

    一.Highcharts简介 Highcharts是一款非常好用的前端图表控件,正如其中文网介绍的那样:功能强大.开源.美观.图表丰富.兼容绝大多数浏览器的纯js图表库. 如果你的项目是基于jquer ...

  7. [深入浅出Windows 10]QuickCharts图表控件库解析

    13.4 QuickCharts图表控件库解析     QuickCharts图表控件是Amcharts公司提供的一个开源的图表控件库,这个控件库支持WPF.Silverlight.和Windows等 ...

  8. 图表控件的学习===》hightChart 和 Chartjs的使用

    hightChart : 比较旧的图表控件   商业需要授权 Chartjs 免费开源 刚开始使用了下 hightchart 然后参考示例 建了对应的参数配置的类, 也顺利的集合到后台动态传输.  后 ...

  9. 转:Highcharts图表控件的使用

    摘要 Highcharts图表控件是目前使用最为广泛的图表控件.本文将从零开始逐步为你介绍Highcharts图表控件.通过本文,你将学会如何配置Highcharts以及动态生成Highchart图表 ...

随机推荐

  1. POJ 1451 T9

    T9 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3083   Accepted: 1101 Description Ba ...

  2. 安卓TTS语音合成经验分享(科大讯飞语音+)集成

    应用场景:足浴软件,技师钟房安排调派和队列排序查看,语音播报提醒.老程序是使用双屏显卡,windows系统PC上运行一个无人值守桌面程序.如今安卓机顶盒(WIFI)和MINI电视棒通过HDMI接口和支 ...

  3. BZOJ 1006 [HNOI2008] 神奇的国度(简单弦图的染色)

    题目大意 K 国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即 AB 相互认识,BC 相互认识,CA 相互认识,是简洁高效的.为了巩固三角关系,K 国禁止四边关系,五边关系等 ...

  4. zeromq 测试总结

    总结 测试项目 github (https://github.com/solq360/jmzq) 非常不稳定 pub/sub 模式 30W压测丢了27W条消息,官方没有给出任何的发送状态供业务层处理 ...

  5. MFC设置静态文本框,编辑框等控件背景和字体颜色

    在MFC类库提供了CWnd::OnCtlColor函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重载WM_CTLCOLOR消息的响应函数.此函数的原型:afx_msg HBRUSH OnC ...

  6. HTML5[8]: 图文混排,图片与文字居中对齐

    <img src="image.png"><span>999</span> img { /* ...  */ vertical-align: t ...

  7. 破解android手机图形锁

    安卓手机的图形锁包括3*3,4*4,5*5的点阵,按次序连接数个点从而达到锁定/解锁的功能.以3*3为例,最少需要连接4个点,最多能连接9个点.在我们进行绘制图形的过程中,每选中这9个点中的一个点,实 ...

  8. js中的包装对象。

    我们都知道在js中普通类型的变量是没有属性和方法的,然后有时却并不是这样. var str = "努力,奋斗"; console.log(str.length); var num ...

  9. Windows7 x64 系统下安装 Nodejs 并在 WebStorm 9.0.1 下搭建编译 LESS 环境

    1. 打开Nodejs官网http://www.nodejs.org/,点“DOWNLOADS”,点64-bit下载“node-v0.10.33-x64.msi”. 2. 下载好后,双击“node-v ...

  10. IconVault – 创建自定义图标字体的神器推荐

    图标字体简单来说就是外观呈现为图标的字体,同时具有矢量图形的特征,在不同的设备上使用图标的时候就不用加载不同尺寸的图片文件,能够减少 HTTP 请求数,提高页面加载速度. IconVault 这款在线 ...