2016-09-27 14 views
1

私は以下のJavascriptをWebエンジンで実行しています。 出典:Execute a Javascript function for a WebView from a JavaFX programJavaFXのJavaScriptからの戻り値

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

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が強調表示されるときにカウントする必要があるということです。 単語が含まれている場合(counter> = 1)、JavaFXでアクセスできるブール値の戻り値を取得します。

私はいくつかのことを試みましたが、実際には、スクリプトの外側にアクセスできるカウンタと戻り値を追加するためにスクリプトをミドル化する方法はわかりません。

ありがとうございます。

答えて

0

executeScriptを使用すると、メソッドのjavadocで記述されたルールに基づいて評価結果が返されます。また、javadoc of WebEngineはこの可能性についてあなたに通知します。

実行結果は、以下 ルールを使用してJavaオブジェクトに変換:

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

  • 特別にケースはJavaScriptクラスのJavaRuntimeObjectで、JavaオブジェクトをJavaScript値としてラップするために使用されます。この場合は、 は元の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 

強調表示された項目ごとに増分されるカウンタ変数を追加しただけで、最後にこの変数が返されます。

関連する問題