我正在尝试使用JavaFx在webview中打开网页。它可以正确打开网页,但不支持基于Ajax的网页功能,例如部分刷新和新窗口弹出处理我正在使用以下代码
final Group group= new Group();
Scene scene= new Scene(group);
fxpanel.setScene(scene);
WebView webview = new WebView ();
group.getChildren().add(webview);
eng= webview.getEngine();
eng.setJavaScriptEnabled(true);
try{
String url="http://www.abc.com";
eng.load(url);
eng.setCreatePopupHandler(
new Callback<PopupFeatures, WebEngine>() {
@Override
public WebEngine call(PopupFeatures config) {
smallView = new WebView();
smallView.setFontScale(0.8);
ChatPopup frm = new ChatPopup(smallView);
frm.setBounds(0,0,400,250);
frm.setVisible(true);
return smallView.getEngine();
}
});
}
catch(Exception ex){}
}
WebView确实支持Ajax。
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.scene.Scene;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
public class WebViewAjax extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) {
WebView webView = new WebView();
webView.getEngine().load("http://www.jquerysample.com/#BasicAJAX");
final Scene scene = new Scene(webView);
stage.setScene(scene);
stage.show();
}
}
除警报外
注意,在上面链接的示例页面中,有一个使用jquery的更复杂的调用,它使用JavaScript警报输出ajax调用的结果。如果要输出警报,则需要添加警报处理程序:
webView.getEngine().setOnAlert(
stringWebEvent -> System.out.println(stringWebEvent.getData())
);
如果需要在WebView中对跨站点服务进行AJAX调用,则可以通过向上调用Java进行AJAX调用来解决安全限制。例如,您可以使用“ .request()”方法编写或找到一个类,该类将JSObject作为参数(最好是与jQuery的$ .ajax()方法采用的JSObject格式相同),然后注入一个Java对象,该类将公开该方法:
WebView myWebView; //assuming it's initialized and points to an actual WebView
WebEngine engine = myWebView.getEngine();
JSObject window = null;
try{
window = (JSObject) engine.executeScript("window");
}catch (JSException e){
e.printStackTrace();
}
if (window != null){
window.setMember("myAjax", new AJAXProxyClass());
}
您还可以使用您自己的upcalling方法直接覆盖jQuery的ajax方法,以使区别对javascript代码完全透明,即:
engine.executeScript("$.ajax = new function (o) { myAjax.request(o); };");
engine.executeScript("_$ = window.$");
这将用Java对象中的jQuery无缝替换jQuery的“ $ .ajax”调用。 (我设置“ _ $”变量是因为jQuery如果检测到冲突有时会用$覆盖它,将jQuery返回其原始版本。)这意味着在大多数情况下,任何javascript代码都不必关心它是否在其中运行是否使用您的WebView。
但是,警告-jQuery的ajax调用相当复杂,如果您不谨慎处理它,这可能会破坏某些jQuery ajax扩展。不过,对于大多数常见的GET和POST调用,它应该可以正常工作。