javaFX webview [removed] is fired before loadworker succeeds

前端 未结 3 833
广开言路
广开言路 2021-01-21 22:14

I use a JavaFX webview in my application. With the following code I set a member after the page has been loaded

webEngine.getLoadWorker().stateProperty().addList         


        
3条回答
  •  甜味超标
    2021-01-21 22:47

    Yes, loadworker always execute after window.onload or document.onload.

    The workaround you can try, you can create new listener in javascript, for example so-called:

    document.addEventListener("deviceready", function(){
        MyJavaBridge.executeJavaMethod();
    });
    

    And then in your loadworker, you can do this:

    webview.getEngine().getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> {
                
        if (newState == Worker.State.SUCCEEDED) {
            JSObject window = (JSObject) webview.getEngine().executeScript("window");
            System.out.println("window : " + window);
            window.setMember("MyJavaBridge", javaBridge);
            
            webview.getEngine().executeScript("const event = new Event('deviceready');document.dispatchEvent(event);");
        }
    });
    

    As you can see, you execute this webview.getEngine().executeScript("const event = new Event('deviceready');document.dispatchEvent(event);"); after setMember, so instead of initialise your work in window.onload, you can do it in your custom event listener deviceready, so you can have better control on the sequence of page load and java side loadworker.

    This is exactly how cordova doing, this idea is coming from it.

    JQuery document.ready vs Phonegap deviceready

提交回复
热议问题