1

Web エンジンで次の Javascript を実行しています。ソース: JavaFX プログラムから WebView の Javascript 関数を実行する

この Javascript は、Web サイト上の特定の単語を強調表示します。

WebView webView = new WebView();
final WebEngine engine = webView.getEngine();
engine.load("https://stackoverflow.com/questions/14029964/execute-a-javascript-function-for-a-webview-from-a-javafx-program");

engine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
    @Override
    public void changed(ObservableValue ov, State oldState, State newState) {
        if (newState == State.SUCCEEDED) {
            engine.executeScript(
                "function highlightWord(root,word){"
                + "  textNodesUnder(root).forEach(highlightWords);"
                + ""
                + "  function textNodesUnder(root){"
                + "    var n,a=[],w=document.createTreeWalker(root,NodeFilter.SHOW_TEXT,null,false);"
                + "    while(n=w.nextNode()) a.push(n);"
                + "    return a;"
                + "  }"
                + ""
                + "  function highlightWords(n){"
                + "    for (var i; (i=n.nodeValue.indexOf(word,i)) > -1; n=after){"
                + "      var after = n.splitText(i+word.length);"
                + "      var highlighted = n.splitText(i);"
                + "      var span = document.createElement('span');"
                + "      span.style.backgroundColor='#f00';"
                + "      span.appendChild(highlighted);"
                + "      after.parentNode.insertBefore(span,after);"
                + "    }"
                + "  }"
                + "}"
                + "\n"
                + "highlightWord(document.body,'function');");
        }
    }
});

ウェブサイトに特定の単語が含まれているかどうかを確認したいのですが、このコードは適切に機能し、単語を強調表示するため、出発点として適していると思いました。私が今必要としているのは、強調表示するときに Javascript をカウントすることです。次に、単語が含まれている場合 (カウンター >= 1)、JavaFX でアクセスできるブール値の戻り値を取得したいと考えています。

いくつか試してみましたが、スクリプトを変更して、スクリプトの外部からアクセスできるカウンターと戻り値を追加する方法が本当にわかりません。

読んでくれてありがとう。

4

1 に答える 1

0

使用時executeScriptはメソッドのjavadocに書かれているルールに基づいて評価結果が返されます。また、のjavadoc はWebEngine、この可能性について通知します。

実行結果は、次の規則を使用して Java オブジェクトに変換されます。

  • JavaScript Int32 は java.lang.Integer に変換されます
  • java.lang.Double に対するその他の JavaScript 番号
  • JavaScript 文字列から java.lang.String へ
  • JavaScript ブール値から java.lang.Boolean へ
  • JavaScript null から null
  • ほとんどの JavaScript オブジェクトは netscape.javascript.JSObject としてラップされます
  • JavaScript JSNode オブジェクトは、org.w3c.dom.Node も実装する netscape.javascript.JSObject のインスタンスにマップされます。

  • 特殊なケースは、Java オブジェクトを JavaScript 値としてラップするために使用される JavaScript クラス JavaRuntimeObject です。この場合、元の Java 値を抽出するだけです。

したがって、JavaScript スクリプトが Int32 を返す場合は、次のように取得できます。

Integer executeScript = (Integer) engine.executeScript(...);

更新された例(例):

Integer numOfHighlights = (Integer) engine.executeScript(
    "function highlightWord(root,word){"
    + "  count = 0;"
    + "  textNodesUnder(root).forEach(highlightWords);"
    + ""
    + "  function textNodesUnder(root){"
    + "    var n,a=[],w=document.createTreeWalker(root,NodeFilter.SHOW_TEXT,null,false);"
    + "    while(n=w.nextNode()) a.push(n);"
    + "    return a;"
    + "  }"
    + ""
    + "  function highlightWords(n){"
    + "    for (var i; (i=n.nodeValue.indexOf(word,i)) > -1; n=after){"
    + "      var after = n.splitText(i+word.length);"
    + "      var highlighted = n.splitText(i);"
    + "      var span = document.createElement('span');"
    + "      span.style.backgroundColor='#f00';"
    + "      span.appendChild(highlighted);"
    + "      after.parentNode.insertBefore(span,after);"
    + "      count = count + 1;"
    + "    }"
    + "  }"
    + "  return count;"
    + "}"
    + "\n"
    + "highlightWord(document.body,'execute');");

System.out.println("Number of highlights are: " + numOfHighlights);

出力

Number of highlights are: 9

強調表示された項目ごとにインクリメントされるカウンター変数のみを追加し、最終的にこの変数が返されます。

于 2016-09-27T13:40:14.720 に答える