Как да покажа изображение за визуализация, докато Flash SWF се зарежда?

Имам някои Flash SWF файлове на трети страни на моя сайт, които са с размер до 100 KB. напр. Flash видео плейърът "JWPlayer" SWF е 98KB.

Това е добре за хората с широколентов достъп, но не е толкова добре за посетителите с бавна честотна лента за набиране. например при 40 kbits/s, говорим за 20 секунди за изтегляне.

Проблемът е, че при бавни връзки посетителите виждат само статичен бял екран и могат да затворят страницата, мислейки, че е мъртва. Ако щракна с десния бутон върху областта, където трябва да отиде SWF, обектът на Adobe Flash Player заема мястото, но SWF файлът на трета страна все още не е завършил зареждането.

Бих искал посетителите на уебсайта да виждат GIF за зареждане или нещо подобно.

За съжаление нито един от SWF файловете на трети страни няма елемент за предварително зареждане. И те не са с отворен код, така че не мога да добавя предварително зареждане към тях.

Та въпросът ми е...

Има ли някакъв начин да се покаже зареждащо се изображение, за предпочитане GIF анимация, докато SWF се зарежда?

Например, има ли някакъв начин да принудите Adobe Flash Player да показва изображение, докато се зарежда в SWF?

Нямам никакви умения за кодиране на Flash, така че решение, което не включва създаване на допълнителен SWF или SWF в рамките на SWF, вероятно не е най-доброто за мен, но може да си струва да се добави към публикацията, в случай че други хора имат подобен проблем.

Използвам swfobject 2.2 за вграждане на SWF файлове, така че решение, което взема това предвид или поне не нарушава, би помогнало.

Много благодаря, че отделихте време да прочетете публикацията ми, дори и да не можете да помогнете.

Дейв


person David    schedule 12.08.2011    source източник
comment
Мислех да използвам jquery, за да добавя изображението с помощта на CSS z-индекс пред Flash обекта, след което да използвам swfobject callbackFunction, за да го премахна, след като SWF се зареди. Правил съм това в миналото, за да поставя лого пред SWF. Но това включваше игра с параметъра wmode на флаш обекта и имаше проблеми, които може да са разрешени или не, свързани с Flash и параметъра wmode. Не си спомням дали проблемът беше във версията на Flash или в кой браузър, но беше достатъчно, за да ме спре да използвам този метод.   -  person David    schedule 12.08.2011


Отговори (2)


Без да знаете кой SWF файл на трета страна използвате, може да е трудно, но ето няколко неща, за които да помислите:

Един подход би бил да скриете swf (или div, в който е swf), докато не бъде зареден, и след това да го разкриете, след като приключи. Междувременно можете да поставите въртящо се изображение / зареждащо изображение на негово място. Въпреки това, това, от което наистина се нуждаете, е javascript функция, която се извиква, след като зареждането приключи. След като това се случи, можете да използвате jQuery, за да .show() или .hide() съответно вашия spinner и swf.

JWPlayer има някои събития, които можете да използвате. Изглежда, че onReady ще свърши работа вместо вас.

Що се отнася до другите swf файлове на трети страни, бих разгледал тяхната документация за подобни обратни извиквания на javascript. Знам, че swfobject има обратно извикване onLoad, както и няколко други решения за вграждане, като Swiff, ако приемем, че можете да ги използвате.

Късмет!

РЕДАКТИРАНЕ: Обратното извикване на swfobject може да бъде извикано, когато swf е успешно вграден, което не е задължително заредено. Най-добрият ви залог е да си поиграете с това и да видите дали работи - или да използвате функциите за обратно извикване на swf на трета страна, когато е възможно.

РЕДАКТИРАНЕ 2: Ето пример за флаш зареждане.

import flash.net.URLRequest;
import flash.display.Loader;
import flash.events.Event;

function startLoad() {
    var mLoader:Loader = new Loader();
    var mRequest:URLRequest = new URLRequest("url-to-your-swf.swf");
    mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
    mLoader.load(mRequest);
}

function onCompleteHandler(loadEvent:Event){
    addChild(loadEvent.currentTarget.content);
    //Here's where you specify your js function
    ExternalInterface.call("flashLoaded"); // <-- where 'flashloaded' is a js function

}

startLoad();
person Chazbot    schedule 14.08.2011
comment
Здравей Chazbot. Приех предложението ти. Първо, вашата РЕДАКТИРАНЕ изглежда правилна. Изглежда, че веднага щом OBJECT бъде създаден на страницата (която съдържа Adobe Flash Player), swfobject задейства своята функция за обратно извикване. т.е. задейства се преди swf да се е заредил и затова не мога да използвам тази функция за обратно извикване. И така, успях да намеря onReady събития за всеки от swf файловете на трети страни и опитах с тях. - person David; 15.08.2011
comment
За съжаление, изглежда, че използването на функцията hide() на jquery по същество прави CSS display:none и се оказва, че това спира или блокира флаш обекта. Събитията onReady никога не се активират. Четейки в мрежата, изглежда, че това може дори да е проектирано. Следващата публикация предлага вместо да използвате display:none, можете да зададете div, който съдържа флаш обекта на CSS width:1px; височина 1px; overflow:hidden .... stoimen.com/blog/2009/04/14/load-flash-swf-in-hidden-div .... и след това, когато се задейства събитието onReady, задайте размера обратно до пълен размер. - person David; 15.08.2011
comment
Въпреки че този подход успешно ми позволи да покажа зареждащо се изображение, докато swf се зарежда, това има непредвидени последици, тъй като за потребители, които използват приставката Flashblock на Firefox (която спира възпроизвеждането на Flash, докато не натиснете бутона за възпроизвеждане на Flashblock), те не виждат бутона за възпроизвеждане на Flashblock, тъй като е вътре в div, който е 1px на 1px. Това означава, че за тези потребители просто изглежда, че страницата е повредена. - person David; 15.08.2011
comment
Хммм... съжалявам, че това решение не отговаря на вашите нужди. Единственото друго решение, за което мога да се сетя, е да помисля за създаване на контейнер swf, който зарежда следващите swf файлове и показва графика за предварително зареждане там. Разбирам, че се опитвате да избегнете работата с AS3, но при тези уникални обстоятелства това изглежда като най-добрият вариант, при условие че можете да заредите вашите swf файлове на трета страна в родителски swf. - person Chazbot; 16.08.2011
comment
редактирана публикация, за да покаже гореспоменатия флаш зареждач - надявам се това да помогне, пич! - person Chazbot; 16.08.2011

В крайна сметка решихме да използваме смесена настройка:

За потребители с ниска честотна лента задаваме флаш параметъра wmode на „прозрачен“ и задаваме gif да бъде фоново изображение (без зареждащ бутон, тези потребители с ниска честотна лента смятат, че страницата не прави нищо).

Използването на wmode = transparent обаче има отрицателен страничен ефект, тъй като Flash няма да използва хардуерно ускорение. Но за нашите потребители с ниска честотна лента битрейтът на напр. нашето видео са достатъчно ниски, така че в повечето случаи наистина не се нуждаят от хардуерно ускорение.

За потребители с висока честотна лента ние доставяме напр. видео с по-висок битрейт и така хардуерното ускорение става по-важно. За тези потребители използваме wmode = direct и се справяме без GIF за зареждане, тъй като SWF файлът така или иначе се зарежда достатъчно бързо.

С размера на нашите SWF файлове и техните XML файлове, които също трябва да бъдат заредени, ние избрахме ограничение от 1 мегабит честотна лента, където, ако потребителите имат по-висока честотна лента, ние не използваме зареждаща графика и обратното. Други хора може да намерят други нива за по-подходящи.

Бихме предпочели да можем да зададем ограничението на честотната лента много по-ниско, ако е възможно, тъй като на по-стари компютри бихме могли да направим с известно Харуерно ускорение на видео, което е 384 kbit/s, но премахване на зареждащия бутон на потребител с ниска честотна лента като това би означавало, че чакат твърде дълго без нищо да се случва на екрана, а това изглежда по-лошо от загубата на няколко кадъра по време на възпроизвеждане на видео.

Ето връзка към описанието на Adobe за различните wmodes и как различните браузъри ги обработват.

http://kb2.adobe.com/cps/127/tn_12701.html#main_BrowserSupportForWmodes

Надявам се това да помогне на някой друг някой ден.

Дейв

person David    schedule 02.03.2012