【问题标题】:Using deployJava.runApplet to target specific element使用 deployJava.runApplet 定位特定元素
【发布时间】:2012-11-11 03:38:57
【问题描述】:

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

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

任何指针将不胜感激。

【问题讨论】:

  • 多一点代码和少一点文本会更好:-)
  • 没有代码可言。不过,我会更新只是为了向您展示。 ;-)
  • 看看dtjava.js,deployJava的小弟不会document.write
  • 看起来很有希望。不确定我是否会得到其他利益相关者的支持,但这似乎是最好的选择。唯一要做的另一件事是永远不要动态调用函数(只在页面渲染期间调用它)。
  • 您可以使用deployJava.js 将链接静态写入元素,通过更改样式动态设置为可见。

标签: java javascript css applet


【解决方案1】:

如果你使用 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);
});

【讨论】:

  • 感谢您的回答!有趣的是,有些问题的反应速度很慢,人们不断地注意到解决问题的聪明方法。非常感谢!
  • 这非常有效,并且提供了所要求的内容。
【解决方案2】:

作为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");
});

有点老套,但很有魅力;)

【讨论】:

  • 哇,感谢您抽出宝贵时间回复此问题,Kolya!当然值得至少尝试一下!我太健忘了,所以我会四处走动并“接受”这一点……当然,代码在视觉检查中看起来是合理的。 :)
  • 附带说明,该产品迟早会切换到 JNLP,但我认为我们将始终有一个小程序选项。
  • 如果您能花时间添加一些解释性的 cmets,那就太好了!
【解决方案3】:

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

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

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

myDiv = jQuery('#someDiv');

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

【讨论】:

  • 这有保证!这不像他们不断更新 deployJava.js,我们每次都不得不担心在修复中被黑客入侵...... ;) 谢谢,Christophe。
  • 当我下载它时,我决定更新它,但这对于这种侵入性黑客来说总是一个问题,并且必须以某种方式记录下来。
  • 同意。再次感谢克里斯托夫的建议!
【解决方案4】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2018-03-17
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2019-12-03
    • 2019-12-21
    • 2017-06-04
    • 1970-01-01
    相关资源
    最近更新 更多