#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’, когда его нужно уничтожить.