How to create JavaFX WebBrowser javascript listener without username

I use this snippet to create a js listener in my javafx browser:

       engine.getLoadWorker().stateProperty().addListener(
                (observable, oldValue, newValue) -> {
                    if (newValue == Worker.State.SUCCEEDED) {
                        System.out.println("changed event detected");
                        JSObject win = (JSObject) engine.executeScript("window");
                        win.setMember("java", new JavascriptListener());
                    }
                }
        );

But I would like to be able to call my functions without prefixing them with "java".

Is it possible?

+4
source share
1 answer

Generally speaking, no.

There are no (working) java / javascript functions for this on its own scale. I tried the javascript Object.assign function, but it did not work for variables or methods. Other, similar things will not work properly on Java objects, either

Java, , :

public class JavaVariableAssigner {

                                                                 //javascript-stored objects do not appear to the
    private static ArrayList<Object> gcLock = new ArrayList();   //garbadge collector so we need to make sure
                                                                 //they don't get deleted by always keeping
                                                                 //a reference to them from this list


    public static void addAllMembers(WebEngine browser, Object obj) {
        gcLock.add(obj);

        ((JSObject) browser.executeScript("window")).setMember("java", obj);

        for(Method m : obj.getClass().getDeclaredMethods()) {
            ArrayList<String> parameterNames = new ArrayList();
            for(Parameter p : m.getParameters()) parameterNames.add(p.getName());
            String params = String.join(",", parameterNames.toArray(new String[0]));
            browser.executeScript("function "+m.getName()+"("+params+"){ return java."+m.getName()+"("+params+"); };");
        }

        for(Field  f : obj.getClass().getDeclaredFields()) {
            browser.executeScript("var "+f.getName()+" = java."+f.getName()+";");
        }
    }

}

"java" , () , .

(), javascript , .

+2

Source: https://habr.com/ru/post/1677576/


All Articles