Appeler une fonction Javascript depuis Silverlight

Je tente d'appeler une fonction javascript (dans notre code) à partir d'un contrôle Silverlight. Je tente d'appeler la fonction via:

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

Et je reçois l'erreur "Impossible d'invoquer: showPopup"

Je peux appeler HtmlPage.Window.Invoke("alert", new string[]{"test"}); Sans problème, mais pas ma propre fonction.

Je peux également ouvrir la page en question dans les outils de développement IE et appeler manuellement showPopup("http://www.example.com") et cela fonctionne comme prévu.

La fonction js fonctionne donc, et le binaire Silverlight peut trouver d'autres fonctions js. Qu'est-ce que j'oublie ici?

Notes complémentaires:

  • L'appel de fonction se trouve dans un gestionnaire d'événement de clic de bouton, donc il se produit après la chargement de la page (et du script)

Aha! Je l'ai compris. Notre application utilise un iframe, de sorte que le html rendu ressemble à quelque chose comme ça

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

Et le contrôle Silverlight en question se trouve dans l'iframe. Le problème était que le fichier contenant la fonction showPopup était référencé dans la <head> externe (pourquoi je pourrais appeler la fonction avec la barre d'outils IE) mais pas la <head> intérieure. L'ajout d'une référence au fichier dans l'if-trame <head> résolu le problème.

Un peu anticlimatique, mais merci pour toute l'aide.

En fait, référencer le script à nouveau à partir de l'iframe n'est pas le moyen le plus efficace de référencer le code contenu dans le parent. Si votre fonction s'appelle "ShowPopup", vous pouvez l'insérer dans votre iframe:

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

Et voilà. L'explication est que toutes les fonctions et objets "globaux" font partie de cet "espace de noms global" … qui est l'objet "fenêtre". Donc, si vous essayez d'accéder à des fonctions «globales» à partir d'un enfant, vous devez soit appeler la fonction sur le parent (p. Ex. Parent.showPopup ('….')) ou déclarer un alias local pour ce (c'est-à-dire Ce que nous faisons dans l'exemple ci-dessus).

À votre santé!

La fonction javascript showPopup sur la même page html ou aspx que le contrôle Silverlight? Vous obtiendrez normalement l'erreur "Failed to Invoke …" si la fonction javascript n'existe pas:

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

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

Quel navigateur utilisez-vous lorsque vous recevez ce problème?

Utilisez-vous la dernière version de Silverlight?

Utilisez-vous l'attrbiute ScriptableType n'importe où?

Est-il possible d'énumérer le code pour un programme court mais complet qui provoque ce problème sur votre machine …

Assurez-vous que votre script est entièrement chargé avant d'essayer d'en invoquer des fonctions.

Voici comment je le fais. Mais je crée Silverlight sans studio visuel. Je viens de créer un fichier html brut, xaml et js (javascript). Notez MouseLeftButtonUp et sa valeur "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.'); }; 

}

J'ai eu le même problème dans VS 2010 avec SL 4. J'avais créé quelques méthodes et les mettre dans un seul fichier JS. Cependant, ce fichier n'a pas été ajouté à la section tête du fichier ASPX. En l'ajoutant, il a résolu le problème. La différence est que, bien que je n'avais pas de section de tête séparée dans l'iframe, j'ai eu le problème et il a été résolu.