JavaFXWebView不支持Ajax web功能

JavaFXWebView不支持Ajax web功能,java,ajax,webview,javafx-2,javafx,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);

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

             }
final Group=new Group();
场景=新场景(组);
fxpanel.setScene(场景);
WebView WebView=newwebview();
group.getChildren().add(webview);
eng=webview.getEngine();
eng.setJavaScriptEnabled(true);
试一试{
字符串url=”http://www.abc.com";
加载(url);
eng.setCreatePopupHandler(
新回调函数(){
@凌驾
公共WebEngine调用(PopupFeatures配置){
smallView=新的WebView();
smallView.setFontScale(0.8);
ChatPopup frm=新ChatPopup(smallView);
frm.立根数(0,0400250);
frm.setVisible(真);
返回smallView.getEngine();
}
});
}
捕获(例外情况除外){}
}

WebView确实支持Ajax

  • 运行以下应用程序
  • 单击“将数据从服务器加载到div”按钮
  • 将使用从服务器获取的数据刷新页面
  • 对警报置之不理

    注意,在上面链接的示例页面中,有许多处理json数据的示例。一些示例,例如jquery
    $.get()
    示例,使用JavaScript
    alert()
    输出ajax调用的结果

    如果要查看警报数据,需要向WebView引擎添加警报处理程序。下面这样的基本警报处理程序只会将警报数据输出到输出控制台:

    webView.getEngine().setOnAlert(
        stringWebEvent -> System.out.println(stringWebEvent.getData())
    );
    

    这实际上与ajax调用无关,但如果没有警报处理程序,如果您试图使用警报调试或显示从WebView ajax调用返回的数据,您可能会感到困惑。

    如果您需要在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.$");
    
    这将无缝地将jQuery的“$.ajax”调用替换为来自Java对象的调用。(我设置了“$”变量,因为如果jQuery检测到冲突,有时会用它覆盖$,将jQuery返回到其原始版本。)这意味着在大多数情况下,任何javascript代码都不必关心它是否在WebView中运行


    不过有一个警告-jQuery的ajax调用相当复杂,如果您不小心处理它,这可能会破坏一些jQuery ajax扩展。不过,对于最常见的GET和POST调用,它应该可以正常工作。

    在HTML中使用below函数仍然失败$(document).ready(function(){alert(“ready”);$.ajax({url:,type:'GET',cache:false,data:{name:'hi'}),contentType:'application/json',dataType:'json',async:true,success:function(res){alert('success res-:'+json.stringify(res));},error:function(res){alert('error res-:'+json.stringify(res));})@Samy ajax对我来说不会失败(windows上JDK 13上的JavaFX 13)。您使用的是JavaScript
    alert()
    方法。如果要处理警报,必须添加警报处理程序,这与ajax调用无关。基本警报处理程序如下所示,如果需要,可以添加更复杂的警报处理程序:
    webView.getEngine().setOnAlert(stringWebEvent->System.out.println(stringWebEvent.getData());
    。我没有检查示例代码中可能出错的其他内容。如果您仍然存在问题,请提出新问题。我看到您确实提出了新问题,感兴趣的人的链接是:
    engine.executeScript("$.ajax = new function (o) { myAjax.request(o); };");
    engine.executeScript("_$ = window.$");