从Silverlight调用Javascript函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Silverlight调用Javascript函数相关的知识,希望对你有一定的参考价值。

我试图从silverlight控件调用一个javascript函数(在我们的代码中)。我试图通过以下方式调用该函数:

htmlPage.Window.Invoke("showPopup", new string[] { "http://www.example.com" });

我收到错误“无法调用:showPopup”

我可以毫无问题地打电话给HtmlPage.Window.Invoke("alert", new string[]{"test"});,但不是我自己的功能。

我还可以在IE开发人员工具中打开相关页面并手动调用showPopup("http://www.example.com"),它可以按预期工作。

所以js函数工作,Silverlight二进制文件可以找到其他js函数。我在这里错过了什么?

补充说明:

  • 函数调用在按钮单击事件处理程序中,因此它在页面(和脚本)加载后发生)
答案

啊哈!我想到了。我们的应用程序使用iframe,因此渲染的html看起来像这样

<html>
<head></head>
<body>
Stuff
<iframe>
    <html>
        <head></head>
        <body>Other Stuff</body>
    </html>
</iframe>
<body>
</html>

有问题的Silverlight控件在iframe中。问题是包含showPopup函数的文件在外部<head>中引用(为什么我可以用IE工具栏调用该函数)而不是内部<head>。在in-the-if​​rame <head>中添加对文件的引用解决了这个问题。

有点虎头蛇尾,但感谢所有的帮助。

另一答案

实际上,从iframe再次引用脚本并不是引用父代码中包含的代码的最有效方法。如果您的函数名为“showPopup”,则可以在iframe中插入:

<script type="text/javascript">
    var showPopup = parent.showPopup;
</script>

瞧。对此的解释是所有“全局”函数和对象都是这个“全局命名空间”的一部分......这是“窗口”对象。因此,如果您尝试从子级访问“全局”函数,则需要在父级上调用该函数(例如,parent.showPopup('....'))或为其声明一个本地别名(这是我们在上面的例子中做了什么)。

干杯!

另一答案

showPopup javascript函数与Silverlight控件位于同一个html或aspx页面上吗?如果javascript函数不存在,通常会出现“Failed to Invoke ...”错误:

HtmlPage.Window.Invoke("functionThatDoesNotExist", new [] { "Testing" });

alt text

当你遇到这个问题时,你使用什么浏览器?

您使用的是最新版本的Silverlight吗?

您是否在任何地方使用Scriptable Type属性?

是否可以列出一个简短但完整的程序代码,导致在您的机器上发生此问题...

另一答案

在尝试从中调用函数之前,请确保您的脚本已完全加载。

另一答案

这是我如何做到的。但我在没有视觉工作室的情况下创造了银光。我只有原始的html,xaml和js(javascript)。注意MouseLeftButtonUp和它的值“LandOnSpace”

        <Canvas x:Name="btnLandOnSpace" Background="LightGreen" MouseLeftButtonUp="LandOnSpace"
            Cursor="Hand" Canvas.Top ="0"  Width="70" Height="50"> 
            <TextBlock Text="LandOnSpace"  />
            </Canvas>

function LandOnSpace(sender, e) {  //on server
if (!ShipAnimateActive && !blnWaitingOnServer) {
    blnWaitingOnServer = true;
    RunServerFunction("/sqgame/getJSLLandOnSpace");
        ShowWaitingBox();
        };
else {
    alert('Waiting on server.');
};

}

另一答案

我在使用SL 4的VS 2010中遇到了同样的问题。我创建了一些方法并将它们放入一个单独的JS文件中。但是,此文件尚未添加到ASPX文件的head部分。添加它解决了这个问题。不同之处在于虽然我在iframe中没有单独的头部,但我遇到了问题而且它已经解决了。

以上是关于从Silverlight调用Javascript函数的主要内容,如果未能解决你的问题,请参考以下文章

从 Silverlight 客户端示例代码调用 WebSocket?

从Silverlight 4调用Communicator.UIAutomation

Silverlight播放器:点击按钮(html / javascript)将视频设置为全屏? [关闭]

如何使用 WCF 调用从客户端 windows phone 8.0 silverlight 返回对象的方法

Silverlight OpenRIA - 重复的请求

从 Silverlight 到 WCF 的图像文件