2009-02-10 12 views
7

Estoy intentando llamar a una función de Javascript (en nuestro código) desde un control Silverlight. Estoy intentando llamar a la función a través de:Llamar a una función de Javascript de Silverlight

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

y me sale el error "Error al invocar: ShowPopup"

puedo llamar HtmlPage.Window.Invoke("alert", new string[]{"test"}); sin ningún problema, pero no es mi propia función.

También puedo abrir la página en cuestión en las herramientas de desarrollador de IE y llamar manualmente al showPopup("http://www.example.com") y funciona como se esperaba.

Así que la función js funciona, y el binario de Silverlight puede encontrar otras funciones js. ¿Que me estoy perdiendo aqui?

Notas adicionales:

  • La llamada de función se encuentra en un controlador de eventos de clic de botón, lo que sucede después de la página (y el guión) se han cargado)
+0

Alguna idea de por qué no puedo hacer HtmlPage.Window.Invoke ("document.getElementById (\" LogoutButton \ "). Haga clic en();")? –

Respuesta

2

Aha! Me lo imaginé. Nuestra aplicación utiliza un iframe, por lo que el HTML representado ve algo como esto

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

y el control de Silverlight en cuestión está en el iframe. El problema era que el archivo que contenía la función showPopup estaba referenciado en el <head> externo (por qué podía llamar a la función con la barra de herramientas IE) pero no en el interior <head>. Agregar una referencia al archivo en el iframe <head> resolvió el problema.

Un poco anticlimático, pero gracias por toda la ayuda.

0

Asegúrese de que su guión es completamente cargada antes de intentar invocar funciones desde ella.

+0

Todo esto sucede después de que se haya cargado la página (y todos los scripts). Editó la pregunta para reflejar esto. Gracias sin embargo. – Ryan

2

¿La función javascript showPopup está en la misma página html o aspx que el control Silverlight? Usted normalmente recibe el "Error al invocar ..." error si la función de JavaScript no existe:

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

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

¿Qué navegador está usando cuando se está recibiendo este problema?

¿Estás utilizando la última versión de Silverlight?

¿Está utilizando ScriptableType attrbiute en cualquier lugar?

¿Es posible enumerar el código de un corto pero completo programa que causa este problema a suceder en su máquina ...

2

En realidad, volver a hacer referencia al script desde el iframe no es la forma más eficiente de referenciar el código contenido en el elemento primario. Si su función se denomina "ShowPopup", puede insertar esto en su iframe:

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

y listo. La explicación de esto es que todas las funciones y objetos "globales" son parte de este "espacio de nombre global" ... que es el objeto "ventana".Por lo tanto, si intenta acceder a las funciones "globales" de un niño, necesita llamar a la función del padre (por ejemplo, parent.showPopup ('....')) o declarar un alias local para él (que es lo que hacemos en el ejemplo anterior).

¡Salud!

0

Así es como lo hago. Pero estoy creando Silverlight sin Visual Studio. Solo tengo html, xaml y js sin formato (javascript). Nótese MouseLeftButtonUp y su valor "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

Tuve el mismo problema en VS 2010 con SL 4. Creé algunos métodos y los puse en un solo archivo JS. Sin embargo, este archivo no se ha agregado a la sección principal del archivo ASPX. Agregarlo resolvió el problema. La diferencia es que, aunque no tenía una sección principal separada en el iframe, tuve el problema y se resolvió.

Cuestiones relacionadas