4

JavaFx を使用して webview で Web ページを開こうとしています。Webページを適切に開きますが、部分的な更新や新しいウィンドウのポップアップ処理などの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){}

             }
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 呼び出しを行うことにより、セキュリティ制限を回避できます。たとえば、JSObject をパラメーターとして受け取る「.request()」メソッド (できれば、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 呼び出しでは問題なく動作するはずです。

于 2013-12-05T23:03:49.917 に答える