.NEt专家博客!

【李会军】一步一步学Silverlight 2系列(21):如何在Silverlight中调用JavaScript

上一篇 / 下一篇  2008-04-11 20:51:00

概述

Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章将从Silverlight 2基础知识、数据与通信、自定义控件、动画、图形图像等几个方面带您快速进入Silverlight 2开发。

Silverlight中 内置了对于HTML、客户端脚本等的支持。很多情况下,我们编写的Web应用程序中用了一些JavaScript或者AJAX框架,我们希望能够在 Silverlight调用某些脚本方法,或者说在Silverlight中触发某个脚本的执行,这时就需要用到在Silverlight中调用 JavaScript,本文将简单介绍这一内容。

使用GetProperty获取脚本对象

先来看一个简单的例子,在Silverlight测试页面中放入一个div用作显示信息:

<divid="result"></div>

编写一段简单的JavaScript代码:

<script.type="text/javascript">
S,J*fTDa L0function
Hello(message)ITPUB个人空间2] ?'n3t"{&Wj7\n
{
e3]#}%p7e0varresultSpan = $get("result");
#ef[R0k`0resultSpan.innerText ="Hello "+ message;
mA3Vv t1MM-J0}
&T'G8~"{ D5TJk{0</script>

再编写一个简单的输入信息界面:

<StackPanelBackground="#CDFCAE"Orientation="Vertical">
3t%G!v$njn8XN0<
StackPanelHeight="40">
H2NG\!}"Q MJ0<
TextBlockText="Calling Browser Script. from Silverlight"
~O6NT4xTQ0
Foreground="Red"></TextBlock>ITPUB个人空间.Ab%xFFW"u:Jec
</
StackPanel>
BTC(C,qG6mh!^0f!D0<
StackPanelOrientation="Horizontal">
pn3L9z0z'f xA0<
TextBoxx:Name="input"Width="340"Height="40"Margin="20 0 20 0"></TextBox>ITPUB个人空间,\ V}BL H
<
Buttonx:Name="submit"Width="120"Height="40"Background="Red"ITPUB个人空间6E2eUv@
Content="调 用"FontSize="20"Foreground="Red"Click="submit_Click"></Button>ITPUB个人空间)~H*e'T#M1D"D
</
StackPanel>ITPUB个人空间#gWrAu
</
StackPanel>

实现对脚本的调用:

private voidsubmit_Click(objectsender,RoutedEventArgse)ITPUB个人空间#zz"J&Nmp
{ITPUB个人空间:M];A&A7bt.E%BI:yi&eD
ScriptObjecthello =HtmlPage.Window.GetProperty("Hello")asScriptObject;ITPUB个人空间 I#w1mp/D$i+z0HUB7Y
hello.InvokeSelf(this.input.Text);ITPUB个人空间mk+_ B fY
}

ScriptObject提供了任何客户端脚 本的封装,不仅仅是JavaScript,使用其他的AJAX框架也可以,如jQuery等。然后调用InvokeSelf()方法,传入参数,这里 ScriptObject总共提供了两个方法,Invoke和InvokeSelf,如果我们只调用脚本对象的自身,就可以使用InvokeSelf,如 果脚本对象中还有其它的函数等,可以使用Invoke传入名称进行调用,两个方法的定义如下:

[SecuritySafeCritical]
y!V-I6p*CFq0public virtual objectInvoke(stringname,params object[] args);
twjUk&__vi2D0ITPUB个人空间;|`h/bZj
[SecuritySafeCritical]ITPUB个人空间5~KMI*}5ig
public virtual objectInvokeSelf(params object[] args);

运行上面的示例:ITPUB个人空间b/HK.I"Mn I
ITPUB个人空间+e;ic _.oJa
输入TerryLee后点击调用,可以看到确实调用了客户端脚本:ITPUB个人空间)?sfA7jSn
ITPUB个人空间U y U+k%b'QJZ

输入TerryLee后点击调用,可以看到确实调用了客户端脚本:
&TY9`Gd5X,J-~+[0
_G/z4y4e%s.rL3xwO0

使用CreateInstance创建脚本对象

除了使用上面所说的使用HtmlPage.Window.GetProperty方法获取脚本对象之外,还有一种替代方法,即使用 HtmlPage.Window属性的CreateInstance方法。还是使用上面的示例,我们在测试页中加入如下一段脚本,使用prototype 为myHello添加了显示的功能:

<script.type="text/javascript">ITPUB个人空间9G
N!n!qf?
myHello =function(message)
$[#~%l w(sj.Fvh&Hh0{ITPUB个人空间Z|9s8l:{0E5q
this.Message = message;
5M6j`.cy&O6o*k0}
*mF,TP |7JVa0myHello.prototype.Display =function()
$hw;T7w7i:p7xW]$mD0{ITPUB个人空间7|'W&RKS(C!A
varresultSpan = $get("result");
l+Vh$cu]U4]%i0resultSpan.innerText ="Hello "+this.Message;
bA$daA+RQj s0}ITPUB个人空间d4\CKf9D:[7l
</script>

使用HtmlPage.Window.CreateInstance创建脚本对象

private voidsubmit_Click(objectsender,RoutedEventArgse)ITPUB个人空间6`0W
l1LS-AF!N5y`
{ITPUB个人空间(aS jN"]xc0G
ScriptObjectscript. =HtmlPage.Window.CreateInstance("myHello",this.input.Text);
%j-A/okD X3D w6A0ITPUB个人空间+}_OqrQ
objectresult = script.Invoke("Display");
9e!V!_{[%R0}

运行后的效果跟上面的示例是一样的,如:
2y5[_O"mO/n9|_N0ITPUB个人空间ys8[`8B|,V6kR_
输入文本信息后:ITPUB个人空间7R [I&?)B4y!J,m+J
ITPUB个人空间$E%Lf/UFpQ

使用HtmlPage.Window.Eval()

最后还有一种机制,就是使用HtmlPage.Window.Eval()方法,只要我们给该方法传入一段字符串,它都会作为JavaScript来执行。做一个简单的测试,我们再修改一下上面的示例代码:

private voidsubmit_Click(objectsender,RoutedEventArgse)ITPUB个人空间tj(@$Z7P
c
t
{
[r lw0pW,e? `W~0HtmlPage.Window.Eval(this.input.Text);
-I,Y?&r8jd$N%t0}

运行后我们在文本框中输入一段脚本alert('TerryLee');,效果如下所示:

既然HtmlPage.Window.Eval()可以执行一段脚本,并且将执行的结果以对象形式返回,我们可以使用它来获取DOM元素。如下面这段代码:

private voidsubmit_Click(objectsender,RoutedEventArgse)ITPUB个人空间I!R!R'Xi
{ITPUB个人空间1CJ v?M,f#HG
HtmlElementresult =HtmlPage.Window.Eval("document.getElementById('result')")asHtmlElement;ITPUB个人空间 N`L0B,s
ITPUB个人空间W:|.Ay|k$e
stringmessage = result.GetAttribute("innerHTML");
$xRP.zG"gicI8Y8w0HtmlPage.Window.Alert(message);ITPUB个人空间_Q IJ*m fb/m.bB
}

运行后效果如下,获取的result确实就是我们定义的div。
$]&U!^Ery#gy0
z `2b xE!eU9d0

对AJAX框架的支持

前面说过,ScriptObject不仅仅是对JavaScript的封装,也支持其它的AJAX框架,现在我们用jQuery来测试一下,编写一小段代码:

<script.type="text/javascript">ITPUB个人空间%~|;A3K8Mn
function
myHello(message)
@#W#ws\0{
/l%zi^ JiJ d%RR0$("#result").text("Hello "+ message);ITPUB个人空间_~Y)nh7y+p6q$Z
}ITPUB个人空间-v)wIt:s'{[6I
</script>

调用脚本

private voidsubmit_Click(objectsender,RoutedEventArgse)ITPUB个人空间&U4^,J3B9U3@+y	u+B,w7m
{ITPUB个人空间0w b5k;u4GG'B1pA
ScriptObjectscript. =HtmlPage.Window.GetProperty("myHello")asScriptObject;
p[%xxQ#SS u0
p2y|*B$xvX0script.InvokeSelf(this.input.Text);
(J-Uo)n i&l\0}

运行后的结果与前面的示例是一样的:ITPUB个人空间3J[3IN#l0d6i
ITPUB个人空间9[/H'Jl$de'_/u

结束语

本文介绍了在Silverlight中调用JavaScript的几种方法,下一篇我将介绍如何在JavaScript中调用Silverlight。

作者:TerryLeeITPUB个人空间r"^]E3~;ai#g K
出处:http://terrylee.cnblogs.com


3].q(TQ!VBi`Yn0


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar