【问题标题】:How to pass 'window' JSObject from one browser to another?如何将“窗口”JSObject 从一个浏览器传递到另一个浏览器?
【发布时间】:2017-09-20 20:05:29
【问题描述】:

使用 JavaFx WebView,我可以通过以下方式获取浏览器实例 [1] 的“窗口”:

// Java code
netscape.javascript.JSObject win = (JSObject) webengine.executeScript("window");

然后我可以将这个 JSObject 传递给另一个浏览器实例[2],在这个浏览器的 javascript 中,我可以像这样操作和访问第一个浏览器实例[1] 的 DOM、变量和函数:

// Javascript code
// get 'window' netscape.javascript.JSObject of 'browser1' webview 
// control from the getWindow() method in my linked Java class
var window1 = javaObj.getWindow("browser1");

// get variables defined in 'browser1' javascript
var rString = window1.myString;
var rNum = window1.myNumber;

// execute the 'myAlert' function on 'browser1' and pass variables in
window1.myAlert(rString + " - " + rNum + "<br><br>" + Date());

// manipulate the DOM on 'browser1'
window1.document.getElementById("myLabel").style.backgroundColor = "red";

如何使用 jxBrowser 实现这一点?

【问题讨论】:

    标签: javafx webview jxbrowser jsobject


    【解决方案1】:

    JxBrowser 提供了类似的功能,允许将 Java 对象注入 JavaScript 并从 JavaScript 代码调用其方法,但 JxBrowser 不使用 netscape.javascript.JSObject 类。以下示例演示了如何使用 Java 对象注入从 JavaScript 访问 Java 对象方法:

    import com.teamdev.jxbrowser.chromium.Browser;
    import com.teamdev.jxbrowser.chromium.JSValue;
    import com.teamdev.jxbrowser.chromium.dom.By;
    import com.teamdev.jxbrowser.chromium.dom.DOMDocument;
    import com.teamdev.jxbrowser.chromium.dom.DOMElement;
    
    public class JavaScriptJavaSample {
        public static void main(String[] args) {
            Browser browser = new Browser();
    
            JSValue window = browser.executeJavaScriptAndReturnValue("window");
    
            // Inject Java object into JavaScript and associate it with
            // the window.javaWindow property.
            JavaWindow javaWindow = new JavaWindow(browser);
            window.asObject().setProperty("javaWindow", javaWindow);
    
            // You can access public fields of the injected Java object
            // and modify their values from JavaScript. For example:
            //
            // window.javaWindow.myString = 'Hello, Java';
            // window.javaWindow.myNumber = 123;
            // window.document().getElementById('myLabel').setAttribute('name', 'myName');
        }
    
        public static class JavaDocument {
    
            private DOMDocument document;
    
            public JavaDocument(DOMDocument document) {
                this.document = document;
            }
    
            public DOMElement getElementById(String id) {
                return document.findElement(By.id(id));
            }
        }
    
        public static class JavaWindow {
            public String myString;
            public int myNumber;
    
            private Browser browser;
    
            public JavaWindow(Browser browser) {
                this.browser = browser;
            }
    
            public JavaDocument document() {
                return new JavaDocument(browser.getDocument());
            }
        }
    }
    

    您可以在https://jxbrowser.support.teamdev.com/support/solutions/folders/9000074803 的文章中阅读有关 JavaScript-Java Bridge API 的更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      • 2015-04-02
      • 1970-01-01
      • 2015-05-27
      • 2021-06-28
      • 1970-01-01
      相关资源
      最近更新 更多