在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/query`用于选择DOM元素,`dojo/on`用于监听事件。 3. **dojo/ready**:这个模块用于确保DOM加载完成后再执行指定的函数,它是Dojo中的一个实用工具,常用于页面初始化。 4. **dojo/store**:这是一个...
require(["dojo/dom", "dojo/on"], function(dom, on){ var button = dom.byId("myButton"); on(button, "click", function(event){ console.log("Button clicked!"); }); }); ``` 在上述代码中,我们加载了`...
4. **Dojo DojoX**:DojoX是Dojo的扩展库,包含了一系列高级功能和插件,如图形绘制(dojox/gfx)、图表(dojox/charting)、数据存储(dojox/data)等。这些示例将展示如何利用DojoX进行更复杂的应用开发。 5. **...
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文档
require(["dojo/dom", "dojo/on"], function(dom, on){ var button = dom.byId("myButton"); on(button, "click", function(event){ alert("Button clicked!"); }); }); ``` 在这个例子中,我们导入了`dojo/dom`...
此外,Dojo还提供了`dojo/on`用于事件监听,`dojo/dom-class`和`dojo/dom-style`分别用于处理类名和样式。 在Ajax方面,Dojo提供了`dojo/xhr`模块,可以方便地进行异步数据请求。例如,`dojo/request`和`dojo/io-...
- `dojo/on`: 事件处理模块,提供了一种统一的方式来监听和处理事件。 - `dojo/request`: 用于进行异步HTTP请求,支持XMLHttpRequest和JSONP。 - `dojo/ready`: 确保DOM加载完成后再执行代码,类似于jQuery的$...
6. **dojo/on事件系统**:Dojo/on提供了一种统一的方式来处理DOM事件,它不仅支持原生事件,还允许自定义事件,提高了代码的可读性和可维护性。 7. **dojo/request网络请求库**:Dojo请求模块简化了Ajax和其他HTTP...
Dojo 是一个功能丰富的 JavaScript 库,它提供了一系列模块化、面向对象的工具,用于构建高性能的 Web 应用程序。在 Dojo 中,模块和包的概念是核心组成部分,它们帮助开发者组织和管理代码,使其更易于维护和重用。...
3. Dojo源码结构:Dojo的源码通常分为多个模块,如dojo/main、dojo/_base、dojo/dom、dojo/on等,每个模块负责不同的功能。例如,`dojo/main`是Dojo的核心入口点,`dojo/_base`包含基础功能,如事件处理和对象创建,...
《dojo中文文档-dojo手册》提供了全面而深入的Dojo框架知识,这是一份非常有价值的资源,对于想要理解和掌握Dojo JavaScript库的开发者来说至关重要。Dojo是一个强大的JavaScript工具包,它提供了丰富的功能,包括...
8. **dojo.on**: 用于事件监听,`dojo/on`模块提供了更高级别的事件处理,可以方便地为DOM元素或其他对象添加事件监听器。 9. **dojo/json**: 提供了JSON序列化和反序列化的功能,如`dojo/json::parse`和`dojo/json...
2. **dojo/on事件处理**:Dojo提供了`dojo/on`模块,用于事件监听和处理,它比原生JavaScript的事件处理更强大,支持事件委托和事件对象标准化。 3. **dojo/dom和dojo/query**:`dojo/dom`提供对DOM元素的操作,如...
4. **dojo/on和dojo/event**:dojo/on用于事件监听,它封装了浏览器差异,使得事件处理更统一。dojo/event则提供了一些高级事件处理功能,如事件委托、事件连接和分离等。 5. **dojo/aspect**:面向切面编程(AOP)...
10. **dojo.on**: Dojo 1.7引入了`dojo/on`模块,它提供了更现代、更符合DOM Level 2事件接口的事件处理方式,同时兼容老版本的`dojo.connect`。 以上所述是Dojo 1.6在DOM操作方面的核心功能。通过这些API,开发者...
`dojo/dom`和`dojo/dom-geometry`用于DOM操作和元素几何信息获取,而`dojo/on`则用于事件监听。此外,`dojo/request`模块用于处理HTTP请求,对于AJAX操作十分便利。 Dojo还提供了一个强大的UI组件库,如`dijit`模块...
4. **事件处理 (dojo/on)**: Dojo 的事件处理模块`dojo/on`使得监听和处理DOM事件变得更加简单,支持事件委托,可以跨浏览器实现一致的事件处理。 5. **Dojo Widget系统 (dijit)**: dijit是Dojo的UI组件库,包含了...
在事件处理方面,Dojo提供了`dojo/on`模块,它允许你方便地监听和处理各种DOM事件,包括鼠标和键盘事件,以及自定义事件。与原生JavaScript相比,Dojo的事件处理更加灵活且易于跨浏览器兼容。 Dojo的AJAX功能主要...
手册中列举了一些常用的Dojo包,如dojo.io用于不同类型的IO传输,dojo.dnd提供拖放功能的API,dojo.string提供了字符串处理方法,dojo.date帮助解析和操作日期,dojo.event处理事件驱动和AOP开发,dojo.back管理撤销...