【问题标题】:Calling A Javascript function from Silverlight从 Silverlight 调用 Javascript 函数
【发布时间】:2019-03-01 13:00:28
【问题描述】:

我正在尝试从 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 函数。我在这里错过了什么?

补充说明:

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

【问题讨论】:

  • 知道为什么我不能做 HtmlPage.Window.Invoke("document.getElementById(\"LogoutButton\").click();") 吗?

标签: javascript silverlight


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    干杯!

    【讨论】:

      【解决方案3】:

      showPopup javascript 函数是否与 Silverlight 控件位于同一 html 或 aspx 页面上?如果 javascript 函数不存在,您通常会收到“调用失败...”错误:

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

      当您遇到此问题时,您使用的是什么浏览器?

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这一切都发生在页面(和所有脚本)加载之后。编辑问题以反映这一点。不过还是谢谢。
        【解决方案5】:

        这就是我的做法。但我正在创建没有视觉工作室的 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.');
        };
        

        }

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多