Flash SWF не инициализируется до тех пор, пока не станет видимым - могу ли я заставить их инициализироваться? - PullRequest
3 голосов
/ 05 мая 2010

У меня есть приложение, которому нужно визуализировать около 100 флэш-графиков (а также другие элементы DOM) в виде ряда строк, которые многократно расширяются по вертикали за пределы текущего видимого окна - иными словами, пользователям приходится прокручивать страницу вниз. увидеть все разные графики.

Это приложение также динамическое, и когда пользователь изменяет значение в DOM (где-либо на странице), ему необходимо распространить это изменение на все графики Flash одновременно.

Поэтому я настроил все обратные вызовы externalInterface и старался не допустить, чтобы какой-либо JS начинал работать до очень важного вызова flashIsReady и ... он работал великолепно, пока я не попытался обновить () существующие SWF-файлы новыми данные.

Здесь было поведение: - Все swfs загружаются (изначально) в оба IE / Fox = хорошо. - Обновление SWF с новым контентом работает в IE, но не в Fox = не хорошо - Обновление SWF-файлов с новым контентом работает в Fox - ТОЛЬКО ЕСЛИ - Я прокрутил вниз до конца страницы, затем обратно наверх - ДО - Я запустил обновление ().

Итак, я начал отслеживать каждый раз, когда SWF звонил в JS, чтобы сказать, что «вспышка готова», и понял, что Firfox отображает SWF только тогда, когда они становятся видимыми. И если честно - это нормально, и на самом деле, я уверен, что IE тоже это делает. Но проблема в том, что Firefox не только не инициализирует swf, Firefox даже не признает, что swf существует (ожидайте после загрузки), если он еще не был виден.

И доказательство того, что вы получаете ошибки JS, говорящие:

"[FlashDOMID]. FlashMethod не является функцией".

Однако, немного прокрутите вниз, подождите, пока он не станет видимым, и вдруг начнёт светиться след

«Готов к работе», «Готов к работе», «Готов к работе», и как только они все готовы, все работает нормально.

Кто-то сказал мне, что FF не инициирует SWF-файлы, пока они не видны - могу ли я форсировать это? Я могу опубликовать код, если вам нужно ... но он довольно тяжелый (трудно вычеркнуть релевантное из остального), и я хотел бы избежать его (ради вас), если это возможно.

Вопрос прост - произошло ли это, и если да, то нашли ли вы решение? Кто-нибудь сейчас, как заставить еще не видимый SWF для инициализации? Спасибо, ребята.

Ответы [ 3 ]

3 голосов
/ 06 мая 2010

Итак ...

После долгих поисков по форуму - согласен, нет изящного способа сделать это, ха-ха! В итоге я решил создать JS-объекты для каждого swf на $ (document) .ready ()

По сути, объект JS будет иметь различные значения, среди которых «data» и «isReady». Когда SWF становился видимым и вызывал JS, чтобы сказать «я готов», я просто перехватывал этот вызов, а затем находил объект JS, на который он ссылался (мне удалось сделать это, передав идентификатор DOM для каждого SWF как один из его flashVars, да, это заставило меня чувствовать себя грязным). Оттуда это была просто игра, чтобы убедиться, что у каждого JS есть «isReady», прежде чем я попытался манипулировать им.

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

Итак ... * ответил.

1 голос
/ 24 ноября 2010

Я знаю, что это, вероятно, поздний ответ.

Но вам нужно изменить wmode с opaque на wmode = "window", поэтому он не работает должным образом в Firefox, IE делает то же самое, но только при загрузке первой страницы.

Установка wmode в opaque приводит к тому, что firefox не инициализирует swf, пока он не будет просмотрен браузером. Тем не менее, это не то же самое для всех браузеров. IE только дозирует его при первом просмотре страницы, Chrome и Safari не делают этого вообще.

К сожалению, я нашел этот вопрос в поисках противоположного. Я пытаюсь заставить плеер не инициализироваться во всех браузерах, пока он не будет виден внутри браузера.

0 голосов
/ 05 мая 2010

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

Поместите все элементы flash в верхний левый угол страницы (чтобы убедиться, что они видны при загрузке страницы), затем используйте функцию pageLoad в javascript, чтобы при необходимости переместить элементы ниже страницы вниз. Jquery позволяет вам сделать это очень легко с помощью функций addClass () и removeClass ()

...