2012-02-08 12 views
8

Tenía una aplicación de Windows Forms que usaba un control WebBrowser (.NET 4) para cargar una página web que se comunicaba con la aplicación. Tuve una llamada al InvokeScript() para llamar a una rutina de Javascript en la página web en un punto.Cómo llamar a una función jQuery desde el control .NET WebBrowser utilizando InvokeScript()?

Ahora las cosas se han "actualizado", y jQuery ahora se está utilizando. Por lo tanto, en lugar de tener una función OnVenueSelected() para llamar, ahora es una rareza de $.city.venue.onVenueSelected: function(param).

Simplemente cambiando mi llamada de InvokeScript("OnVenueSelected", new object[] { params }) a InvokeScript("$.city.venue.onVenueSelected", new object[] { params }) no funcionó. No obtengo ningún error o excepción observable, pero la lógica de la llamada no se invoca.

Algunas búsquedas me han tratado de usar eval como la llamada y pasar el nombre y los parámetros de la función como la cadena a eval. Eso tampoco funcionó.

¿Hay alguna forma conocida de invocar una función que esté integrada en un par de capas de jQuery magic?

Gracias.

Respuesta

7

OK - Tengo que responder mi propia pregunta. Gracias en parte a la respuesta por al How to call a jQuery function from .NET WebBrowser control using InvokeScript()?, yo era capaz de cambiar mi llamada a la función jQuery para

string[] codeString = { String.Format(" {0}('{1}') ", @"$.city.venue.onVenueSelected", result.ToString()) }; 
this.myBrowser.Document.InvokeScript("eval", codeString); 

Sorprendentemente, esto parece estar funcionando.

En mi caso, la variable de resultado es del tipo bool (en caso de que le importe a alguien).

+1

@GuysWithDogs Te he dado un método alternativo en caso de que éste se decepciona en algún momento, tal vez mi puesto de un trazador de líneas en los comentarios de su código por encima de la .InvokeScript - aunque si Tendría que elegir, usaría InvokeScript como primer plan, pero el que he proporcionado también funciona con las versiones de pre.NET del control de WB. Espero que te vaya bien, amigo, aplausos, Erx. –

1

Sí, esa es probablemente la forma más rápida de hacerlo, porque el 'invocación' simplemente necesita el nombre de una función global. Entonces, después de empujar las funciones hacia abajo en algunas estructuras, y de poder llamarlas a través de InvokeScript de una manera "más bonita", tendría que, por ejemplo, escribir un único contenedor GLOBAL (un "despachador" sería un mejor nombre), similar al:

function callme(what, args) { 
    var actualfunction = eval(what); // or any other way to parse the 'what' and get a function 
    return actualfunction(args); 
} 

y más tarde lo llaman:

  • de JS:

    callme("$.city.venue.onVenueSelected", ..args..) 
    

    (pero realmente no sé por qué lo que pueda desear para llamarlo de JS :))

  • y desde CS:

    browser.InvokeScript("callme", new string[]{ "$.city.venue.onVenueSelected", ..args.. }) 
    

esta manera, creo que sería capaz de pasar objetos como argumentos de la función directamente, sin stringifying ellos

..pero de mi experiencia, en> 80% de los casos, solo necesita pasar algunos números simples y cadenas o indicadores de configuración, por lo que toda esa molestia suele ser simplemente un código de hinchamiento

2

Para aquellos que no lo saben, puede n también use .execScript en versiones de pre.NET del control de WB y versiones actuales/.NET del control de WB. También puede elegir el idioma del script que desea ejecutar, es decir: "JScript" o "VBScript".Aquí está el chiste:

WebBrowser1.Document.parentWindow.execScript "alert('hello world');", "JScript" 
Cuestiones relacionadas