从Silverlight调用JavaScript函数

7

我正试图从Silverlight控件中调用一个JavaScript函数(在我们的代码中)。我尝试使用以下方式调用:

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

但是却出现错误“Failed to Invoke: showPopup”。

我可以不出问题地调用HtmlPage.Window.Invoke("alert", new string[]{"test"});,但不能调用自己的函数。

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

因此,js函数有效,Silverlight二进制文件也可以找到其他js函数。我错过了什么?

附加说明:

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

你有没有想过为什么我不能执行HtmlPage.Window.Invoke("document.getElementById("LogoutButton").click();")呢? - John Zabroski
6个回答

2

showPopup JavaScript函数是否与Silverlight控件在同一HTML或ASPX页面上?如果JavaScript函数不存在,通常会出现“无法调用...”错误:

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

alt text

您在遇到此问题时使用的是哪个浏览器?

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

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

能否提供一个简短但完整的程序代码列表,以使该问题在您的计算机上发生...


2
哎呀!我弄明白了。我们的应用程序使用了一个iframe,因此渲染出来的HTML看起来像这样:
<html>
<head></head>
<body>
Stuff
<iframe>
    <html>
        <head></head>
        <body>Other Stuff</body>
    </html>
</iframe>
<body>
</html>

而涉及的Silverlight控件位于iframe中。问题在于包含showPopup函数的文件被引用在外部的标签中(这就是为什么我可以在IE工具栏中调用该函数),但没有被引用在内部的标签中。在iframe内的标签中添加对该文件的引用解决了问题。
有点反高潮,但感谢您的所有帮助。

2

从iframe再次引用脚本并不是引用父级中包含的代码的最有效方法。如果您的函数名为"showPopup",您可以在iframe中插入以下内容:

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

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

干杯!


0
我在VS 2010和SL 4中遇到了同样的问题。我创建了一些方法并将它们放入一个JS文件中。然而,这个文件没有被添加到ASPX文件的头部。添加后问题得到解决。不同之处在于,虽然我在iframe中没有单独的头部部分,但我仍然遇到了问题,并且问题得到了解决。

0

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


这一切都发生在页面(和所有脚本)加载完成之后。已编辑问题以反映这一点。谢谢。 - Ryan

0

这是我的做法。但我是在没有使用Visual Studio的情况下创建Silverlight应用程序的。我只有原始的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.');
};

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接