是否有可能从JavaScript中创建任意Java对象?

joe*_*ker 3 javascript java internet-explorer liveconnect

LiveConnect是一种桥接Java和JavaScript的Mozilla技术.令人惊讶的是,他们已经开始为最新版本的Firefox再次维护它.在Firefox中我可以写例如

var d = new java.util.Date();
Run Code Online (Sandbox Code Playgroud)

Packages.如果它不是java.something,请使用命名空间

var d = new Packages.java.util.Date();
Run Code Online (Sandbox Code Playgroud)

或者我可以发疯并称之为工厂方法

Packages.javax.swing.Box.createVerticalBox();
Run Code Online (Sandbox Code Playgroud)

轻松实例化任何Java对象.有没有相同的工作在ie?

Gra*_*ner 5

您可以在Internet Explorer中执行的操作是将applet加载到页面中,该页面公开了执行您要执行的操作的方法.您获得对applet的引用,然后调用该引用上的方法.

<applet id="myAppletId" name="myAppletName" ...>

var applet = document.getElementById('myAppletId');
var d = applet.getDateFromApplet();
Run Code Online (Sandbox Code Playgroud)

在您的applet中,您需要一个getDateFromApplet()返回a 的公共方法java.util.Date.

请注意,我提供的内容应该可以使用,但是我已经使用了多年(当时它在NS4,6和IE 4+中工作).我没用过getElementById(),我用过var applet = document.myAppletName;.

另一个复杂的问题是,如果你想在页面加载时执行它,那么applet几乎肯定不会准备就绪,这需要代码类似于:

function checkApplets() {
    var da = document.applets; // document.getElementsByName('applet');?

    if (da.length > 0) {
        for (var ii = da.length; ii-- > 0;) {
            if (!da[ii].isActive()) {
                window.timerId = setTimeout(checkApplets, 250);
                return;
            }
        }

        if (window.timerId) {
            clearTimeout(window.timerId);
        }
    }

    window.appletsLoaded = true;
}
Run Code Online (Sandbox Code Playgroud)

最后,它可能(应该)可以使用<object>标记执行此操作,但正如我所说,自从我需要以这种方式从客户端JavaScript与Java applet交互以来,已经有好几年了,所以我还没有测试过它.