8

アプリと通信する Web ページを読み込むために、WebBrowser コントロール (.NET 4) を使用する Windows フォーム アプリがありました。InvokeScript()ある時点で、Web ページで Javascript ルーチンを呼び出す呼び出しがありました。

現在は「更新」されており、jQuery が使用されています。OnVenueSelected()そのため、呼び出す関数を用意する代わりに、それは$.city.venue.onVenueSelected: function(param)奇妙なものになっています。

コールを から に変更するだけInvokeScript("OnVenueSelected", new object[] { params })InvokeScript("$.city.venue.onVenueSelected", new object[] { params })は機能しませんでした。観察可能なエラーや例外は発生しませんが、呼び出しのロジックは呼び出されません。

掘り下げてみるとeval、呼び出しとして使用して、関数名とパラメーターを文字列として に渡そうとしましたeval。それもうまくいきませんでした。

jQuery マジックのいくつかのレイヤーに埋め込まれた関数を呼び出す既知の方法はありますか?

ありがとう。

4

3 に答える 3

8

OK-私は自分の質問に答えることができます。InvokeScript()を使用して.NET WebBrowserコントロールからjQuery関数を呼び出す方法の回答に一部感謝し ますか?、jQuery関数の呼び出しを次のように変更できました

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

驚くべきことに、これは機能しているようです。

私の場合、結果変数は型ですbool(誰にとっても重要な場合)。

于 2012-02-08T19:13:58.870 に答える
2

ご存じないかもしれませんが、WB コントロールの .NET 以前のバージョンと現在/.NET バージョンの WB コントロールで .execScript を使用することもできます。実行するスクリプトの言語を選択することもできます。つまり、「JScript」または「VBScript」です。これがワンライナーです:

WebBrowser1.Document.parentWindow.execScript "alert('hello world');", "JScript"
于 2012-02-11T22:19:21.390 に答える
1

'invokescript' にはグローバル関数の名前を指定する必要があるだけなので、おそらくこれが最も簡単な方法です。したがって、関数をいくつかの構造により深くプッシュした後、「よりきれいな」方法で InvokeScript を介して呼び出すことができるようにするには、たとえば、単一の GLOBAL ラッパーを作成する必要があります (「ディスパッチャー」はより適切な名前)、次のようになります。

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

そして後でそれを呼び出します:

  • JS から:

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

    (しかし、なぜJSからそれを呼び出したいのか本当にわかりません:))

  • そしてCSから:

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

このように、オブジェクトを文字列化せずに、関数の引数として直接渡すことができると思います

..しかし、私の経験から、ケースの 80% 以上では、いくつかの単純な数値と文字列またはセットアップ フラグを渡すだけでよいため、通常はコードが肥大化するだけで済みます。

于 2012-02-10T11:15:31.103 に答える