2013-05-06 99 views
4

我想在webview中使用JavaFx打开网页。其中正常打开网页,但它不支持基于Ajax的网络功能,如局部刷新和新窗口弹出处理 我使用下面的代码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){} 

      } 

回答

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

如果您需要AJAX的web视图调用跨站点的服务,你可以通过你的AJAX绕过安全限制呼叫都通过向上调用到Java。例如,您可以编写或查找带有“.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方法,用自己的upcalling方法,两者的差异是完全透明的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调用,它应该可以正常工作。