Как я могу встроить Java-апплет динамически с помощью Javascript?

Я хочу иметь возможность вставлять апплет Java в веб-страницу динамически, используя функцию Javascript, вызываемую при нажатии кнопки. (Загрузка апплета на загрузку страницы замедляет работу слишком сильно, замораживает браузер и т.д.). Я использую следующий код, который работает без проблем в FF, но без сообщений об ошибках в IE8, Safari 4 и Chrome. Кто-нибудь знает, почему это работает не так, как ожидалось, и как динамически вставлять апплет таким образом, который работает во всех браузерах? Я пробовал использовать document.write(), как было предложено в другом месте, но называя, что после того, как страница загрузилась, результаты на стираемой странице, поэтому это не вариант для меня.

function createPlayer(parentElem)
{
    // The abc variable is declared and set here

    player = document.createElement('object');
    player.setAttribute("classid", "java:TunePlayer.class");
    player.setAttribute("archive", "TunePlayer.class,PlayerListener.class,abc4j.jar");
    player.setAttribute("codeType", "application/x-java-applet");
    player.id = "tuneplayer";
    player.setAttribute("width", 1);
    player.setAttribute("height", 1);

    param = document.createElement('param');
    param.name = "abc";
    param.value = abc;
    player.appendChild(param);

    param = document.createElement('param');
    param.name = "mayscript";
    param.value = true;
    player.appendChild(param);

    parentElem.appendChild(player);
}

Ответ 1

document.write()

Перепишет весь документ. Если вы хотите сохранить документ и просто хотите добавить апплет, вам нужно добавить его.

var app = document.createElement('applet');
app.id= 'Java';
app.archive= 'Java.jar';
app.code= 'Java.class';
app.width = '400';
app.height = '10';
document.getElementsByTagName('body')[0].appendChild(app);

Этот код добавит апплет в качестве последнего элемента тега body. Убедитесь, что это выполняется после обработки DOM или вы получите сообщение об ошибке. Body OnLoad или рекомендуется jQuery.

Ответ 2

Я бы предложил сделать что-то вроде того, что вы делаете; поэтому я озадачен тем, почему он не работает.

Вот документ, который выглядит довольно авторитетным, исходя из уст лошади. В нем упоминаются особенности разных браузеров. Вам может понадобиться сделать различные супы для разных реализаций.

Но может быть, есть что-то волшебное в отношении тегов апплетов/объектов, которые не позволяют им обрабатываться, если они вставлены динамически. Не имея более квалифицированных советов, у меня есть сумасшедшее обходное решение, чтобы предложить вам: Howzabout вы представляете апплет на другой странице и динамически создаете IFRAME, чтобы показать эту страницу в пространстве, которое должен занимать ваш апплет? IFRAME более согласованы в синтаксисе между браузерами, и я был бы удивлен, если бы они потерпели неудачу таким же образом.

Возможно, вам следует использовать инструменты отладки браузера, чтобы посмотреть DOM после того, как вы поменяете свой апплет node. Возможно, он не появляется там, где вы думаете, или нет со структурой, которую, по вашему мнению, вы создаете. Ваш код выглядит хорошо для меня, но я не очень опытен с динамическими апплетами.

Ответ 3

Для этой цели есть библиотека JavaScript: http://www.java.com/js/deployJava.js

// launch the Java 2D applet on JRE version 1.6.0
// or higher with one parameter (fontSize)
<script src=
    "http://www.java.com/js/deployJava.js"></script>
<script>
    var attributes = {code:'java2d.Java2DemoApplet.class',
        archive:'http://java.sun.com/products/plugin/1.5.0/demos/plugin/jfc/Java2D/Java2Demo.jar',
        width:710, height:540} ;
    var parameters = {fontSize:16} ;
    var version = '1.6' ;
    deployJava.runApplet(attributes, parameters, version);
</script>

Ответ 4

Я сделал что-то похожее на то, что предложил Beachhouse. Я изменил deployJava.js следующим образом:

writeAppletTag: function(attributes, parameters) {
    ...

    // don't write directly to document anymore
    //document.write(startApplet + '\n' + params + '\n' + endApplet);

    var appletString = startApplet + '\n' + params + '\n' + endApplet;
    var divApplet = document.createElement('div');

    divApplet.id = "divApplet";
    divApplet.innerHTML = appletString;
    divApplet.style = "visibility: hidden; display: none;";

    document.body.appendChild(divApplet);
}

Он работал нормально в Chrome, Firefox и IE. На данный момент проблем нет.

Сначала я попытался создать div в моем html файле и просто установить его innerHTML в appletString, но только IE смог обнаружить новый апплет динамически. Вставьте весь div direclty в body для всех браузеров.

Ответ 5

Создайте новый элемент апплета и добавьте его в существующий элемент, используя appendChild.

var applet = document.createElement('applet');
applet.id = 'player';

...

var param = document.createElement('param');

...

applet.appendChild(param);
document.getElementById('existingElement').appendChild(applet);

Кроме того, убедитесь, что существующий элемент виден, что означает, что вы не задали css, чтобы скрыть его, иначе браузер не загрузит апплет после использования appendChild. Я потратил слишком много часов, пытаясь понять это.

Ответ 6

Это сработало для меня:

// my js code
    var app = document.createElement('applet');
    app.code= 'MyApplet2.class';
    app.width = '400';
    app.height = '10';

    var p1 = document.createElement('param');
    p1.name = 'sm_UnwindType';
    p1.value='200';
    var p2 = document.createElement('param');
    p2.name = 'sm_Intraday';
    p2.value='300';

    app.appendChild(p1);
    app.appendChild(p2);

    var appDiv = document.getElementById('applet_div');
    appDiv.appendChild(app);

----- html код:

<div id="applet_div"></div>