2016-09-27 6 views
1

다음과 같은 자바 스크립트가 webengine에서 실행되었습니다. 출처 : Execute a Javascript function for a WebView from a JavaFX programJavaFX의 자바 스크립트에서 액세스 반환 값

이 자바 스크립트는 웹 사이트의 특정 단어를 강조 표시합니다.

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');"); 
     } 
    } 
}); 

나는 웹 사이트가 특정 단어를 포함하고 나는 그것이 잘 작동하고 단어를 강조하기 때문에이 코드는 좋은 출발점이 될 것입니다 생각인지 확인하고 싶습니다. 지금 필요한 것은 자바 스크립트가 강조 표시 될 때 계산해야한다는 것입니다. 그런 다음 단어가 포함되어 있으면 (counter> = 1) JavaFX에서 액세스 할 수있는 부울 반환 값을 가져 오려고합니다.

나는 몇 가지 시도했지만 실제로 스크립트 외부에서 액세스 할 수있는 카운터와 반환 값을 추가하기 위해 스크립트를 중립화하는 방법을 모른다.

모두 읽어 주셔서 감사합니다.

답변

0

executeScript을 사용하는 경우 평가 결과는 메소드의 javadoc에 기록 된 규칙에 따라 반환됩니다. 또한 javadoc of WebEngine은이 가능성에 대해 알려줍니다.

실행 결과는 다음 규칙을 사용하여 자바 객체로 변환 :

  • 자바 스크립트 INT32은 java.lang.Double에
  • 로하는 java.lang.Integer에
  • 다른 자바 스크립트 숫자를 변환됩니다
  • JavaScript 문자열 to java.lang.String
  • JavaScript 부울 to java.lang.Boolean
  • JavaScript는 null에서 n입니다. ULL
  • 대부분의 자바 스크립트 객체는 구현이, netscape.javascript.JSObject를 인스턴스에 매핑되는 netscape.javascript.JSObject를
  • 자바 스크립트 JSNode 개체로 포장받을 org.w3c.dom.Node

  • 특수를 자바 객체를 자바 스크립트 값으로 랩핑하는 데 사용되는 자바 스크립트 클래스 인 JavaRuntimeObject가 있습니다.이 경우에는 은 원래 자바 값을 추출하기 만합니다. 자바 스크립트 스크립트가 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 

강조 표시된 항목마다 증가하는 카운터 변수 만 추가 한 다음 마지막으로이 변수가 반환됩니다.