una tipos pasar parametros llamar funciones funcion desde archivo javascript silverlight

tipos - pasar parametros a una funcion javascript desde html



Llamar a una funciĆ³n Javascript desde Silverlight (6)

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

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

y aparece el error "Falló la invocación: showPopup"

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

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

Entonces 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 está en un controlador de evento de clic de botón, por lo que ocurre después de que se haya cargado la página (y el script).

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

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

texto alternativo http://www.freeimagehosting.net/uploads/3ed38e3ce8.png

¿Qué navegador estás usando cuando tienes este problema?

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

¿Estás usando el attrbiute de ScriptableType en cualquier lugar?

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


Asegúrese de que su script esté completamente cargado antes de intentar invocar funciones desde él.


Aha! Me lo imaginé. Nuestra aplicación utiliza un iframe, por lo que el html renderizado se 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 <head> interno. Agregar una referencia al archivo en el iframe <head> resolvió el problema.

Algo anticlimático, pero gracias por toda la ayuda.


En realidad, hacer referencia al guión nuevamente desde el iframe no es la forma más eficiente de referenciar el código contenido en el padre. Si su función se llama "showPopup", puede insertar esto en su iframe:

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

Y voilá. 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).

¡Aclamaciones!


Así es como lo hago. Pero estoy creando Silverlight sin Visual Studio. Solo tengo html, xaml y js sin formato (javascript). Observe 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.''); };

}


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ó.