2012-02-08 6 views
8

Aveva un'app Windows Form che utilizzava un controllo WebBrowser (.NET 4) per caricare una pagina Web che comunicava con l'app. Ho ricevuto una chiamata allo InvokeScript() per chiamare una routine Javascript nella pagina Web a un certo punto.Come chiamare una funzione jQuery da .NET Controllo WebBrowser usando InvokeScript()?

Ora le cose sono state "aggiornate" e jQuery è ora in uso. Quindi, invece di avere una funzione OnVenueSelected() da chiamare, ora c'è un po 'di stranezza $.city.venue.onVenueSelected: function(param).

La semplice modifica della chiamata da InvokeScript("OnVenueSelected", new object[] { params }) a InvokeScript("$.city.venue.onVenueSelected", new object[] { params }) non ha funzionato. Non ricevo errori o eccezioni osservabili, ma la logica della chiamata non viene invocata.

Un po 'di scavo mi ha fatto provare a usare eval come chiamata e passare il nome della funzione e i parametri come stringa a eval. Neanche questo ha funzionato.

Esiste un modo noto per invocare una funzione incorporata in un paio di livelli di magia jQuery?

Grazie.

risposta

7

OK - Devo rispondere alla mia domanda. Grazie anche alla risposta da a How to call a jQuery function from .NET WebBrowser control using InvokeScript()?, sono stato in grado di cambiare la mia chiamata alla funzione jQuery per

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

Abbastanza sorprendentemente, questo sembra funzionare.

Nel mio caso, la variabile di risultato è di tipo bool (nel caso che sia importante per chiunque).

+1

@GuysWithDogs Ti ho dato un metodo alternativo nel caso in cui questo si delude ad un certo punto, forse inviare il mio uno di linea nei commenti del codice sopra il .InvokeScript - anche se se Dovrei scegliere, userei InvokeScript come primo piano, ma quello che ho fornito funziona anche con le versioni pre.NET del controllo WB. Spero che tutto vada bene per te, amico, Erx. –

1

Sì, questo è probabilmente il modo più rapido per farlo, perché l''invokescript' deve semplicemente avere un nome di una funzione globale. Quindi, dopo aver spinto le funzioni più in profondità in alcune strutture e essere ancora in grado di chiamarle tramite InvokeScript in un modo "più carino", dovresti, ad esempio, scrivere un singolo wrapper GLOBAL (un 'dispatcher' sarebbe un nome migliore), simile a quello:

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

e poi lo chiamano:

  • da JS:

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

    (ma io non conoscere veramente il motivo per cui si potrebbe desiderare di chiamare da JS :))

  • e da CS:

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

in questo modo, penso che si sarebbe in grado di passare gli oggetti come argomenti delle funzioni direttamente, senza stringifying loro

..ma dalla mia esperienza, in> 80% dei casi, è sufficiente passare alcuni numeri semplici e stringhe o flag di impostazione, quindi tutto ciò che di solito è solo un codice gonfia

2

Per quelli che potrebbero non essere a conoscenza, si ca n utilizzare anche .execScript nelle versioni pre.NET del controllo WB e nelle versioni correnti/.NET del controllo WB. È inoltre possibile scegliere la lingua dello script che si desidera eseguire, ad esempio: "JScript" o "VBScript".Ecco l'uno di linea:

WebBrowser1.Document.parentWindow.execScript "alert('hello world');", "JScript" 
Problemi correlati