.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">
[$k4I9v\0function
Hello(message)ITPUB个人空间QHmw ["K?6Q
{ITPUB个人空间6L{C?*o~W].C
varresultSpan = $get("result");
4n%Q$zfkT f0resultSpan.innerText ="Hello "+ message;ITPUB个人空间\%W |3a'Zf;G}:CM v~
}
~S R(G&owr_0</script>

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

<StackPanelBackground="#CDFCAE"Orientation="Vertical">ITPUB个人空间+F7lg
\HZ%] ri%]L
<
StackPanelHeight="40">ITPUB个人空间6]TI @p{+V
<
TextBlockText="Calling Browser Script. from Silverlight"
'{/BdGSV9L']9A0
Foreground="Red"></TextBlock>ITPUB个人空间\6l7Tz]4Xo
</
StackPanel>ITPUB个人空间7e|v!`a Y(u
<
StackPanelOrientation="Horizontal">ITPUB个人空间a\g.Mj5z0V+P%z
<
TextBoxx:Name="input"Width="340"Height="40"Margin="20 0 20 0"></TextBox>ITPUB个人空间PUw}2]6a4@
<
Buttonx:Name="submit"Width="120"Height="40"Background="Red"ITPUB个人空间+t1kqv id
Content="调 用"FontSize="20"Foreground="Red"Click="submit_Click"></Button>ITPUB个人空间(u }wz-x S(Y6J Q7~
</
StackPanel>
`4[t9~[ f N0</
StackPanel>

实现对脚本的调用:

private voidsubmit_Click(objectsender,RoutedEventArgse)ITPUB个人空间-~7Y"lY}q+h
{
3^{Qe4\%F0ScriptObjecthello =HtmlPage.Window.GetProperty("Hello")asScriptObject;ITPUB个人空间B?F-_8O zo
hello.InvokeSelf(this.input.Text);
l,Y1l,Z{GNu%h|9^0}

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

[SecuritySafeCritical]
XI4};@:R%|Y2p\0public virtual objectInvoke(stringname,params object[] args);ITPUB个人空间Q kB` ]LEau
ITPUB个人空间I7i-W eX;N
[SecuritySafeCritical]ITPUB个人空间8u`3cq*L4t
public virtual objectInvokeSelf(params object[] args);

运行上面的示例:
+_*i N:Y(J] O zn0
R8~#J v``7|L0输入TerryLee后点击调用,可以看到确实调用了客户端脚本:ITPUB个人空间m@tM6I` Z;v
ITPUB个人空间]}$q#g!N9g

输入TerryLee后点击调用,可以看到确实调用了客户端脚本:ITPUB个人空间L"sO#^1^4X

2YFs_!Y0_0

使用CreateInstance创建脚本对象

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

<script.type="text/javascript">
;Dv-i5y@%uAHH]0
myHello =function(message)
[Yj4i+]Gl%AtL0{
9g+G6bCR'm-D0this.Message = message;ITPUB个人空间 b}7{,jj{Z
}
-rE(|T2Oh$Cl7G0myHello.prototype.Display =function()ITPUB个人空间N){!Xu%[
{
$e@m_B0f0varresultSpan = $get("result");ITPUB个人空间{:[ kH@'F+W
resultSpan.innerText ="Hello "+this.Message;
V$W)SSX4g0}
5` @&R8M d7`0</script>

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

private voidsubmit_Click(objectsender,RoutedEventArgse)ITPUB个人空间.I:gl1O%JJO
{ITPUB个人空间/[;j$]#O ei~s
ScriptObjectscript. =HtmlPage.Window.CreateInstance("myHello",this.input.Text);ITPUB个人空间/e-n3c:qP\ZS1Qw

d;x!I8Y3P$xYR"K0objectresult = script.Invoke("Display");
;tSP@3i zV K:Yq&V0}

运行后的效果跟上面的示例是一样的,如:ITPUB个人空间7bO$L{$r
ITPUB个人空间%qBmE qk s`L!\
输入文本信息后:ITPUB个人空间Z;f k+u Y ~U

-M4T0B1VK|%q0

使用HtmlPage.Window.Eval()

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

private voidsubmit_Click(objectsender,RoutedEventArgse)ITPUB个人空间Zb HVy
{
&~|g TE0HtmlPage.Window.Eval(this.input.Text);ITPUB个人空间7H8vV9d]-NE8d
}

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

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

private voidsubmit_Click(objectsender,RoutedEventArgse)
:Sf.aM*N^0{
rB&Z,i@y&{0HtmlElementresult =HtmlPage.Window.Eval("document.getElementById('result')")asHtmlElement;
N_Ec;^A's0
H0|lh&x2H&n0stringmessage = result.GetAttribute("innerHTML");
Ig6wv t+G-Px0HtmlPage.Window.Alert(message);ITPUB个人空间 KHGv8p&Oo%_
}

运行后效果如下,获取的result确实就是我们定义的div。
.a)?I7pw*_;c0ITPUB个人空间)G0q"g_&Mw(U+D

对AJAX框架的支持

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

<script.type="text/javascript">ITPUB个人空间L*SR-s-T
function
myHello(message)
%l!W&K/F!LBg7|3X8\0{
B8])X1PPMo5H|0$("#result").text("Hello "+ message);ITPUB个人空间8I&IW|9I'V/A
}ITPUB个人空间'[!d TQ4r.?N%X
</script>

调用脚本

private voidsubmit_Click(objectsender,RoutedEventArgse)
t KJ)cerLe"n0{ITPUB个人空间 j S+R8d`s0nn-P
ScriptObjectscript. =HtmlPage.Window.GetProperty("myHello")asScriptObject;
l.Eg'|-iu|$]8Bz0ITPUB个人空间X*A8Y G ru
script.InvokeSelf(this.input.Text);
Kl$^I*U Q0}

运行后的结果与前面的示例是一样的:
q` e5O*g Z-_1A|rV0
(F,n7W1bP*[,H^8o1i0

结束语

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

作者:TerryLee
a0lF:a6wz(nJ(iu0出处:http://terrylee.cnblogs.com


;l"V"z[ Dr"E2^2J]0


TAG:

 

评分:0

我来说两句

显示全部

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

日历

« 2008-07-25  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 26056
  • 日志数: 749
  • 影音数: 7
  • 文件数: 1
  • 建立时间: 2008-01-04
  • 更新时间: 2008-07-24

RSS订阅

Open Toolbar