Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using deployJava.runApplet to target specific element

After many years of successfully maintaining an applet that uses the good old:

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

method of embedding a Java applet, we're unable to cover our ears and sing "La la la!" anymore.

It's time to be using:

deployJava.runApplet()

When I fire this method using a click handler (here using an event listener on a button via jQuery, but it doesn't matter):

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

...it wipes out the entire existing document and replaces it with the applet. All I need to know is how to target a specific DOM element to be the container for the applet, so that my page doesn't get wiped.

It seems like it would be an attribute I could pass in the form of target: someElement where "someElement" is either a DOM object or the element's ID as a string. But alas, I can't find documentation for such an attribute.

For the sake of being complete, here's what's being passed:

/*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";

I can document.write everything I need to rebuild a document, but I'm sure you can all well imagine how hideous that prospect seems to me.

Any pointers would be greatly appreciated.

like image 876
Greg Pettit Avatar asked Nov 22 '12 17:11

Greg Pettit


3 Answers

As alternative to Christophe Roussy solution you may override document.write while running deployJava.runApplet.

Like so:

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);
}

An then:

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

A little bit hackish but works like a charm;)

like image 74
Kolya Ay Avatar answered Nov 06 '22 16:11

Kolya Ay


So the core of the problem is this: deployJava.js uses document.write. If you use this method AFTER page render (vs. as a part of the initial page render) it will first clear the document. Which has obvious negative repurcussions.

Although intended for JavaFX, people have reported success with dtjava.js, and I have every reason to believe it's a viable alternative.

However, other stakeholders on my team have already done work surrounding deployJava.js and are unwilling to throw away that work, which meant I needed to stick to deployJava.js. There's only one way to do this: make sure that deployJava is called during page render, not via Ajax, event, or other delayed trigger.

In the end, we are collecting our information, and passing it to a second page which will render the applet as expected. It works, and in most scenarios our clients will be doing this anyhow (collecting information, passing it server-side, and getting a redirect response), so it didn't make sense to force the issue. We are passing information via query string but you could probably use cookies and/or localstorage API instead, if you wanted the window.location to stay cleaner-looking.

Thanks for the replies, even though they were in the comment area. Other replies are still being taken on board if someone has a better way of doing it!

like image 30
Greg Pettit Avatar answered Nov 06 '22 15:11

Greg Pettit


If you are using jQuery and want to target a specific dom element, rather than just appending:

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);
});
like image 33
jaydfwtx Avatar answered Nov 06 '22 15:11

jaydfwtx