2009-02-10 15 views
7

Próbuję wywołać funkcję javascript (w naszym kodzie) z kontrolki silverlight. Ja próbuje wywołać funkcję poprzez:Wywołanie funkcji JavaScript z Silverlight

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

i pojawia się błąd "Failed to Wywołanie: showPopup"

mogę zadzwonić HtmlPage.Window.Invoke("alert", new string[]{"test"}); bez problemu, ale nie moją własną funkcję.

Mogę również otworzyć daną stronę w narzędziach programistycznych IE i ręcznie zadzwonić pod numer showPopup("http://www.example.com") i działa zgodnie z oczekiwaniami.

Funkcja js działa, a plik binarny Silverlight może znaleźć inne funkcje js. Czego tu mi brakuje?

Dodatkowe Uwagi:

  • Wywołanie funkcji jest w obsługi zdarzeń przycisk click, więc zdarza się po stronie (i scenariusza) zostały załadowane)
+0

Każdy pomysł, dlaczego nie mogę zrobić HtmlPage.Window.Invoke ("document.getElementById (\" LogoutButton \ "). Click();")? –

Odpowiedz

2

Aha! Rozgryzłem to. Nasza aplikacja wykorzystuje iframe, więc renderowane html wygląda tak

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

I Silverlight kontrola którym mowa jest w iframe. Problem polegał na tym, że plik zawierający funkcję showPopup został wymieniony w zewnętrznej <head> (dlaczego mógłbym wywołać funkcję za pomocą paska narzędziowego IE), ale nie wewnętrznego <head>. Dodanie odwołania do pliku w elemencie if-if <head> rozwiązało problem.

Coś antyklimaktycznego, ale dzięki za pomoc.

0

upewnić się, że skrypt jest pełne ładowanie przed próbą wywołania z niego funkcji.

+0

Wszystko to dzieje się po wczytaniu strony (i wszystkich skryptów). Edytował pytanie, aby to odzwierciedlić. W każdym razie dzięki. – Ryan

2

Czy funkcja showPopup javascript jest dostępna na tej samej stronie HTML lub aspx, co kontrolka Silverlight? Będziesz normalnie uzyskać „Nie udało się powołać ...” błąd, jeśli funkcja javascript nie istnieje:

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

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

Jakiej przeglądarki używasz, gdy otrzymujesz ten problem?

Czy używasz najnowszej wersji Silverlight?

Czy używasz atrybutu ScriptableType w dowolnym miejscu?

Czy można wymienić kod na krótki, ale kompletny program, który powoduje ten problem się stało na komputerze ...

2

Właściwe odwoływanie się do skryptu od elementu iframe nie jest najskuteczniejszym sposobem odwołania się do kodu zawartego w elemencie macierzystym. Jeśli funkcja nazywa się „showPopup”, można wstawić to w iframe:

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

i voila. Wyjaśnienie tego jest takie, że wszystkie "globalne" funkcje i obiekty są częścią tego "globalnego obszaru nazw" ... który jest obiektem "okna".Więc jeśli próbujesz uzyskać dostęp do funkcji "globalnych" z potomka, musisz albo wywołać funkcję na rodzicu (np. Parent.showPopup ("....")) lub zadeklarować dla niej lokalny alias (który jest co robimy w powyższym przykładzie).

Pozdrawiam!

0

Oto jak to zrobić. Ale tworzę silverlight bez wizualnego studio. Mam tylko surowy html, xaml i js (javascript). Zauważ MouseLeftButtonUp i jest to wartość "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

Miałem ten sam problem w VS 2010 z SL 4. Stworzyłem kilka metod i umieściłem je w jednym pliku JS. Jednak ten plik nie został dodany do głównej sekcji pliku ASPX. Dodanie go rozwiązało problem. Różnica polega na tym, że chociaż nie mam oddzielnej sekcji head w elemencie iframe, miałem problem i został rozwiązany.

Powiązane problemy