我正在尝试使用JavaFx在webview中打开网页。它正确打开网页但不支持基于Ajax的Web功能,如部分刷新和新窗口弹出处理 我使用以下代码
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){}
}
答案 0 :(得分:2)
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();
}
}
答案 1 :(得分:1)
如果您需要在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());
}
您也可以使用自己的上传方法直接覆盖jQuery的ajax方法,这样差异对javascript代码完全透明,即:
engine.executeScript("$.ajax = new function (o) { myAjax.request(o); };");
engine.executeScript("_$ = window.$");
这将无缝地替换jQuery的“$ .ajax”调用与Java对象中的调用。 (我设置了“_ $”变量,因为jQuery会有时覆盖$,如果它检测到冲突,将jQuery返回到原始版本。)这意味着在大多数情况下,任何javascript代码都不必关心它是否在运行您的WebView与否。
虽然警告 - jQuery的ajax调用相当复杂,如果你不小心处理它,这可能会破坏一些jQuery ajax扩展。不过,它应该适用于最常见的GET和POST调用。