XBAPのBrowserInteropHelper.HostScriptから使用できないカスタム関数

私はTWAINイメージを取得するためにXBAPを使用しようとしていますが、それほど遠慮していません。私は、HostInteropHelper.HostScriptを取得して、ホストページのjavascriptに戻ることができないようです。

  • 私は、iframe内にXBAPを実行しています。
  • 私は(それが要件でなければなりませんが)完全な信頼を試します。
  • 私はIE9でテストしています、.NET Frameworkの4.0ます。
  • BrowserInteropHelper.HostScriptがnullでない、私は.Close(のような通常のウィンドウ法を使用することができる)。

私のコードは次のようになります:

Index.html:


My cat's breath smells like cat food.

<script type="text/javascript"> function WorkDamnit() { $('#someP').hide(); } </script> <iframe src="@Url.Content("~/XBAPs/WPFBrowserApplication1.xbap")" style="border: none;" width="500" height="500" />

Page1.xaml.cs:

private void Button_Click(object sender, RoutedEventArgs e)
{
    if (BrowserInteropHelper.HostScript == null)
        throw new ApplicationException("hostscript is null");
    else
        BrowserInteropHelper.HostScript.WorkDamnit();
}

私は得る:

System.MissingMethodException: Method '[object Window].WorkDamnit' not found.

新しい情報:

このシナリオは、ネットワーク上の他のPCから正常に動作し、その理由がわかりました。 IE9には、デフォルトで「互換性ビューでイントラネットサイトを表示する」という設定が有効になっています。これにより、ページが「IE7モード」でレンダリングされ、javascript関数がXBAPから使用可能になります。ドキュメントモード:(F12開発ツールコンソールの下)をクリックしてIE9モードに切り替えると、上記のように機能しなくなります。自分のPC上では、デフォルトでIE9モードを使用しています(それはすべきです)。手動でIE7モードに切り替えるまで動作しません。

3

6 答え

IE9では、ウィンドウメソッドが用意されているので、setTimeout

BrowserInteropHelper.HostScript.setTimeout("WorkDamnit()",0);
3
追加された

これはかなり事実の後ではかなりですが、私はこの問題に対処したのでチャイムインしたいと思っています。それは醜いものです。

ご覧のとおり、互換モードで動作しているため、動作しているマシンは動作します。互換性モードを使用してページをレンダリングするようにIE9に指示するには、次のタグをHTMLドキュメントに追加します。

<meta http-equiv="X-UA-Compatible" content="IE=8"/>

私は、このタグを追加することがあなたの唯一の解決策であると確信しています。私はもっ​​と良いものを探して何週間も過ごしましたが、これはまだ私が悩んでいるものです。

何らかの理由で ScriptInteropHelper がIE9で問題を抱えています。マイクロソフトの関心を引いているわけではありません。機能が不明確なためです。それは特に、IE7とIE8にはあらゆる種類の欠点があるため、互換モードで実行する必要があることは非常に面倒です。たとえば、 this oneここにリンクの説明を入力してください。

1
追加された
最後に、私はActiveXスキャンコントロールを使いました。それは動作し、私は互換モードを使用するよう強制しません(また、私はそれがほとんどのブラウザで動作するように、アクティブxとnpapiのバージョンを持っているものを見つけました)。 Silverlightはまだサポートされていますが、XBAPは忘れられているようです。
追加された 著者 Luggage,
こんにちは荷物、私はあなたが選んだActiveXコントロールを知っているかもしれませんか?
追加された 著者 Windy,

IE9は、互換モードでない限り、 BrowserInteropHelper.HostScript を公開しません。

1
追加された

IEのセキュリティ設定によるものです。 ページがローカルドライブから開かれている場合、IEはデフォルトでスクリプトをブロックします。 IEは、「あなたのセキュリティを保護するために、Internet Explorerが制限されています....」という警告メッセージを表示する必要があります。

However you can change the settings
Check the checkbox "Allow active content to run in files on My Computer"

IE settings

1
追加された
このオプションをチェックすることはできませんでしたが、ここでは他のいくつかのワークステーション(Win7/IE9とXP/IE8)で作業していますので、正しい軌道に乗っているかもしれません。私はちょうど、なぜこれが動作することを許可していないのか、私のPC上に何らかの兆候があることを望みます。
追加された 著者 Luggage,
私はスクリプトが実行されている(そして実行されている)ので、そのオプションは当てはまるとは思わない。私はXBAPから関数にアクセスできません。 file:// URIから直接hmtlファイルを開くと、スクリプトの警告が出ます。
追加された 著者 Luggage,
ありがとうございますが、この問題は発生していません。 「アクティブなコンテンツを許可する」は私の問題には影響しません。互換モードのみです。
追加された 著者 Luggage,
これを解決するもう1つの方法は、htmlページにMark of the web(MOTW)を追加することです。 msdn.microsoft.com/en-us/library/ms537628(v = vs.85).aspx
追加された 著者 meetjaydeep,

誰かがこの問題についてまだ疑問を持っているなら、私は解決策を見つけました。基本的には、ドキュメントオブジェクトから、最新のブラウザやHTML5のdoctypeでハックせずに適切に通信できます。

私はコードと例を含むブログ記事を書いた:

IE9以上のXBAPとJavascript - MissingMethodException問題の解決策

すぐにこれが正しく動作することを説明しました:

Javascript

document.ResponseData = function (responseData) {
    alert(responseData);
}

C#XBAP

var hostScript = BrowserInteropHelper.HostScript;
hostScript.document.ResponseData("Hello World");

C#オブジェクトをJavascriptに渡し、 "プロキシ"オブジェクトとして使用することができます。それがどのように使用できるかについては、そのブログの投稿をチェックしてください。

1
追加された
BrowserInteropHelper.HostScript の代わりに BrowserInteropHelper.HostScript.document を使用するだけですか?
追加された 著者 Luggage,
ではない正確に。ドキュメントオブジェクトへの関数の拡張は、C#からBrowserInteropHelper.HostScript.documentを通じて呼び出すことができます。
追加された 著者 Tuukka Lindroos,

BrowserInteropHelper.HostScript.setTimeout( "WorkDamnit()"、0);

その仕事がjsにコールバック関数を送信したい場合はどうすればsetTimeoutでオブジェクトを送信できますか?


ie8を使用する場合 その良い仕事

dynamic host = BrowserInteropHelper.HostScript;
host.sampleJSFunction(new CallbackObject(this));
0
追加された
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript