PDA

Просмотр полной версии : ExternalInterface.addCallback и visible:hidden - проблема.


mooncar
15.01.2010, 18:34
Столкнулся с тем, если при использовании ExternalInterface.addCallback блок с флешкой имеет атрибут hidden, то флешка не может зарегистрировать тот метод для JS, который JS должна будет использовать при обращении к флешке.
То есть вот здесь
addCallback(methodName:String, instance:Object, method:Function)
имя метода methodName остается для Java Script неизвестным.
Снимаем у div'а атрибут hidden, в котором сидит флешка, тогда все в порядке.
Кто-нибудь сталкивался, может помочь? Как держать флешку до поры невидимой, но при этом использовать ExternalInterface.addCallback?

PS. Во всех браузерах.

udaaff
15.01.2010, 19:13
А можно див этот сместить просто за пределы окна браузера вместо hidden?

Hauts
15.01.2010, 19:20
Может обернуть флэшку в еще один див, и уже внешнему visible:hidden поставить?
Или display:none попробовать?
Или, не знаю, сработает ли, z-index отрицательный поставить.

mooncar
15.01.2010, 19:22
А можно див этот сместить просто за пределы окна браузера вместо hidden?
Да, сейчас проверил - только так получается. И причем метод регистрируется только если
right:1000px;
top:1000px;
position:absolute;
а вот

right:-1000px;
top:-1000px;
position:absolute;

опять та же история.
Спасибо.

Добавлено через 1 минуту
Может обернуть флэшку в еще один див, и уже внешнему visible:hidden поставить?
Или display:none попробовать?
Или, не знаю, сработает ли, z-index отрицательный поставить.

Все это испробовано и обертка дополнительная, и display:none - результат тот же. А z вообще никак не влияет.
В общем, помогло только смещение далеко-далеко направо и вниз...

Hauts
15.01.2010, 19:31
Интересная особенность, надо будет запомнить.

mooncar
15.01.2010, 21:45
Ого, вот это новости. Вскрылась еще одна пренеприятнейшая деталь.
У меня в этом проекте, как я говороил, до поры флешка должна быть скрыта.
Сделал так. При начальной публикации она рендерится за областью видимости, ей назначается соответствующий для этого класс CSS. Регистрируется метод для вызова из JS.

Теперь самое любопытное. Запуск флешки происходит в два этапа (две команды из JS) - сперва ей назначается другой класс, который выводи ее в область видимости, вторая команда тут же подается на уже на запуск контента флешки (то есть используется зарегистрированный метод.)

Так вот новости какие - все браузеры умнички, а дебил FF после переназначения класса, который выводит флешку в область видимости что делает: заново ее загружает! Что приводит мало к тому, что опять идет ее подгрузка, а самое скверное, что зарегистрированный метод уже не работает. Но ошибок не возникает при этом.
Видимо сначала, когда флешка загрузилась за экраном, она отыграла код, который зарегистрировал метод вызова для JS. После подгрузки и перерисовки флешки уже в рабочей зоне метод как бы существует, ошибки при вызове не происходит (Консоль ошибок FF пустая), но метод не срабаьывает, то есть действия, на него прописанные во флешке не происходят.

В других браузерах все пашет на ура - даже в IE 6 и Opera. Особенно Опера порадовала - в ней все работает без бубна, без всяких IE-фиксов и expression'ов.

Видимо, придется что-то думать дальше.

Hauts
15.01.2010, 22:05
Можно попробовать так: есть три функции:
1. Спрятана ли флэшка (true / false) - эту функцию флэшка вызывает при загрузке.
2. Показать флэшку.
3. Запустить флэшку.

Когда флэшка не в ФФ:
1. Спрятана? JS возвращает true
2. Показывается флэшка
3. Запускается

Когда в ФФ:
1. Спрятана? JS возвращает true
2. Показывается флэшка
3. Флэшка перезагружается.
4. Флэшка заново спрашивает, спрятана ли она, и, либо не получает ответ, что значит, что нужно ее запускать, либо получает false (не спрятана), что тоже значит, что ее нужно запускать.

Комбинаторика. :)

"Спрятана ли флэшка" можно прировнять к "Нужно ли флэшке играть"