2009-02-10 7 views
7

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

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

et je reçois l'erreur « Impossible de Invoke: 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. Donc, la fonction js fonctionne, et le binaire Silverlight peut trouver d'autres fonctions js. Qu'est-ce que j'oublie ici?

Notes complémentaires:

  • L'appel de fonction est un bouton gestionnaire d'événements de clic, il arrive après que la page (et le script) ont été chargés)
+0

Une idée de pourquoi je ne peux pas faire HtmlPage.Window.Invoke ("document.getElementById (\" LogoutButton \ "). Click();")? –

Répondre

2

Aha! Je l'ai compris. Notre application utilise un iframe, de sorte que le rendu HTML ressemble à ceci

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

Et le contrôle Silverlight en question est dans le iframe. Le problème était que le fichier qui contenait la fonction showPopup était référencé dans le <head> extérieur (pourquoi je pouvais appeler la fonction avec la barre d'outils IE) mais pas le <head> intérieur. Ajout d'une référence au fichier dans le dans-le-iframe <head> résolu le problème.

Un peu décevante, mais merci pour toute l'aide.

0

Vérifiez que votre script est complètement chargé avant d'essayer d'invoquer des fonctions de celui-ci.

+0

Tout se passe après le chargement de la page (et de tous les scripts). Edité la question pour refléter cela. Merci quand même. – Ryan

2

La fonction javascript de showPopup se trouve-t-elle sur la même page html ou aspx que le contrôle Silverlight? Vous obtiendriez normalement la « Impossible de Invoke ... » erreur 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 avez trouvé ce problème?

Utilisez-vous la dernière version de Silverlight?

Utilisez-vous l'attribut scriptableType n'importe où?

Est-il possible d'inscrire le code d'un programme court mais complet qui cause ce problème de se produire sur votre machine ...

2

Le fait de référencer à nouveau le script à 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 est appelée "showPopup", vous pouvez insérer dans votre iframe:

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

Et voilà. L'explication à cela 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 appeler la fonction sur le parent (par exemple, parent.showPopup ('....')) ou déclarer un alias local pour celui-ci (qui est ce que nous faisons dans l'exemple ci-dessus).

À la votre!

0

Voici comment je le fais. Mais je crée silverlight sans studio visuel. J'ai juste le HTML, le xaml et le 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.'); 
}; 

}

0

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

Questions connexes