使用deployJava.runApplet以特定元素为目标

使用deployJava.runApplet以特定元素为目标,java,javascript,css,applet,Java,Javascript,Css,Applet,多年来,成功维护了一个使用旧版本的小程序: <script src="foo.js"></script> 当我使用click处理程序触发此方法时(这里通过jQuery在按钮上使用事件侦听器,但这并不重要): …它将清除整个现有文档,并用小程序替换它。我只需要知道如何将特定的DOM元素作为小程序的容器,这样我的页面就不会被擦除 它似乎是一个属性,我可以以target:someElement的形式传递,其中“someElement”要么是DOM对象,要么是元素的ID作为字

多年来,成功维护了一个使用旧版本的小程序:

<script src="foo.js"></script> 
当我使用click处理程序触发此方法时(这里通过jQuery在按钮上使用事件侦听器,但这并不重要):

…它将清除整个现有文档,并用小程序替换它。我只需要知道如何将特定的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。写下重建文档所需的一切,但我相信你们都可以想象,在我看来,这个前景是多么可怕


任何指针都将不胜感激。

因此问题的核心是:deployJava.js使用
document.write
。如果在页面呈现后使用此方法(而不是作为初始页面呈现的一部分),它将首先清除文档。具有明显的负循环

尽管是为JavaFX设计的,但人们已经报道了dtjava.js的成功,我有充分的理由相信这是一个可行的替代方案

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

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


感谢您的回复,尽管它们位于评论区。如果有人有更好的方法,其他的回复仍然会被采纳

为了解决这个恼人的问题,我在第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.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");
});

有点粗俗,但很有魅力;)

如果您正在使用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);
});

多一点代码,少一点文本会更好:-)没有代码可言。不过,我将进行更新以向您展示。;-)看看,deployJava的弟弟没有document.writelook。我不确定是否会得到其他利益相关者的认可,但这似乎是最好的选择。唯一要做的另一件事是永远不要动态调用函数(只需在页面呈现期间调用它)。您可以使用
deployJava.js
静态地将链接写入元素中,该元素通过更改样式动态设置为可见。这是有保证的!他们并不是不断更新deployJava.js,我们每次都要担心黑客攻击……;)谢谢,Christophe。当我下载它时,我会决定更新它,但这对于此类侵入性黑客来说总是一个问题,必须以某种方式记录下来。同意。再次感谢你的建议,克里斯托夫!哇,谢谢你抽出时间来回答这个问题,Kolya!至少值得一试!我太健忘了,所以我要冒险去“接受”这个。。。当然,通过目视检查,代码看起来似乎是合理的。:)另一方面,该产品迟早会切换到JNLP,但我认为我们始终会有一个applet选项。如果您能花时间添加一些解释性的注释,那就太好了!谢谢你的回答!有趣的是,有些问题会慢慢地被烧掉,人们总是注意到解决问题的聪明方法。非常感谢!这样做非常有效,并且提供了所要求的内容。
docWriteWrapper(function () {
    deployJava.runApplet(attributes, parameters, "1.6");
});
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);
});