Здравствуйте, 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