使用deployJava.runApplet来定位特定元素

经过多年成功维护使用旧版本的applet:

 

嵌入Java小程序的方法,我们无法掩盖我们的耳朵并唱“La la la!” 了。

是时候使用:

 deployJava.runApplet() 

当我使用单击处理程序触发此方法时(此处通过jQuery在按钮上使用事件侦听器,但无关紧要):

 $('#button').click(function() { deployJava.runApplet(attributes, parameters, version); }); 

…它会清除整个现有文档并将其替换为applet。 我需要知道的是如何将特定的DOM元素作为applet的容器​​,这样我的页面就不会被擦除。

看起来它可能是我可以以target: someElementforms传递的属性target: someElement ,其中“someElement”是DOM对象或元素的ID作为字符串。 但是,我找不到这种属性的文档。

为了完成,这是通过的:

 /*here is where I imagine there might be an applicable attribute */ var attributes = { name: "SomeName", code: "some.class", archive: "some.jar", width: 640, height: 400 }; var parameters = { someParameter: someValue }; var version = "1.5"; 

我可以document.write重建文档所需的一切,但我相信你们都可以想象这个潜在客户看起来多么可怕。

任何指针都将非常感激。

作为Christophe Roussy解决方案的替代方案,您可以在运行deployJava.runApplet覆盖document.write

像这样:

 function docWriteWrapper(func) { var writeTo = document.createElement('del'), oldwrite = document.write, content = ''; writeTo.id = "me"; document.write = function(text) { content += text; } func(); writeTo.innerHTML += content; document.write = oldwrite; document.body.appendChild(writeTo); } 

那么:

 docWriteWrapper(function () { deployJava.runApplet(attributes, parameters, "1.6"); }); 

有点hackish但有点像魅力;)

所以问题的核心是:deployJava.js使用document.write 。 如果您在页面渲染后使用此方法(作为初始页面渲染的一部分),它将首先清除文档。 这有明显的负面反响。

虽然用于JavaFX,人们已经报告了dtjava.js的成功,我完全有理由相信它是一个可行的选择。

但是,我的团队中的其他利益相关者已经完成了有关deployJava.js的工作,并且不愿意丢弃这项工作,这意味着我需要坚持使用deployJava.js。 只有一种方法可以做到这一点:确保在页面呈现期间调用deployJava,而不是通过Ajax,事件或其他延迟触发器。

最后,我们正在收集我们的信息,并将其传递给第二个页面,该页面将按预期呈现applet。 它工作正常,在大多数情况下,我们的客户端无论如何都会这样做(收集信息,传递服务器端,并获得重定向响应),因此强制解决问题是没有意义的。 我们通过查询字符串传递信息,但您可以使用cookie和/或localstorage API,如果您希望window.location保持清晰。

感谢回复,即使他们在评论区。 如果有人有更好的方法,其他回复仍然在船上!

如果您正在使用jQuery并希望定位特定的dom元素,而不是仅仅追加:

 function docWriteWrapper(jq, func) { var oldwrite = document.write, content = ''; document.write = function(text) { content += text; } func(); document.write = oldwrite; jq.html(content); } docWriteWrapper($('#mydiv'), function () { deployJava.runApplet(attributes, parameters, version); }); 

为了解决这个恼人的问题,我在第316行下载并攻击了deployJava.js,用我自己替换了这行:

  // document.write(n + "\n" + p + "\n" + r); myDiv.append(n + "\n" + p + "\n" + r); 

其中myDiv是一个js全局变量,在调用runApplet之前设置为所需的div:

 myDiv = jQuery('#someDiv'); 

如果你发现一个不太干扰的解决方案让我知道……