ホビットまたはそこと後ろ
少し前に、javaアプリケーションで値を転送するために、jsとブラウザから変数を取得する方法を早急に見つける必要がありました。 残念なことに、この質問はハブで解決されなかったか、またはおそらく強さが私を残し、検索はそれほど簡単ではありません。
それがそうであっても、今日私はこの問題にいくつかの光を当てようとします。 それでは始めましょう!
挑戦する
簡単に説明すると、現在の状況を説明します-エディターとして無料のNiceEditがあるエディターとして、特定のアプリケーションがあります。 なぜ外部エディターなのか?エディターをすばやく作成する必要があり、ユーザーデータはhtmlとして表示され、バイクを書くのは十分に愚かです。 既製のウィジェットをswtに埋め込む試みがありましたが、プロジェクトが古くなっていたか、作成者が遅すぎたため、ウィジェットは機能しませんでした。
主な問題は、ユーザーがエディターでデータを入力/編集し、奇跡のボタンを押すと、アプリケーションが記述された内容を受け取る必要があることです。
UPD
どのようなアプリケーションの詳細について説明します。
これはスタンドアロンのEclipse RCPアプリケーションで、状況によりユーザーデータがhtml \ xml形式で表示されます。 このようなデータを作成するために、niceditが読み込まれたブラウザーでビューが作成され、ユーザーは好きなものをそこに書き込みました。 問題は、このデータをアプリケーションに戻すことでした。
解決策
判明したように、この問題には複数の解決策があります。
- メソッド番号1-JNI
頭に浮かんだ最も簡単で便利なことは、SWTアプリケーションに組み込まれたブラウザーで読み込まれるHTMLエディターでエディターテキストボックスを作成し、エディターをその上に設定することでした。
<script type="text/javascript"> var textArea; bkLib.onDomLoaded(function() { new nicEditor({fullPanel : true}).panelInstance('area1'); var el = document.getElementById('EDITOR').getElementsByTagName('div'); textArea = el[el.length-1]; }); </script>
さらにアプリケーション自体で、呼び出すネイティブ関数を作成する必要があります。
static class CustomFunction extends BrowserFunction { //CustomFunctionData data = new CustomFunctionData(null); public CustomFunction(Browser browser, String name) { super(browser, name); } public Object function(Object[] arguments) { templateText = (String) arguments[0]; return null; } }
新しいカスタムデータを作成すると出力が得られますが、この方法はstackowerflowで説明されています
関数のオブジェクトを作成します。
new CustomFunction(browser, "getTextAreaContent");
ブラウザから必要な関数を誇らしげに呼び出すことができます:
browser.execute("var cont = textArea.innerHTML; getTextAreaContent(cont);");
- メソッド番号2-スクリプトを作成し、ブラウザーを介して呼び出します(このコードは、stackowerflowで誰もが示す例です。ページ上のテキストの選択をキャッチし、アプリケーションに渡します)。
誰も私たちに変数を作成させ、そこに必要なスクリプトを書いて、それをブラウザを通して実行することを気にしません。 さらに、スクリプトはカスタムイベントを作成し、ブラウザのステータスを変更します。
final String SELECTIONSCRIPT = "function handleSelection() { " + " var selTxt = ''; " + " if (window.getSelection) { " + " selTxt = window.getSelection(); " + " } else if (document.getSelection) { " + " selTxt = document.getSelection(); " + " } else if (document.selection) { " + " selTxt = document.selection.createRange().text; " + " } " + " window.status = '::SELECTION::' + selTxt; " + "} " + "document.attachEvent('onmouseup', handleSelection); "; final Browser browser = new Browser(shell, SWT.NONE); browser.addStatusTextListener(new StatusTextListener() { public void changed(StatusTextEvent arg0) { if (arg0.text.startsWith("::SELECTION::")) { String selection = arg0.text.substring("::SELECTION::".length()); System.out.println(selection); } }}); browser.addProgressListener(new ProgressAdapter() { @Override public void completed(ProgressEvent arg0) { browser.execute(SELECTIONSCRIPT); } });
確かに、ここでは、さまざまなフォーラムで誰も言及していない落とし穴を待っています-すべてのブラウザーがユーザーの許可なしにウィンドウステータスをアプリケーションに変更できるわけではありません。 つまり、たとえばMozillaでは、about:configでフラグdom.disable_window_status_changeをfalseに設定する必要があります。
ここに私が知っている方法と使用した方法の両方があります...記事に関する新しいアイデアやコメントを読むことができてうれしいです。 ご清聴ありがとうございました。