2016-09-27 6 views
1

У меня есть следующий Javascript, выполненный на веб-сайте. Execute a Javascript function for a WebView from a JavaFX programДоступ к возвращаемому значению с Javascript в JavaFX

Этот 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.Integer
  • Другие номера JavaScript для java.lang.Double
  • Строка JavaScript для java.lang.String
  • JavaScript boolean to java.lang.Boolean
  • JavaScript null to n объекты Улла
  • Большинство JavaScript получить завернутые в качестве объектов netscape.javascript.JSObject
  • JavaScript JSNode преобразуемых экземпляры netscape.javascript.JSObject, что также осуществлять org.w3c.dom.Node

  • Особого case - это класс 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 

Я добавил только переменную счетчика, которая увеличивается для каждого выделенного элемента, а затем, наконец, возвращаются эти переменные.