7

经过多年成功维护一个使用旧的小程序:

<script src="foo.js"></script> 

嵌入Java小程序的方法,我们无法捂住耳朵唱“啦啦啦!” 了。

是时候使用了:

deployJava.runApplet()

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

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

...它会清除整个现有文档并用小程序替换它。我只需要知道如何将特定的 DOM 元素作为小程序的容器,这样我的页面就不会被擦除。

似乎它是一个属性,我可以以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提供重建文档所需的一切,但我相信你们都可以想象这种前景在我看来是多么可怕。

任何指针将不胜感激。

4

4 回答 4

7

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

像这样:

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,但就像一个魅力;)

于 2013-04-13T10:13:26.470 回答
4

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

虽然是为 JavaFX 设计的,但人们报告说 dtjava.js 取得了成功,我完全有理由相信它是一个可行的替代方案。

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

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

感谢您的回复,即使他们在评论区。如果有人有更好的方法,其他回复仍在接受中!

于 2012-11-23T15:41:19.103 回答
3

如果您正在使用 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);
});
于 2013-05-01T21:44:33.447 回答
1

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

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

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

myDiv = jQuery('#someDiv');

如果你找到一个不那么侵入性的解决方案,请告诉我......

于 2013-02-28T15:33:42.547 回答