无法让 JavaScript 在 WebView 中工作
Can''t get JavaScript to work in WebView
我有一个相当简单的 JavaFX 应用程序。它有一个 window,一分为二。左边是一个表视图,列出了数据库中的行。当您 select 其中一行时,它会在右侧的网络视图中显示 XML (也来自数据库)。到目前为止,一切都很好。我这辈子都无法让任何类型的 JavaScipt 工作。我的最终目标是进行搜索并突出显示工作(如 great post 中所示)。根据我在那里遇到的问题,我想我会尝试通过插入一个简单的 JavaScript 函数来简化问题HTML.
如果相关的话,我正在使用 FXML。我有一个按钮,它是 OnAction 属性,调用此方法:
@FXML
private void searchBrowser() {
if (webEngine.getDocument() != null) {
highlight(searchField.getText());
}
}
@FXML
private void highlight(String text) {
webEngine.executeScript("test()");
它不会抛出任何错误,并且会按顺序调用这两个方法。只是没有其他事情发生。 test() 函数在HTML 中,只是一个简单的警报。如果我只是保存 HTML 并将其加载到 Chrome 或 IE 中,该功能就可以正常工作。
我做错了什么?
首先,我找不到简单的方法来修复 webView.getEngine().loadContent();
的旧版本。
但我决定在我的项目中推出相同的功能。我的要求是 语法高亮 和 选定的文本高亮 ,所以这就是我想出的:(代码并没有真正优化,只是工作和演示如何做到)
这是 1 post 的巨大代码,所以我将只解释重要部分和 post 演示 git link。 Java git path., Resources git path
- Google-用于语法高亮的代码美化库
- JQuery + 2 个用于选定文本高亮的 js 函数。
- 最初我将
template HTML
文件作为字符串加载并修复 css 和 js
links,因为我将它们存储在本地并且不知道如何在 html 中设置相对路径
- 然后我将
html encoded XML
包装在模板 HTML 中
Old Post works only for webView.getEngine().load()
:
I don't know what's inside test()
js function, but this code looks
fine to me. The problem can be when you append your js to the page,
because webView.getEngine().load()
and
webView.getEngine().loadContent();
are both assync tasks, so you
have to add listener like this:
webView.getEngine().getLoadWorker().stateProperty().addListener(
new ChangeListener<Worker.State>() {
public void changed(ObservableValue ov,
Worker.State oldState, Worker.State newState) {
if (newState == Worker.State.SUCCEEDED) {
//some append js code here
}
}
});
And here is working demo code: https://gist.github.com/varren/1fb41536f2b95f69be4e
我有一个相当简单的 JavaFX 应用程序。它有一个 window,一分为二。左边是一个表视图,列出了数据库中的行。当您 select 其中一行时,它会在右侧的网络视图中显示 XML (也来自数据库)。到目前为止,一切都很好。我这辈子都无法让任何类型的 JavaScipt 工作。我的最终目标是进行搜索并突出显示工作(如 great post 中所示)。根据我在那里遇到的问题,我想我会尝试通过插入一个简单的 JavaScript 函数来简化问题HTML.
如果相关的话,我正在使用 FXML。我有一个按钮,它是 OnAction 属性,调用此方法:
@FXML
private void searchBrowser() {
if (webEngine.getDocument() != null) {
highlight(searchField.getText());
}
}
@FXML
private void highlight(String text) {
webEngine.executeScript("test()");
它不会抛出任何错误,并且会按顺序调用这两个方法。只是没有其他事情发生。 test() 函数在HTML 中,只是一个简单的警报。如果我只是保存 HTML 并将其加载到 Chrome 或 IE 中,该功能就可以正常工作。 我做错了什么?
首先,我找不到简单的方法来修复 webView.getEngine().loadContent();
的旧版本。
但我决定在我的项目中推出相同的功能。我的要求是 语法高亮 和 选定的文本高亮 ,所以这就是我想出的:(代码并没有真正优化,只是工作和演示如何做到)
这是 1 post 的巨大代码,所以我将只解释重要部分和 post 演示 git link。 Java git path., Resources git path
- Google-用于语法高亮的代码美化库
- JQuery + 2 个用于选定文本高亮的 js 函数。
- 最初我将
template HTML
文件作为字符串加载并修复 css 和 js links,因为我将它们存储在本地并且不知道如何在 html 中设置相对路径
- 然后我将
html encoded XML
包装在模板 HTML 中
Old Post works only for
webView.getEngine().load()
:I don't know what's inside
test()
js function, but this code looks fine to me. The problem can be when you append your js to the page, becausewebView.getEngine().load()
andwebView.getEngine().loadContent();
are both assync tasks, so you have to add listener like this:webView.getEngine().getLoadWorker().stateProperty().addListener( new ChangeListener<Worker.State>() { public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) { if (newState == Worker.State.SUCCEEDED) { //some append js code here } } });
And here is working demo code: https://gist.github.com/varren/1fb41536f2b95f69be4e