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

Я хочу иметь возможность динамически вставлять 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);
}

Ответы [ 6 ]

3 голосов
/ 27 сентября 2012
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.

1 голос
/ 13 февраля 2013

Для этого есть библиотека 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>
1 голос
/ 15 июля 2010

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

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

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

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

0 голосов
/ 03 июля 2014

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

// 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 code:

<div id="applet_div"></div>
0 голосов
/ 03 апреля 2014

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

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

...

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

...

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

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

0 голосов
/ 02 октября 2013

Я сделал нечто похожее на то, что предложил 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 в body работает во всех браузерах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...