阿三给的fusioncharts在做图标什么的确实方便,由于项目需要,一起谢了个插件。方便使用,就写个简单的DEMO了。
在开发之前的去阿三的官网下载fusioncharts的js了,以前他是基于swf的,现在h5时代了,阿三的牛逼xx的。
开发jquery插件的自然的用闭包了,然后使用的传入实体信息。还得有默认的时的信息。
(function($) {
/**
* 初始化操作
*/
function init(dom, options) {
if(!$(dom).data("options")) {
$(dom).data("options",options);
}
// 填充 label、seriesname数据(数据库查询都是code,需要替换成文本格式)
$(dom).data("label", options.labelConvertor);
$(dom).data("seriesname", options.seriesnameConvertor);
if(options.ajaxLabel) { // 替换 label(如果是基于数据库的,那就查库在替换)
convertMarked(dom, "label", options.ajaxLabel);
}
if(options.ajaxSeriesname) { // 替换 seriesname(如果是基于数据库的,那就查库在替换)
convertMarked(dom, "seriesname", options.ajaxSeriesname);
}
requestData(dom);
}
/**
* Ajax 获取替换对象
*/
function convertMarked(dom, mark, replaceMarks) {
$.ajax({
type: "POST",
url: replaceMarks.url,
async: true,
data: replaceMarks.dataParam,
success: function(data) { // 请求成功或的数据
$(dom).data(mark, data);
}
});
}
/**
* 请求服务器数据
*/
function requestData(dom) {
$(dom).loaders(); // 这个是自己开发的一个loading插件,也是基于css3的
var options = $(dom).data("options");
/*$.ajax({// 请求成功或的数据的真实数据,现在是测试阶段就直接上数据了。
type: "POST",
url: options.url,
async: true,
data: options.dataParam,
success: function(data) {
$(dom).data("dataset", data);
}
});*/
var test ={"categories": [
{
"category": [
{"label": "Q1"},
{"label": "Q2"},
{"label": "Q3"},
{"label": "Q4"}
]
}
],
"dataset": [
{
"seriesname": "Previous Year",
"data": [
{
"value": "10000"
},
{
"value": "11500"
},
{
"value": "12500"
},
{
"value": "15000"
}
]
},
{
"seriesname": "Current Year",
"data": [
{
"value": "25400"
},
{
"value": "29800"
},
{
"value": "21800"
},
{
"value": "26800"
}
]
}
]
}
buildChart(dom, test);
}
function buildChart(dom, data) {
replaceData(dom, data);
drawchart(dom);
}
/**
* 转换最终数据
*/
function replaceData(dom, data) {
var labelCon = $(dom).data("label");
var seriesnameCon = $(dom).data("seriesname");
var isclick = ($(dom).data("options").clickChart!=null?true:false);
if($.isArray(data)) { // data 数据
for(var k=0,n=data.length;k<n;k++) {
if(isclick) {
console.log($(dom).data("options").clickChart)
data[k].link = "javascript:"+$(dom).data("options").clickChart+"("+JSON.stringify(data[k])+")";
}
if(!$.isEmptyObject(labelCon)) {
data[k].label = labelCon[data[k].label];
}
}
$(dom).data("dataset",{"data": data});
} else { // 返回对象,需要部分特殊处理
var labels = data.categories[0].category;
var ds = data.dataset;
if(!$.isEmptyObject(seriesnameCon) || isclick) {
for(var d=0,m=ds.length;d<m;d++) {
// 添加链接,点击是可以获取点击部分的数据
if(isclick) {
var subds = ds[d].data;
var params = {};
params.label = labels[d].label;
params.seriesname = ds[d].seriesname;
for(var sd=0,r=subds.length;sd<subds.length;sd++) {
params.value=subds[sd].value;
subds[sd].link = "javascript:"+$(dom).data("options").clickChart+"("+JSON.stringify(params)+")";
}
}
if(!$.isEmptyObject(seriesnameCon)) {
ds[d].seriesname=seriesnameCon[ds[d].seriesname]!=null?seriesnameCon[ds[d].seriesname]:ds[d].seriesname;
}
}
}
if(!$.isEmptyObject(labelCon)) {
for(var k=0,n=labels.length;k<n;k++) {
labels[k].label = labelCon[labels[k].label]!=null?labelCon[labels[k].label]:labels[k].label;
}
}
$(dom).data("dataset", data);
}
}
/**
* 画样式
*/
function drawchart(dom) {
var options = $(dom).data("options");
var dataSource = $.extend(true,{}, $.fn.easychart.types[options["type"]], $.fn.easychart.types[options["style"]], $(dom).data("dataset"));
var chartObject = $.extend({}, {type: options["type"]+options["model"], width:$(dom).width(), height:$(dom).height(), dataFormat:options["dataFormat"]},{dataSource:dataSource});
//console.log(JSON.stringify(chartObject))
$(dom).insertFusionCharts(chartObject);
setTimeout(function() {// 删掉loading遮罩
$(dom).loadersClose();
}, 1000);
$("#"+dom.id+" tspan:contains('FusionCharts')").remove(); // 不是免费的玩野在图表下面总有一段话。。直接remove掉
}
$.fn.easychart = function(options, params) {
if(typeof options == "string") {
console.log(options);
$.fn.easychart.method[options](this ,params);
} else {
options = options || {};
options = $.extend(true, {}, $.fn.easychart.defaults, options);
return this.each(function() {
init(this, options);
});
}
};
$.fn.easychart.method = {
reload : function(dom, params) {
// 删除存储数据,并重新设置
return dom.each(function() {
requestData(this);
});
},
// 根据数据查询替换label文本
ajaxLabel : function(dom, params) {
convertMarked(dom, "label", options.ajaxLabel);
},
// 根据数据查询替换seriesname文本
ajaxSeriesname: function(dom, params) {
convertMarked(dom, "seriesname", options.ajaxSeriesname);
}
};
// 展示图表样式,可以自己根据需求添加
$.fn.easychart.types = {
column: {
"chart": {
"caption": "Monthly revenue for last year",
"subCaption": "Harry's SuperMart",
"xAxisName": "Month",
"yAxisName": "Revenues (In USD)",
"numberPrefix": "$",
"paletteColors": "#0075c2",
"bgColor": "#ffffff",
"borderAlpha": "20",
"canvasBorderAlpha": "0",
"usePlotGradientColor": "0",
"plotBorderAlpha": "10",
"placevaluesInside": "1",
"rotatevalues": "1",
"valueFontColor": "#ffffff",
"showXAxisLine": "1",
"xAxisLineColor": "#999999",
"divlineColor": "#999999",
"divLineDashed": "1",
"showAlternateHGridColor": "0",
"subcaptionFontBold": "0",
"subcaptionFontSize": "14"
}
},
area: {
"chart": {
"caption": "Sales of Liquor",
"subCaption": "Last week",
"xAxisName": "Day",
"yAxisName": "Sales (In USD)",
"numberPrefix": "$",
"paletteColors": "#0075c2",
"bgColor": "#ffffff",
"showBorder": "0",
"showCanvasBorder": "0",
"plotBorderAlpha": "10",
"usePlotGradientColor": "0",
"plotFillAlpha": "50",
"showXAxisLine": "1",
"axisLineAlpha": "25",
"divLineAlpha": "10",
"showValues": "1",
"showAlternateHGridColor": "0",
"captionFontSize": "14",
"subcaptionFontSize": "14",
"subcaptionFontBold": "0",
"toolTipColor": "#ffffff",
"toolTipBorderThickness": "0",
"toolTipBgColor": "#000000",
"toolTipBgAlpha": "80",
"toolTipBorderRadius": "2",
"toolTipPadding": "5"
}
},
mscolumn: {
"chart": {
"caption": "Comparison of Quarterly Revenue",
"xAxisname": "Quarter",
"yAxisName": "Revenues (In USD)",
"numberPrefix": "$",
"plotFillAlpha": "80",
"paletteColors": "#0075c2,#1aaf5d",
"baseFontColor": "#333333",
"baseFont": "Helvetica Neue,Arial",
"captionFontSize": "14",
"subcaptionFontSize": "14",
"subcaptionFontBold": "0",
"showBorder": "0",
"bgColor": "#ffffff",
"showShadow": "0",
"canvasBgColor": "#ffffff",
"canvasBorderAlpha": "0",
"divlineAlpha": "100",
"divlineColor": "#999999",
"divlineThickness": "1",
"divLineDashed": "1",
"divLineDashLen": "1",
"divLineGapLen": "1",
"usePlotGradientColor": "0",
"showplotborder": "0",
"valueFontColor": "#ffffff",
"placeValuesInside": "1",
"showHoverEffect": "1",
"rotateValues": "1",
"showXAxisLine": "1",
"xAxisLineThickness": "1",
"xAxisLineColor": "#999999",
"showAlternateHGridColor": "0",
"legendBgAlpha": "0",
"legendBorderAlpha": "0",
"legendShadow": "0",
"legendItemFontSize": "10",
"legendItemFontColor": "#666666"
}
}
}
// 默认值,请求是需要传入了
$.fn.easychart.defaults = {
url: null, // 请求的URL地址
dataParam: null, // 请求
dataFormat:"json", // 展示数据格式
type:"column", // fsc类型
model:"2d", // fsc 模型
ajaxLabel: null, // label 替换数据 Ajax
ajaxSeriesname: null, // seriesname 替换数据 Ajax
labelConvertor:{}, // label 替换数据 Object
seriesnameConvertor: {}, // label 替换数据 Object
clickChart: null, // 点击出发事件
style:{}, // fcs chart扩展
};
})(jQuery);
以上是插件部分。在使用时(有关根据数据库查询替换的没有测试,可以在项目中指定返回格式一致就可以了):
<pre name="code" class="html"><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="<%=path%>/css/loaders/loaders.css" type="text/css">
<link rel="stylesheet" href="<%=path%>/css/loaders/loaders.min.css" type="text/css">
<link rel="stylesheet" href="<%=path%>/css/pagination.css" type="text/css">
<link rel="stylesheet" href="<%=path%>/css/iscroll.css" type="text/css">
<script type="text/javascript">
var _root_path = "<%=path%>";
</script>
<script type="text/javascript" src="<%=path%>/js/jquery-2.1.js"></script>
<script type="text/javascript" src="<%=path%>/js/jquery.loaders.plug.js"></script>
<script type="text/javascript" src="<%=path%>/js/fusioncharts/fusioncharts.js"></script>
<script type="text/javascript" src="<%=path%>/js/fusioncharts/fusioncharts.charts.js"></script>
<script type="text/javascript" src="<%=path%>/js/fusioncharts/fusioncharts.gantt.js"></script>
<script type="text/javascript" src="<%=path%>/js/fusioncharts/fusioncharts.maps.js"></script>
<script type="text/javascript" src="<%=path%>/js/fusioncharts/fusioncharts.powercharts.js"></script>
<script type="text/javascript" src="<%=path%>/js/fusioncharts/fusioncharts.widgets.js"></script>
<script type="text/javascript" src="<%=path%>/js/fusioncharts/fusioncharts.jqueryplugin.js"></script>
<script type="text/javascript" src="<%=path%>/js/jquery.easychart.plug.js"></script>
</head>
<body>
<div id="chart1" style="width:300px;height: 270px"></div>
<div id="chart2" style="width:500px;height: 670px"></div>
<input type="button" id="b1" value="ceshi111">
</body>
<script type="text/javascript">
$(function() {
$("#chart1").easychart({
clickChart:"clickChart",
type:"mscolumn",
labelConvertor:{"Q1":"第一季度","Q2":"第二季度"},
seriesnameConvertor:{"Previous Year":"同期"},
model:"2D"
});
$("#chart2").easychart({
clickChart:"clickChart",
type:"mscolumn",
labelConvertor:{"Q1":"第一季度","Q2":"第二季度"},
seriesnameConvertor:{"Previous Year":"同期"},
model:"2D"
});
$("#b1").click(function() {
$("#chart1").easychart("reload");
});
});
function clickChart(chartdata) {
console.log(JSON.stringify(chartdata));
}
</script>
</html>