javafx webview不支持Ajax Web功能

时间:2013-05-06 04:44:48

标签: java ajax webview javafx-2 javafx

我正在尝试使用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){}

             }

2 个答案:

答案 0 :(得分:2)

WebView确实支持Ajax。

  1. 运行以下应用程序。
  2. 点击“将数据从服务器加载到div”按钮。
  3. 将使用从服务器获取的数据刷新页面。
  4. ajaxwebview

    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调用。