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. asp.net MVC之 自定义过滤器(Filter)

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  2. Oracle数据库入门——如何根据物化视图日志快速刷新物化视图

    Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构:SQL& ...

  3. 跟随标准与Webkit源码探究DOM -- 获取元素之getElementById

    按照ID获取元素 -- getElementById 标准 DOM 1,定义在HTMLDocument Interface 中,原型Element getElementById(in DOMStrin ...

  4. SQL1159 Initialization error with DB2 .NET Data Provider, reason code 7(问题补充)

    SQL1159 Initialization error with DB2 .NET Data Provider, reason code 7 需要注册GAC,修改注册表 IBM官方方案: http: ...

  5. CGContext 的一些工具方法

    /* *设置虚线 *param context CGContext *param context CGContext *param lineDashLengths 如: const CGFloat l ...

  6. rspec+rest-client测试第三方web service

    如果你手工测试Restful 服务将会是一件非常单调乏味的事情.当然,目前有一些浏览器插件可以通过可视化的界面帮助你手工测试,例如postman.rest console,但是每次系统版本更新,你都需 ...

  7. Linux 下 Shell 命令的分类及用法

    当你打算真正操纵好你的 Linux 系统,没有什么能比命令行界面更让你做到这一点.为了成为一个 Linux 高手,你必须能够理解 Shell命令的不同类型,并且会在终端下正确的使用它们. 在 Linu ...

  8. [Git] Git 常用技巧

    版本对比 1. 对比两个 COMMIT git diff <commit> <commit> 2. 对比 COMMIT 和父 COMMIT git diff <commi ...

  9. 个人对joomla3.2x和joomla2.5X浅薄看法

    很久没有写joomla文章了,发现想写的东西还是挺多的,后面抽时间补回来,其实更多还是php的一些东西.joomla3.0以后系统改变挺大,后台都是用bootstrap作为主题,个人对这个无爱,因为他 ...

  10. 【转载】两个排序数组的中位数 / 第K大元素(Median of Two Sorted Arrays)

    转自 http://blog.csdn.net/zxzxy1988/article/details/8587244 给定两个已经排序好的数组(可能为空),找到两者所有元素中第k大的元素.另外一种更加具 ...