首先说一下 YUI Extjs Astra三者的Charts的关系:
Extjs原名YUI-Extjs,最初Extjs是对YUI的封装
Extjs 3.0新增的Charts功能实际上是对YUI Charts的封装
YUI Charts是对Astra Charts的封装
Astra Charts是Astra Flash Components的组件之一
Astra Flash Components是YAHOO提供的flash/flex组件库
Extjs和YUI两者实现CHARTS的示例代码:
//yui LineChart 核心代码
var mychart = new YAHOO.widget.LineChart( "chart", myDataSource,
{
series: seriesDef,
xField: "month",
yAxis: currencyAxis,
dataTipFunction: YAHOO.example.getDataTipText,
//only needed for flash player express install
expressInstall: "assets/expressinstall.swf"
});
//extjs LineChart 核心代码
new Ext.Panel({
title: 'ExtJS.com Visits Trend',
renderTo: 'container',
width:500,
height:300,
layout:'fit',
items: {
xtype: 'linechart',
store: store,
xField: 'name',
yField: 'visits',
listeners: {
itemclick: function(o){
var rec = store.getAt(o.index);
Ext.example.msg('Item Selected', 'You chose {0}.', rec.get('name'));
}
}
}
});
具体实现代码大家请参考官方网站:
http://extjs.com/deploy/dev/examples/chart/charts.html
http://developer.yahoo.com/yui/charts/
由于Extjs的charts功能只是对YUI charts的封装所以我这里只是介绍一下YUI Charts的实现原理。
首先看一下YUI Charts主要类结构
YAHOO.widget.Chart是所有Chart的基类,其中饼图YAHOO.widget.PieChart是直接继承YAHOO.widget.Chart;而其他柱状图、连线图等其他图形是继承 YAHOO.widget.CartesianChart。而YAHOO.widget.Chart的父类YAHOO.widget.FlashAdapter是实现Chart功能最重要的类,就像它的名字显示的含义一样这个类是js和flash交互的适配器。
下面再看一下为了支持YUI实现Charts功能YUI在Astra Charts上进行的封装
右边2个类是Astra Charts原有的类
YUIAdapter和Charts是为了YUI实现Chart相关功能对Astra Charts进行的封装
Sprite 是不需要时间轴的对象的相应基类。
下面看一下YAHOO.widget.LineChart的初始化过程,也就是执行上面第一段代码时的时序图
上图中的XXXChart代表YAHOO.widget.LineChart的一些父类,这里为了画图时简单一点。
new YAHOO.widget.LineChart( …)构造Chart对象,实质上是调用父类的构造函数,最终调用FlashAdapter的构造函数。FlashAdapter的私有方法_embedSWF中创建了一个SWFObject对象
/**
* Embeds the SWF in the page and associates it with this instance.
*
* @method _embedSWF
* @private
*/
_embedSWF: function(swfURL, containerID, swfID, version, backgroundColor, expressInstall, wmode)
{
//standard SWFObject embed
var swfObj = new YAHOO.deconcept.SWFObject(swfURL, swfID, "100%", "100%", version, backgroundColor);
if(expressInstall)
{
swfObj.useExpressInstall(expressInstall);
}
//make sure we can communicate with ExternalInterface
swfObj.addParam("allowScriptAccess", "always");
if(wmode)
{
swfObj.addParam("wmode", wmode);
}
//again, a useful ExternalInterface trick
swfObj.addVariable("allowedDomain", document.location.hostname);
//tell the SWF which HTML element it is in
swfObj.addVariable("elementID", swfID);
// set the name of the function to call when the swf has an event
swfObj.addVariable("eventHandler", "YAHOO.widget.FlashAdapter.eventHandler");
var container = YAHOO.util.Dom.get(containerID);
var result = swfObj.write(container);
if(result)
{
this._swf = YAHOO.util.Dom.get(swfID);
//if successful, let's add an owner property to the SWF reference
//this will allow the event handler to communicate with a YAHOO.widget.FlashAdapter
this._swf.owner = this;
}
else
{
YAHOO.log("Unable to load SWF " + swfURL);
}
},
上面的代码注释大家应该基本可以看明白是怎么回事,我再稍微做一下解释。
SWFObject是一种易用的、符合标准的在网页中嵌入flash对象的方法 ,能够自动检测PC、Mac机器上各种主流浏览器对Flash插件的支持情况。
SWFObject属于另一个开源项目:http://code.google.com/p/swfobject/
swfObj.addParam(“allowScriptAccess”, “always”);//allowscriptaccess=always 允许随时执行脚本操作 使 Flash 应用程序可与其所在的 HTML 页通信
swfObj.addVariable(“allowedDomain”, document.location.hostname);//actionscript与JS的交互不允许跨域
swfObj.addVariable(“eventHandler”, “YAHOO.widget.FlashAdapter.eventHandler”);//指定js提供给actionscript的事件回调函数
swfObj.write(container);//在container这个DOM内插入SWF对象代码
this._swf//就是对SWF对象的引用
this._swf.owner = this;//这里的this代表的就是执行new YAHOO.widget.LineChart( …)后生成的对象
在执行完上面时序图的初始化之后,swf对象就被嵌入了HTML中,后续就要执行FLASH的初始化工作。请看下面的时序图
如上图显示FLASH PLAYER先去调用了Charts的构造函数,但是Charts的构造函数是空的所以实际上最初只是调用了YUIAdapter的构造函数,下面是YUIAdapter的一些核心代码,其他关于charts.swf的代码请看附件charts.rar
public function YUIAdapter()
{
var swfReady:Object;
if (this.stage)
{
this.stage.addEventListener(Event.RESIZE, stageResizeHandler);
this.stage.scaleMode = StageScaleMode.NO_SCALE;
this.stage.align = StageAlign.TOP_LEFT;
}// end if
try
{
ExternalInterface.marshallExceptions = true;
}// end try
catch (error:Error)
{
}// end catch
this._errorText = new TextField();
this._errorText.defaultTextFormat = new TextFormat("_sans", 10, 16711680);
this._errorText.wordWrap = true;
this._errorText.autoSize = TextFieldAutoSize.LEFT;
this._errorText.selectable = false;
this._errorText.mouseEnabled = false;
this.addChild(this._errorText);
this.addEventListener(Event.ADDED, addedHandler);
if (ExternalInterface.available)
{
this.initializeComponent();
swfReady;
this.dispatchEventToJavaScript(swfReady);
}
else
{
throw new IOError("Flash YUIComponent cannot communicate with JavaScript content.");
}// end else if
return;
}// end function
public function getAltText() : String
{
return this._altText;
}// end function
protected function refreshComponentSize() : void
{
if (this.component)
{
var _loc_1:int;
this.component.y = 0;
this.component.x = _loc_1;
this.component.width = this.stage.stageWidth;
this.component.height = this.stage.stageHeight;
}// end if
return;
}// end function
protected function showFatalError(param1:Object) : void
{
if (!param1)
{
param1 = "";
}// end if
if (this._errorText)
{
this._errorText.appendText(param1.toString());
this._errorText.scrollV = this._errorText.maxScrollV;
this._errorText.mouseEnabled = true;
this._errorText.selectable = true;
}// end if
return;
}// end function
protected function addedHandler(param1:Event) : void
{
this.setChildIndex(this._errorText, this.numChildren--);
return;
}// end function
protected function log(param1:Object, param2:String = null) : void
{
if (param1 == null)
{
param1 = "";
}// end if
this.dispatchEventToJavaScript({type:"log", message:param1.toString(), category:param2});
return;
}// end function
protected function initializeComponent() : void
{
this.elementID = this.loaderInfo.parameters.elementID;
this.javaScriptEventHandler = this.loaderInfo.parameters.eventHandler;
var allowedDomain:* = this.loaderInfo.parameters.allowedDomain;
if (allowedDomain)
{
Security.allowDomain(allowedDomain);
this.log("allowing: " + allowedDomain);
}// end if
try
{
ExternalInterface.addCallback("getAltText", getAltText);
ExternalInterface.addCallback("setAltText", setAltText);
}// end try
catch (error:SecurityError)
{
}// end catch
return;
}// end function
protected function dispatchEventToJavaScript(param1:Object) : void
{
var event:* = param1;
try
{
if (ExternalInterface.available)
{
ExternalInterface.call(this.javaScriptEventHandler, this.elementID, event);
}// end if
}// end try
catch (error:Error)
{
if (error is SecurityError)
{
this.showFatalError("Warning: Cannot establish communication between YUI Charts and JavaScript. YUI Charts must be served from HTTP and cannot be viewed locally with file:/// protocol unless location is trusted by Flash Player.\n\nFor more information see:\nhttp://www.adobe.com/products/flashplayer/articles/localcontent/\n\n");
}// end if
}// end catch
return;
}// end function
请看一下上面代码的部分解释
ExternalInterface.marshallExceptions = true;//指示外部接口是否应该尝试将 ActionScript 异常传递到当前浏览器并将 JavaScript 异常传递到 Flash Player。
ExternalInterface.available//指示此播放器是否位于提供外部接口的容器中。
this.javaScriptEventHandler = this.loaderInfo.parameters.eventHandler;//从参数中得到JS提供给Actionscript的事件回调函数
ExternalInterface.addCallback(“getAltText”, getAltText);//将 ActionScript 方法注册为可从容器调用。
ExternalInterface.call(this.javaScriptEventHandler, this.elementID, event);//调用由 Flash Player 容器公开的函数,不传递参数或传递多个参数。
YAHOO.widget.FlashAdapter.eventHandler()这个方法类似于静态方法,将请求分发给LineChart的对象去执行_eventHandler方法。后面代码执行顺序请大家按上面的时序图去分析。
下面是Javascript和Actionscript通信的一些基础知识:
<param?name="allowScriptAccess"?value="always"/>
<embed ... allowscriptaccess="always" type="application/x-shockwave-flash"/>
value参数说明:
always 允许随时执行脚本操作。
never 禁止所有脚本执行操作。
samedomain 只有在 Flash 应用程序来自与 HTML 页相同的域时才允许执行脚本操作。
ExternalInterface.marshallExceptions:指示外部接口是否应该尝试将 ActionScript 异常传递到当前浏览器并将 JavaScript 异常传递到 Flash Player。必须显式将此属性设置为 true,以便在 ActionScript 中捕获 JavaScript 异常以及在 JavaScript 中捕获 ActionScript 异常。
ExternalInterface.available:指示此播放器是否位于提供外部接口的容器中。如果外部接口可用,则此属性为 true;否则,为 false。
ExternalInterface
public static function addCallback(functionName:String, closure:Function):void functionName:String — 容器可用于调用函数的名称。closure:Function — 要调用的 closure 函数。 将 ActionScript 方法注册为可从容器调用。成功调用 addCallBack() 后,容器中的 JavaScript 或 ActiveX 代码可以调用在 Flash Player 中注册的函数。
public static function call(functionName:String, ... arguments): 调用由 Flash Player 容器公开的函数,不传递参数或传递多个参数。如果该函数不可用,调用将返回 null;否则,它返回由该函数提供的值。不允许在 Opera 或 Netscape 浏览器中使用递归;在这些浏览器上,递归调用将生成 null 响应。(Internet Explorer 和 Firefox 浏览器上支持递归。)
参考文档:
ExternalInterface :http://livedocs.adobe.com/flex/3_cn/langref/flash/external/ExternalInterface.html
SWFObject:http://code.google.com/p/swfobject/
http://farthinker.cn/2007/12/27/swfobject-2_0-doc-translation/
再申明一下小弟对Actionscript编程没有任何经验,上面的分析都是凭我以往的开发经验做的分析,请各位老大拍砖指正我分析的错误。

- 大小: 24.6 KB

- 大小: 10.7 KB

- 大小: 22.3 KB

- 大小: 4.8 KB
分享到:
相关推荐
用于替换Extjs生成图表的charts.swf文件。实现图表的另存为图片的功能
DojoX 包括了一些创新/新颖的代码和控件,如 DateGrid、charts、离线应用、跨浏览器矢量绘图等。 2. YUI YUI Library 是一组采用 DOM scripting、DHTML 和 Ajax 等技术开发的 Web UI 控件和工具。YUI 工具包利用 ...
YUI是Yahoo推出的一系列Web UI控件和工具集合,涵盖了AutoComplete、Button、Calendar、Charts、ColorPicker等多种组件。这些控件不仅功能丰富,而且高度可定制,适用于创建复杂且互动性高的Web应用。此外,YUI还...
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
前端分析-2023071100789
基于kinect的3D人体建模C++完整代码.cpp
搞机工具箱10.1.0.7z
GRU+informer时间序列预测(Python完整源码和数据),python代码,pytorch架构,适合各种时间序列直接预测。 适合小白,注释清楚,都能看懂。功能如下: 代码基于数据集划分为训练集测试集。 1.多变量输入,单变量输出/可改多输出 2.多时间步预测,单时间步预测 3.评价指标:R方 RMSE MAE MAPE,对比图 4.数据从excel/csv文件中读取,直接替换即可。 5.结果保存到文本中,可以后续处理。 代码带数据,注释清晰,直接一键运行即可,适合新手小白。
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
基于ANSYS LSDyna的DEM-SPH-FEM耦合模拟滑坡入水动态行为研究,基于ANSYS LSDyna的DEM-SPH-FEM耦合的滑坡入水模拟分析研究,基于ansys lsdyna的滑坡入水模拟dem-sph-fem耦合 ,基于ANSYS LSDyna; 滑坡入水模拟; DEM-SPH-FEM 耦合,基于DEM-SPH-FEM耦合的ANSYS LSDyna滑坡入水模拟
auto_gptq-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
复件 复件 建设工程可行性研究合同[示范文本].doc
13考试真题最近的t64.txt
好用我已经解决报错问题
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
auto_gptq-0.4.2-cp38-cp38-win_amd64.whl
自动立体库设计方案.pptx
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!