Уничтожьте Java-апплет с помощью Javascript

#java #javascript #jquery #web-applications

#java #javascript #jquery — jquery — запрос #веб-приложения #jquery

Вопрос:

Я работаю в фирме-разработчике и делаю серьезный редизайн веб-приложения, в котором все перезагружается после каждого клика, чтобы широко использовать Javascript, так что это действительно похоже на настоящее веб-приложение. Одна из особенностей заключается в использовании веб-программы рисования (подумайте о MSPaint в Интернете), которую я встраиваю на страницу по запросу. После того, как изображение нарисовано и загружено, веб-приложение затем выгружает апплет и переходит к отображению каталога, в который был загружен файл.

Вот тут-то и начинаются Неприятности. Все это работает в IE и Safari, но не в Firefox 3.5 (хотя 3.0 работает отлично). Firebug сообщает мне, что свойство expando отсутствует.

Веб-приложение Tiparlo, над которым я работал ранее, имело аналогичную проблему (фактически, любая манипуляция, выполняемая с апплетом через jQuery, ошибочна), но решило эту проблему, обернув div вокруг и управляя (скрывая и показывая) div вместо апплета. К сожалению, это неприменимо к данному веб-приложению, потому что апплет должен быть уничтожен, а не просто скрыт и показан, поскольку он отнимает слишком много ресурсов для запуска все время там, где он не нужен.

Короче говоря: возможно ли заставить апплет уничтожить сам себя с помощью Javascript? В качестве альтернативы: существует ли обходной путь для решения проблемы jQuery / expando / applet? Я знаю, что апплет устарел в HTML 4.01 strict, но изменить его на object прямо сейчас невозможно.

РЕДАКТИРОВАТЬ: я добавил изображение Firefox Firebug, чтобы показать вам фактическое сообщение об ошибке. Размещение кода ничего не дает, поскольку оно безупречно работает в любом другом браузере и является специфической проблемой Firefox 3.5. Здесь будут картинки

Примечание: вы можете игнорировать ошибку JS, возникающую из button.js .

Комментарии:

1. Что произойдет, если вы уничтожите DIV, который окружает апплет? (не скрывайте его, уничтожьте с помощью removeElement и удалите

2. Я пробовал это, но безрезультатно. Моя теория: я полагаю, что, скрывая родительский div, браузер сам заботится о скрытии дочерних элементов, а не Javascript. Но при удалении родительского div в задачу Javascript также входит удаление дочернего апплета, что приводит к возникновению ошибки expando. Я просматривал средство отслеживания ошибок jQuery, и эта конкретная ошибка указана в дорожной карте для выпуска 1.3.3. Поскольку я не могу дождаться, пока он исправится сам (будет исправлен командой разработчиков jQuery), я должен найти обходной путь.

Ответ №1:

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

Другим вашим вариантом, если вы хотите вызвать destroy из javascript, было бы вставить что-то вроде этого.

 <script>
    document.MyApplet.killApplet();
</script>

public void killApplet() {
    AccessController.doPrivileged(new PrivilegedAction() {
        public Void run() {
            // kill the JVM System.exit(0); return null; 
        }
    });
}
  

Это не лучший способ уничтожить апплет, но в новых браузерах он не выдает ошибку JS, в старых, таких как IE6, он выдает ошибку js.

Комментарии:

1. Да, этот решает проблему (генерирует новый, но я могу справиться с этим).

2. Какую новую проблему он создал, просто любопытно.

3. Если вы уничтожите апплет после завершения вызова javascript, это, вероятно, позволит избежать ошибки. Вы можете сделать это с помощью java.util. Timer.schedule().

4. почему бы не использовать встроенный в апплет метод stop() ?

Ответ №2:

Я бы посоветовал вам создать класс, который отслеживает, чтобы апплет был уничтожен. запустите монитор как своего рода сервлет и заставьте javascript отправлять команды ‘kill applet’, когда его нужно уничтожить.