WPF/Silverlight深度解决方案:(十一)与嵌入式脚本语言Lua & JavaScript的交互(下)
本节,我首先想说明一下为什么选择Lua和JavaScript,因为(1)文章标题写的是它们……汗一个先(2)它们都属于嵌入式脚本语言,主要服务于前端(客户端)。(3)语言方面有诸多相似,且在各自的专长领域都称得上“王者”。(4)体积小,Lua仅仅不到300K;而调用JavaScript更无需额外的资源引用。
由于是嵌入式脚本,因此它们在客户前端可以表现得极其灵活。通过将配置参数及实现具体功能的方法逻辑抽离到脚本中,在修改及拓展时就能更加方便更新处理而无需重新编译主体框架代码。而诸如XML、JSON、Protocol Buffers等数据交换格式仅能作为数据存储媒介,自身无法实现逻辑处理。至于其它能被.NET所支持的脚本例如IronPython等,则通常致力于服务器端,远离嵌入式精神。
言归正传,大家是否已从上一节中感受到了WPF与Lua交互的灵活性,那么本节我将向大家讲解Silverlight与JavaScript的交互。其实这个话题早就被写烂了,网上可以寻获一大堆资料,为何要再次讲解?一方面希望为大家用更简洁直观的方式浓缩精华,更重要的是通过实现上一节同样的效果,使大家能进一步的理解Lua和JavaScript,以及它们之间的区别。
同样的,按照上一节的流程,我们先写出对应的JavaScript脚本:
<script type="text/javascript">
var content = new Array (
"听说你老婆生了波|啊?真的?|真的假的哇?|你们听说没,深蓝色右手最近和施瓦辛格准备合拍下一部作品,好像要取名叫:'断肩山'|…… ",
"握着老婆的手,好象左手握右手;握着小姐的手,好象回到十八九;握着女同学的手,后悔当初没下手。|……",
"前清时期坐过堂|北洋军中扛过枪|武昌城里落过荒|北伐战争帮过忙|......"
);
function ShowTalk(i){
var list = content[i].split("|");
var obj = document.getElementById("SL").content.SL_Obj;
obj.RandomTalk(list[Math.floor(Math.random() * list.length)]);
}
</script>
大家不妨对照下上节中的Lua脚本一定会发现它们真的很像。在JavaScript脚本中,我们通过document.getElementById("SL").content.SL_Obj这一句来获取
<object id="SL" data="data:application/x-silverlight-2,"……></object>
id为SL的Silverlight页面控件对象,其中的SL_Obj这个名字必须在Silverlight后台cs中注册:
HtmlPage.RegisterScriptableObject("SL_Obj", this);
才能被正常引用。这样,我们就可以调用Silverlight中的RandomTalk方法了:
obj.RandomTalk(list[Math.floor(Math.random() * list.length)]);
同时,Silverlight中的RandomTalk还必须添加[ScriptableMember]标识用以告诉系统此方法可以被JavaScript调用:
[ScriptableMember]
public void RandomTalk(string content) {
int i = random.Next(sprite.Count());
sprite[i].Talk = content;
Canvas.SetZIndex(sprite[i], 1);
}
由此就完成了JavaScript将逻辑处理结果返回给Silverlight的流程。
反过来,Silverlight后台中的cs文件该如何调用此JavaScript脚本中的ShowTalk方法呢?和Lua一样,一句话搞定:
HtmlPage.Window.Invoke("ShowTalk", Convert.ToInt32((comboBox1.SelectedItem as ComboBoxItem).Tag));
如果说Lua很陌生,那么作为.NET开发者的我们,对于JavaScript应该再熟悉不过了。拥有这样好的先天条件,将JavaScript作为Silverlight的强力辅助工具,Silverlight的客户端体验将更加强大与完美。这才是本节想表达的最终目的。
同样的,最后放一个在线Demo(源码请到目录中下载):
JavaScript 虽然不像Lua那样可以实现完整的函数性编程,但是它在Web前端表现出来的强大是无可否认的,额外的它其实早已被应用到了Web领域之外,默默的,为了Silverlight的更加强大而奉献着。