Re[4]: Проблема с повторной инициализацией аплета
От: mikalai.kardash Беларусь  
Дата: 30.07.07 08:01
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, mikalai.kardash, Вы писали:


MK>>Нсколько я понимаю, все происходит следующим образом:

MK>> — я создал <iframe/> с аплетом, я могу к нему обращаться через JS — все ОК
MK>> — как только я передвигаю <iframe/> в другой DIV, JVM пересоздает аплет (причем в моем случае это небыстрый процесс), далее когда я пытаюсь обратиться к аплету через JS то браузер думая, что с аплетом ничего не произошло, пытается обратиться к нему по старой ссылке (указателю, адресу) и я получаю JS error.

B>Это на всех браузерах? Что за адрес апплета? Какая именно ошибка JS?

Я тестирую под IE6+SP2 / WinXP.

B>Что за адрес апплета?

Что вы имеете в виду?


MK>>Я приаттачил тестовый аплет, просто запустите index.html. Для загрузки <iframe/> нажимайте Load, для перемещения Move.

MK>>Аплет выводит сообщения в консоль.
B>Куда приаттачил?
Вот ссылка: http://files.rsdn.ru/67823/test.zip

Немного больше деталей:

Передвигаю я аплет следующим образом:
document.getElementById('div2').appendChild(
document.getElementById('myframe')
);

Т.е. у фрейма меняется parent елемент.

Я сделал тестовый аплет, который только и делает что на init() создает себе ID — рандомный long. JVM log:

//Создаем аплет с ID -1596415299
basic: Loading applet ...
basic: Initializing applet ...
basic: Starting applet ...
Applet: Init called. AppletID = -1596415299
Applet: start method is called. AppletID = -1596415299

Display Panel: PAINT method is called. AppletID = -1596415299


Display Panel: PAINT method is called. AppletID = -1596415299


//в аплете есть функция которую можно вызывать из JS
liveconnect: Invoking method: public void com.applet.MyApplet.scriptCalledFunction(java.lang.String)
liveconnect: Needs conversion: java.lang.String --> java.lang.String

//Все ОК, обращение идет к аплету с ID -1596415299
Display Panel: received message from client [Test message to applet] when AppletID = -1596415299

Display Panel: PAINT method is called. AppletID = -1596415299
Display Panel: PAINT. Message = Test message to applet

//Перемещаем iframe с аплетом в другой DIV
//останавливается аплет
basic: Stopping applet ...
basic: Removed progress listener: sun.plugin.util.GrayBoxPainter@c7e553
basic: Finding information ...
basic: Releasing classloader: sun.plugin.ClassLoaderInfo@16897b2, refcount=0
basic: Caching classloader: sun.plugin.ClassLoaderInfo@16897b2
Applet: stop method is called. AppletID = -1596415299

Display Panel: PAINT method is called. AppletID = -1596415299
Display Panel: PAINT. Message = Test message to applet

//вызывается destroy()
basic: Current classloader cache size: 1
basic: Done ...
basic: Joining applet thread ...
basic: Destroying applet ...
basic: Disposing applet ...
Applet: destroy method is called. AppletID = -1596415299
basic: Joined applet thread ...
basic: Unregistered modality listener
basic: Quiting applet ...

//создается новый аплет с ID -1756904681
basic: Registered modality listener
liveconnect: Invoking JS method: document
liveconnect: Invoking JS method: URL
basic: Referencing classloader: sun.plugin.ClassLoaderInfo@16897b2, refcount=1
basic: Added progress listener: sun.plugin.util.GrayBoxPainter@f4a24a
basic: Loading applet ...
basic: Initializing applet ...
basic: Starting applet ...
Applet: Init called. AppletID = -1756904681
Applet: start method is called. AppletID = -1756904681

Display Panel: PAINT method is called. AppletID = -1756904681


Display Panel: PAINT method is called. AppletID = -1756904681


//пытаемся вызвать из JS функцию аплета
//она вызывается для аплета с ID -1596415299 ... хотя он уже должен бы быть остановлен...
liveconnect: Invoking method: public void com.applet.MyApplet.scriptCalledFunction(java.lang.String)
liveconnect: Needs conversion: java.lang.String --> java.lang.String
Display Panel: received message from client [Test message to applet] when AppletID = -1596415299
liveconnect: Invoking method: public void com.applet.MyApplet.scriptCalledFunction(java.lang.String)
liveconnect: Needs conversion: java.lang.String --> java.lang.String
Display Panel: received message from client [Test message to applet] when AppletID = -1596415299


//прорисовывается только новый аплет
Display Panel: PAINT method is called. AppletID = -1756904681


Display Panel: PAINT method is called. AppletID = -1756904681
ICQ: 241785166
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.