如何使用Javascript动态嵌入Java小程序?

11

我想通过一个JavaScript函数,在按钮按下时动态地将Java小程序插入到网页中。 (在页面加载时加载小程序会导致速度变慢,冻结浏览器等等...)我正在使用以下代码,在Firefox中无缝运行,但在IE8、Safari 4和Chrome中失败而没有显示错误消息。有人知道为什么这不像预期的那样工作,并且如何以一种适用于所有浏览器的方式动态地插入小程序吗? 我尝试过使用document.write(),如其他地方所建议的,但在页面加载后调用它会导致页面被抹掉,因此对我来说这不是一个选项。

function createPlayer(parentElem)
{
    // The abc variable is declared and set here

    player = document.createElement('object');
    player.setAttribute("classid", "java:TunePlayer.class");
    player.setAttribute("archive", "TunePlayer.class,PlayerListener.class,abc4j.jar");
    player.setAttribute("codeType", "application/x-java-applet");
    player.id = "tuneplayer";
    player.setAttribute("width", 1);
    player.setAttribute("height", 1);

    param = document.createElement('param');
    param.name = "abc";
    param.value = abc;
    player.appendChild(param);

    param = document.createElement('param');
    param.name = "mayscript";
    param.value = true;
    player.appendChild(param);

    parentElem.appendChild(player);
}
6个回答

3
document.write()

此操作将覆盖整个文档。如果您想保留文档并只添加小程序,则需要将其附加到文档末尾。

var app = document.createElement('applet');
app.id= 'Java';
app.archive= 'Java.jar';
app.code= 'Java.class';
app.width = '400';
app.height = '10';
document.getElementsByTagName('body')[0].appendChild(app);

这段代码将把小应用程序添加到body标签的最后一个元素中。请确保在DOM处理后才运行此代码,否则将会出现错误。建议使用Body OnLoad或jQuery ready函数。


非常感谢您清晰明了的回答 +1。不过,我想让大家知道,现在已经不需要将“.class”转换为“app.code”值了。 - Koffy

1

有一个用于此目的的JavaScript库: http://www.java.com/js/deployJava.js


// launch the Java 2D applet on JRE version 1.6.0
// or higher with one parameter (fontSize)
<script src=
    "http://www.java.com/js/deployJava.js"></script>
<script>
    var attributes = {code:'java2d.Java2DemoApplet.class',
        archive:'http://java.sun.com/products/plugin/1.5.0/demos/plugin/jfc/Java2D/Java2Demo.jar',
        width:710, height:540} ;
    var parameters = {fontSize:16} ;
    var version = '1.6' ;
    deployJava.runApplet(attributes, parameters, version);
</script>

这个 JavaScript 库使用 document.write(),它会覆盖整个文档。请查看我的答案以了解如何修复它。 - Bruno Medeiros
这个问题可能已经在后续版本中得到修复。 - SineSwiper

1

我本来会建议你做类似于你正在做的事情,所以我很困惑为什么它不起作用。

这里有一份文件看起来非常权威,就像从内部人士那里得到的。它提到了不同浏览器的特殊性。您可能最终需要为不同的实现使用不同的标记语言。

但也许applet/object标记有某种神奇的东西,使它们在动态插入时无法被处理。除了没有更多的合格建议外,我有一个疯狂的解决方法要给你:你可以在不同的页面上呈现applet,并动态创建一个IFRAME来显示应该占据的空间中的页面。IFRAME在各个浏览器中的语法更加一致,如果它们失败了,我会感到惊讶。

也许您应该使用浏览器的调试工具查看您交换applet节点后的DOM。也许它没有出现在您认为它应该出现的地方,或者没有按照您认为创建的结构出现。您的代码看起来还不错,但我对动态applet并不是很有经验。


嗨, 谢谢你的建议!IFrame的想法很好,如果我无法让动态插入起作用,我可能会使用它。在插入小程序后,我确实查看了IE中的DOM,结果非常奇怪。当插入小程序时,我可以看到包含的div会扩展一些以适应小程序,但代码从未出现在DOM中,小程序也从未执行。我不知道为什么会发生这种情况... - Jonathan

0

我做了类似于Beachhouse建议的事情。我修改了deployJava.js,像这样:

writeAppletTag: function(attributes, parameters) {
    ...

    // don't write directly to document anymore
    //document.write(startApplet + '\n' + params + '\n' + endApplet);

    var appletString = startApplet + '\n' + params + '\n' + endApplet;
    var divApplet = document.createElement('div');

    divApplet.id = "divApplet";
    divApplet.innerHTML = appletString;
    divApplet.style = "visibility: hidden; display: none;";

    document.body.appendChild(divApplet);
}

在Chrome、Firefox和IE上都可以正常工作,目前没有问题。

我最初尝试在我的HTML文件中创建一个div并将其innerHTML设置为appletString,但只有IE能够动态检测到新的applet。直接将整个div插入到body中可以在所有浏览器上工作。


0

这个对我有用:

// my js code
    var app = document.createElement('applet');
    app.code= 'MyApplet2.class';
    app.width = '400';
    app.height = '10';

    var p1 = document.createElement('param');
    p1.name = 'sm_UnwindType';
    p1.value='200';
    var p2 = document.createElement('param');
    p2.name = 'sm_Intraday';
    p2.value='300';

    app.appendChild(p1);
    app.appendChild(p2);

    var appDiv = document.getElementById('applet_div');
    appDiv.appendChild(app);

-----HTML 代码:

<div id="applet_div"></div>

0
创建一个新的小程序元素,并使用appendChild将其附加到现有元素。
var applet = document.createElement('applet');
applet.id = 'player';

...

var param = document.createElement('param');

...

applet.appendChild(param);
document.getElementById('existingElement').appendChild(applet);

此外,请确保现有元素可见,也就是说您没有将CSS设置为隐藏它,否则在使用appendChild后浏览器将无法加载小程序。我花了太多时间来弄清楚这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接