如何创建没有成员名称的 JavaFX WebBrowser javascript 侦听器
How to create a JavaFX WebBrowser javascript listener without a Member name
我一直在使用这个代码片段在我的 javafx 浏览器中创建 js 侦听器:
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());
}
}
);
但我希望能够调用我的函数而不用前缀 "java"。
这可能吗?
一般来说,不会。
没有(有效的)java/javascript 函数可以在本地规模上执行此操作。我尝试了 javascript Object.assign 函数,但它对变量或方法不起作用。其他类似的东西也不能在 Java 个对象上正常工作
不过,如果你愿意让自己暴露在 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 并对其进行评估,所以我不推荐它。
我一直在使用这个代码片段在我的 javafx 浏览器中创建 js 侦听器:
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());
}
}
);
但我希望能够调用我的函数而不用前缀 "java"。
这可能吗?
一般来说,不会。
没有(有效的)java/javascript 函数可以在本地规模上执行此操作。我尝试了 javascript Object.assign 函数,但它对变量或方法不起作用。其他类似的东西也不能在 Java 个对象上正常工作
不过,如果你愿意让自己暴露在 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 并对其进行评估,所以我不推荐它。