4

I am trying to open webpage in webview using JavaFx . Its opening the web page properly but its not supporting the Ajax based web features like partial refreshing and new window popup handling I am using the following code

  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){}

             }
4

2 回答 2

2

WebView 确实支持 Ajax。

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

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

除了警报

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

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

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

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

于 2013-05-06T19:39:04.333 回答
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 的“$.ajax”调用。(我设置了“_$”变量,因为如果 jQuery 检测到冲突,有时会用它覆盖 $,将 jQuery 返回到其原始版本。)这意味着在大多数情况下,任何 javascript 代码都不必关心它是否正在运行您的 WebView 与否。

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

于 2013-12-05T23:03:49.917 回答