`
gavin
  • 浏览: 83495 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

dojo charting on nodejs

阅读更多
在nodejs上运行dojo的文章很多,却找不到具体使用dojox.charting的资料,因为有node-canvas这样的开源项目,理论上可以把dojo生成的图保存为文件,实践中碰到一些问题并都解决了。js图表库很多都把坐标轴上的刻度文字用html来显示,这样在网页上都不能保存到图片里,更别说在后台了。库rgraph文字是完全生成在canvas上的,dojo图表是可设置轴文字生成到html或canvas的。下面是具体过程和代码:

环境:
1.node-canvas windows安装参照文档,简单说就是:
安装Python 2.7.3并设置环境变量
安装Microsoft Visual C++ 2010 Express
下载cairo library解压到C:\GTK并设置环境变量
npm update -g npm
npm install -g node-gyp
npm install canvas
2.因为dojox.charting用到的dom相关,所以还要安装jsdom,并在代码上调整一下
npm install jsdom
原则上不改dojo代码,不改下载的库,只有一个文件实在是没办法
dojo/_base/window.js里边有一句
doc: this["document"] || null,
 改成
doc: this["document"] || window.document || null,

其它库不用改,在自己的代码中设置就行了。
代码:
1.启动代码:boot.js
var jsdom = require("jsdom").jsdom;
var document = jsdom("<html><head></head><body style='display:block;'><div id='StackedColumns_numbers' width='400' height='300'  style=''></div></body></html>", require("jsdom").level(2, "core"));
window = document.createWindow();
navigator = window.navigator;

global.dojoConfig = {
  async: true,
  forceGfxRenderer: 'canvas',
  gfxRenderer: 'canvas',
  basePath: ".",
  packages: [{
    name: "dojo",
    location: "lib/dojo"
  },{
    name: "dojox",
    location: "lib/dojox"
  },{
    name: "mynode",
    location: "mynode"
  }],
  deps: ["mynode/main"]
};

require("./lib/dojo/dojo.js");

2.主程序:mynode/main.js
define(["dojo/_base/declare", "dojo/_base/lang", "dojo/dom", "dojo/node!fs",
	"dojo/ready","dojox/charting/Chart", "dojox/charting/axis2d/Default",
	"dojox/charting/plot2d/StackedColumns"], 
	function(declare, lang, dom, fs, ready, Chart, Default, StackedColumns){


	ready(function(){

		// StackedColumns, array of numbers
		var chart6 = new Chart("StackedColumns_numbers",{title: ""});
		chart6.addAxis("x", {fixLower: "major",htmlLabels: false, fixUpper: "major"});
		chart6.addAxis("y", {vertical: true, htmlLabels: false,fixLower: "minor", fixUpper: "minor", natural: true, includeZero: true});
		chart6.addPlot("default", {type: StackedColumns, gap: 5});
		chart6.addSeries("Series A", [1, 2, 3, 4, 5], {fill: "red"});
		chart6.addSeries("Series B", [5, 4, 3, 2, 1], {fill: "blue"});
		chart6.render();
		setTimeout(function(){
		var div = dom.byId("StackedColumns_numbers");
		console.log("========"+div.children);
		for (var i=0;i<div.children.length;i++) {
			if(div.children[i].createPNGStream){
				console.log("========"+div.children[i]);
				var canvas = div.children[i];
				var out = fs.createWriteStream('charting.png')
				 , stream = canvas.createPNGStream();

				stream.on('data', function(chunk){
				 out.write(chunk);
				});
			}
		}
		}, 0);
	});
});

使用setTimeout是因为dojox/gfx/canvas.js里面使用了setTimeout:
makeDirty: function(){
			// summary:
			//		internal method, which is called when we may need to redraw
			if(!this.pendingImagesCount && !("pendingRender" in this)){
				this.pendingRender = setTimeout(lang.hitch(this, this._render), 0);
			}
},

3运行node boot.js生成图片文件,以下是解决轴上的文字和标题问题。
不能显示字是因为dojox/gfx/_base里边:
px_in_pt: function(){
			// summary:
			//		returns the current number of pixels per point.
			return g._base._getCachedFontMeasurements()["12pt"] / 12 || 1;	// Number
},
"|| 1"是后加的,通过创建dom的方式来计算在nodejs里行不通过,所以直接返回1。
如果要显示title,需要设置字体;因为title默认是用html来显示,所以要修改dojox/charting/Chart里
				var forceHtmlLabels = (g.renderer == "canvas"),
					labelType = 'gfx';//forceHtmlLabels || !has("ie")  && !has("opera") ? "html" : "gfx",
					tsize = g.normalizedLength(g.splitFontString(this.titleFont).size);
这里直接用'gfx'。设置title的代码
var chart6 = new Chart("StackedColumns_numbers",{title: "aaa",titleFont: "normal normal normal 8pt 黑体, Arial, sans-serif",});
chart6.addAxis("x", {fixLower: "major",htmlLabels: false, fixUpper: "major", natural: true});
还有个中文问题解决起来较麻烦,编译时要让node-canvas支持国际化。
还有另一种思路svg png,它使用的是highchart.
分享到:
评论

相关推荐

    dojo dojo实例 dojo例子 dojo资料 dojo项目 dojo实战 dojo模块 dojo编程

    例如,`dojo/query`用于选择DOM元素,`dojo/on`用于监听事件。 3. **dojo/ready**:这个模块用于确保DOM加载完成后再执行指定的函数,它是Dojo中的一个实用工具,常用于页面初始化。 4. **dojo/store**:这是一个...

    dojo入门实例介绍

    require(["dojo/dom", "dojo/on"], function(dom, on){ var button = dom.byId("myButton"); on(button, "click", function(event){ console.log("Button clicked!"); }); }); ``` 在上述代码中,我们加载了`...

    超多的Dojo实例应用演示源码

    4. **Dojo DojoX**:DojoX是Dojo的扩展库,包含了一系列高级功能和插件,如图形绘制(dojox/gfx)、图表(dojox/charting)、数据存储(dojox/data)等。这些示例将展示如何利用DojoX进行更复杂的应用开发。 5. **...

    dojo模块化实例

    require(["dojo/dom", "dojo/on"], function(dom, on){ var button = dom.byId("myButton"); on(button, "click", function(event){ console.log("Button clicked!"); }); }); ``` 在这个例子中,我们导入了`...

    dojo文档 dojo文档 dojo文档

    dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档 dojo文档

    Dojo框架使用教程

    require(["dojo/dom", "dojo/on"], function(dom, on){ var button = dom.byId("myButton"); on(button, "click", function(event){ alert("Button clicked!"); }); }); ``` 在这个例子中,我们导入了`dojo/dom`...

    dojo-release-1.9.0-src.zip dojo javascript库源码

    此外,Dojo还提供了`dojo/on`用于事件监听,`dojo/dom-class`和`dojo/dom-style`分别用于处理类名和样式。 在Ajax方面,Dojo提供了`dojo/xhr`模块,可以方便地进行异步数据请求。例如,`dojo/request`和`dojo/io-...

    dojo相关详细资料

    - `dojo/on`: 事件处理模块,提供了一种统一的方式来监听和处理事件。 - `dojo/request`: 用于进行异步HTTP请求,支持XMLHttpRequest和JSONP。 - `dojo/ready`: 确保DOM加载完成后再执行代码,类似于jQuery的$...

    Dojo1.11正式版

    6. **dojo/on事件系统**:Dojo/on提供了一种统一的方式来处理DOM事件,它不仅支持原生事件,还允许自定义事件,提高了代码的可读性和可维护性。 7. **dojo/request网络请求库**:Dojo请求模块简化了Ajax和其他HTTP...

    DOJO 学习笔记 dojo

    Dojo 是一个功能丰富的 JavaScript 库,它提供了一系列模块化、面向对象的工具,用于构建高性能的 Web 应用程序。在 Dojo 中,模块和包的概念是核心组成部分,它们帮助开发者组织和管理代码,使其更易于维护和重用。...

    dojo源码

    3. Dojo源码结构:Dojo的源码通常分为多个模块,如dojo/main、dojo/_base、dojo/dom、dojo/on等,每个模块负责不同的功能。例如,`dojo/main`是Dojo的核心入口点,`dojo/_base`包含基础功能,如事件处理和对象创建,...

    dojo中文文档-dojo手册

    《dojo中文文档-dojo手册》提供了全面而深入的Dojo框架知识,这是一份非常有价值的资源,对于想要理解和掌握Dojo JavaScript库的开发者来说至关重要。Dojo是一个强大的JavaScript工具包,它提供了丰富的功能,包括...

    dojo Ajax

    8. **dojo.on**: 用于事件监听,`dojo/on`模块提供了更高级别的事件处理,可以方便地为DOM元素或其他对象添加事件监听器。 9. **dojo/json**: 提供了JSON序列化和反序列化的功能,如`dojo/json::parse`和`dojo/json...

    dojo开发文档

    2. **dojo/on事件处理**:Dojo提供了`dojo/on`模块,用于事件监听和处理,它比原生JavaScript的事件处理更强大,支持事件委托和事件对象标准化。 3. **dojo/dom和dojo/query**:`dojo/dom`提供对DOM元素的操作,如...

    Dojo权威指南源代码

    4. **dojo/on和dojo/event**:dojo/on用于事件监听,它封装了浏览器差异,使得事件处理更统一。dojo/event则提供了一些高级事件处理功能,如事件委托、事件连接和分离等。 5. **dojo/aspect**:面向切面编程(AOP)...

    dojo1.6关于DOM相关操作的官方介绍

    10. **dojo.on**: Dojo 1.7引入了`dojo/on`模块,它提供了更现代、更符合DOM Level 2事件接口的事件处理方式,同时兼容老版本的`dojo.connect`。 以上所述是Dojo 1.6在DOM操作方面的核心功能。通过这些API,开发者...

    dojo 离线API

    `dojo/dom`和`dojo/dom-geometry`用于DOM操作和元素几何信息获取,而`dojo/on`则用于事件监听。此外,`dojo/request`模块用于处理HTTP请求,对于AJAX操作十分便利。 Dojo还提供了一个强大的UI组件库,如`dijit`模块...

    DOJO API 中文参考手册

    4. **事件处理 (dojo/on)**: Dojo 的事件处理模块`dojo/on`使得监听和处理DOM事件变得更加简单,支持事件委托,可以跨浏览器实现一致的事件处理。 5. **Dojo Widget系统 (dijit)**: dijit是Dojo的UI组件库,包含了...

    dojo实战+实用例子

    在事件处理方面,Dojo提供了`dojo/on`模块,它允许你方便地监听和处理各种DOM事件,包括鼠标和键盘事件,以及自定义事件。与原生JavaScript相比,Dojo的事件处理更加灵活且易于跨浏览器兼容。 Dojo的AJAX功能主要...

    DOJO API 中文参考手册,附加注解实例(精心重新排版DOC文档)

    手册中列举了一些常用的Dojo包,如dojo.io用于不同类型的IO传输,dojo.dnd提供拖放功能的API,dojo.string提供了字符串处理方法,dojo.date帮助解析和操作日期,dojo.event处理事件驱动和AOP开发,dojo.back管理撤销...

Global site tag (gtag.js) - Google Analytics