我正在JavaFX中开发一个依赖于WebView(以及WebEngine)的数据挖掘应用程序.挖掘分两步进行:首先,用户使用UI导航到WebView中的网站,以配置可以搜索有趣数据的位置.其次,使用定期运行的后台任务,WebEngine加载相同的文档并尝试从加载的文档中提取数据.
这适用于大多数情况,但最近我遇到了使用AJAX呈现内容的页面遇到的麻烦.要检查是否已WebEngine加载文档,我听loadWorker的stateProperty.如果状态转换为successcesfull,我知道文档已加载(与可能在document.ready()上运行的任何javascript或等效文件一起).这是因为如果我没有弄错的话,javascript会在JavaFX线程上执行(来源:https://blogs.oracle.com/javafx/entry/communicating_between_javascript_and_javafx).但是,如果启动了AJAX调用,则javascript执行完成,引擎让我知道文档已准备就绪,但显然不是因为优秀的AJAX调用内容可能仍然会发生变化.
有没有办法解决这个问题,注入一个钩子,以便在AJAX调用结束时通知我?我已经尝试安装一个默认的完整处理程序,$.ajaxSetup()但这很狡猾,因为如果ajax调用覆盖整个处理程序,则不会调用默认值.另外,我只能在首次加载文档后注入它(然后一些AJAX调用可能已经在运行).我已经使用upcall测试了这个注入,它适用于在命令上启动的AJAX调用(在注入默认处理程序之后),它们不提供自己的完整处理程序.
我正在寻找两件事:第一:挂钩到AJAX调用的完成处理程序的通用方法,其次:等待WebEngine完成所有AJAX调用并在事后通知我的方法.
我正在尝试为使用 webview 访问单个网站的 JavaFX 应用程序编写自己的协议处理程序。到目前为止我所做的
我的自定义 URLStreamHandlerFactory
public class MyURLStreamHandlerFactory implements URLStreamHandlerFactory {
public URLStreamHandler createURLStreamHandler(String protocol) {
System.out.println("Protocol: " + protocol);
if (protocol.equalsIgnoreCase("http") || protocol.equalsIgnoreCase("https")) {
return new MyURLStreamHandler();
} else {
return new URLStreamHandler() {
@Override
protected URLConnection openConnection(URL u) throws IOException {
return new URLConnection(u) {
@Override
public void connect() throws IOException {
}
};
}
};
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的自定义 URLStreamHandler
public class MyURLStreamHandler extends java.net.URLStreamHandler{
protected HttpURLConnection openConnection(URL u){
MyURLConnection q = new MyURLConnection(u);
return …Run Code Online (Sandbox Code Playgroud)