2009-02-10 97 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中沒有單獨的頭部部分,但是我遇到了問題並且解決了問題。