我在网络引擎中执行了以下 Javascript。 来源:Execute a Javascript function for a WebView from a JavaFX program
此 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 在突出显示时应该计数。 然后,如果包含一个单词(计数器 >= 1),我想获得一个 boolean 返回值,我可以在 JavaFX 中访问该值。
我尝试了一些东西,但我真的不知道如何修改脚本以添加可以在脚本外部访问的计数器和返回值。
感谢大家的阅读。
最佳答案
当使用executeScript
时根据方法的javadoc中编写的规则返回评估结果。还有javadoc of WebEngine
通知您这种可能性。
execution result, converted to a Java object using the following rules:
- JavaScript Int32 is converted to java.lang.Integer
- Other JavaScript numbers to java.lang.Double
- JavaScript string to java.lang.String
- JavaScript boolean to java.lang.Boolean
- JavaScript null to null
- Most JavaScript objects get wrapped as netscape.javascript.JSObject
JavaScript JSNode objects get mapped to instances of netscape.javascript.JSObject, that also implement org.w3c.dom.Node
A special case is the JavaScript class JavaRuntimeObject which is used to wrap a Java object as a JavaScript value - in this case we just extract the original Java value.
因此,如果 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
我只添加了一个计数器变量,该变量会针对每个突出显示的项目递增,然后最终返回该变量。
关于javascript - 在 JavaFX 中访问 Javascript 的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39725360/