2009-02-10 71 views
7

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

其他注意事项:

  • 函数调用是一个按钮单击事件处理程序,所以它的页面(和脚本)后会被加载)
+0

任何想法,为什么我不能做HtmlPage.Window.Invoke(“document.getElementById(\”LogoutButton \“)。click();”)? – 2017-01-18 16:41:24

回答

2

啊哈!我想到了。我们的应用程序使用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>。在iframe <head>中添加对文件的引用可解决该问题。

排序的逆境,但感谢所有的帮助。

0

确保你的脚本在尝试从它调用函数之前完全加载。

+0

这一切都发生在页面(和所有脚本)被加载后。编辑这个问题来反映这一点。不过谢谢。 – Ryan 2009-02-10 21:14:25

2

与Silverlight控件相同的html或aspx页面上的showPopup JavaScript函数?你通常会得到“无法调用......”错误,如果javascript函数不存在:

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

alt text http://www.freeimagehosting.net/uploads/3ed38e3ce8.png

什么是你,当你收到此问题,使用的浏览器?

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

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

是否有可能列出代码,导致此问题,您的机器上出现一个简短而完整的程序...

2

实际上,从iframe再次引用脚本不是引用父代码中包含代码的最有效方法。如果你的功能被称为“showPopup”,你可以把它插入你的iframe中:

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

而且voilà。对此的解释是所有“全局”函数和对象都是这个“全局命名空间”的一部分......这是“窗口”对象。所以,如果你想从一个孩子访问“全局”函数,你需要调用父函数(例如parent.showPopup('....'))或者声明一个本地别名(这是在上面的例子中我们做了什么)。

干杯!

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.'); 
}; 

}

0

我在VS 2010和SL 4中遇到了同样的问题。我创建了几个方法,并将它们放入一个JS文件中。然而这个文件还没有被添加到ASPX文件的头部分。添加它解决了这个问题。不同的是,尽管我在iframe中没有单独的头部部分,但是我遇到了问题并且解决了问题。