javafx Webview不支持Ajax Web功能

问题描述 投票:4回答:2

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

             }
java ajax webview javafx-2 javafx
2个回答
2
投票

WebView确实支持Ajax。

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

“

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())
);

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());
}

您还可以使用您自己的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调用,它应该可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.