Использование deployJava.runApplet для задания определенного элемента

116
7

После многих лет успешного сохранения апплета, который использует старый добрый:


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

метод внедрения Java-апплета, мы не можем покрыть наши уши и петь "La la la!" больше.


Это время для использования:


deployJava.runApplet()

Когда я запускаю этот метод с помощью обработчика кликов (здесь, используя прослушиватель событий на кнопке через jQuery, но это не имеет значения):


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

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


Похоже, что это был бы атрибут, который я мог бы передать в форме target: someElement, где "someElement" является либо объектом DOM, либо идентификатором элемента в виде строки. Но, увы, я не могу найти документацию для такого атрибута.


Чтобы быть полным, вот что передавалось:


/*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 все, что мне нужно, чтобы перестроить документ, но я уверен, что вы все хорошо представляете, насколько ужасно выглядит эта перспектива.


Любые указатели будут очень благодарны.

спросил(а) 2021-01-25T12:37:43+03:00 4 месяца, 2 недели назад
1
Решение
116

В качестве альтернативы решению Christophe Roussy вы можете переопределить document.write во время работы 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");
});

Немного хакерский, но работает как шарм;)

ответил(а) 2021-01-25T12:37:43+03:00 4 месяца, 2 недели назад
99

Итак, ядро ​​проблемы таково: deployJava.js использует document.write. Если вы используете этот метод ПОСЛЕ рендеринга страницы (в отличие от частичного рендеринга страницы), он сначала очистит документ. Что имеет очевидные отрицательные результаты.


Хотя он предназначен для JavaFX, люди сообщили об успехе с dtjava.js, и у меня есть все основания полагать, что это жизнеспособная альтернатива.


Однако другие заинтересованные стороны в моей команде уже сделали работу, связанную с deployJava.js, и не хотят отбрасывать эту работу, а это значит, что мне нужно было использовать deployJava.js. Существует только один способ сделать это: убедитесь, что deployJava вызывается во время рендеринга страницы, а не через Ajax, событие или другой триггер с задержкой.

В конце мы собираем нашу информацию и передаем ее на вторую страницу, которая будет отображать апплет как ожидалось. Он работает, и в большинстве сценариев наши клиенты будут делать это так или иначе (сбор информации, передача ее на серверной стороне и получение ответа на перенаправление), поэтому не было смысла заставлять проблему. Мы передаем информацию через строку запроса, но вместо этого вы могли бы использовать файлы cookie и/или localstorage API, если хотите, чтобы window.location оставался более чистым.


Спасибо за ответы, хотя они были в области комментариев. Другие ответы все еще принимаются на борту, если кто-то имеет лучший способ сделать это!

ответил(а) 2021-01-25T12:37:43+03:00 4 месяца, 2 недели назад
88

Если вы используете 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);
});

ответил(а) 2021-01-25T12:37:43+03:00 4 месяца, 2 недели назад
63

Чтобы решить эту неприятную проблему, я загрузил и взломал deployJava.js по строке 316, заменив строку на свой собственный:


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

Где myDiv - это глобальная переменная js, установленная в желаемый div перед вызовом runApplet:


myDiv = jQuery('#someDiv');

Если вы найдете менее интрузивное решение, дайте мне знать...

ответил(а) 2021-01-25T12:37:43+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема