Анімований GIF у зупинці IE


109

Хтось знає, що можна зробити, щоб змусити анімовані файли GIF продовжувати анімувати після натискання на посилання або надсилання форми на сторінці, на яку ви працюєте в IE? Це добре працює в інших браузерах.

Дякую.


3
Єдина правильна відповідь тут - @AnthonyWJones. Для POST, фактичне подання (не ajax) нічого не працює.
P.Brian.Mackey

Насправді це зовсім не так. Використання тайм-ауту для відображення зображення під час подання події працює чудово у формі POST.
oldwizard

@ P.Brian.Mackey - рішення j.davis працювало на мене навіть для запиту на пошту. Однак ми також використовуємо інструментарій ajaxcontrol для виклику методу на стороні сервера. У цьому випадку це не працює.
Анкур-м

можливий дублікат анімованих gif-
файлів

Ознайомтеся з відповіддю Журдана тут . Я думаю, що це краще рішення, і воно працює і на нижчому рівні IE.
Jason Kresowaty

Відповіді:


99

Прийняте рішення для мене не спрацювало.

Після ще кількох досліджень я натрапив на це рішення , і воно фактично спрацьовує.

Ось суть його:

function showProgress() {
    var pb = document.getElementById("progressBar");
    pb.innerHTML = '<img src="./progress-bar.gif" width="200" height ="40"/>';
    pb.style.display = '';
}

та у вашому html:

<input type="submit" value="Submit" onclick="showProgress()" />
<div id="progressBar" style="display: none;">
    <img src="./progress-bar.gif" width="200" height ="40"/>
</div>

Отже, коли форма подається, <img/>тег вставляється, і чомусь на нього не впливають тобто проблеми з анімацією.

Тестовано у Firefox, тобто 6, тобто 7 і 8.



8
У своєму коді ви ніколи не виконуєте POST. Лише виклик javascript "onclick =". Я спробував це з POST, як очікується, коли натискаєте кнопку Відправити, і це не працює.
P.Brian.Mackey

Якщо ви не повернете помилкове в кінці вашого натискання, кнопка надсилання запустить POST. Саме це і роблять кнопки для надсилання.
Фруг

2
-1 Ця відповідь також помилкова. Це не працює в IE7 та IE8, gif-зображення FREZEES після надсилання форми.
Марко Демайо

2
Це працювало для мене за допомогою jQuery. Хак досить дивний, мушу визнати. Ось як це працювало у моєму прикладі: code<div id = "img_content"> <img id = 'aj_loader' src = 'properties / 2631.gif' style = "display: none;" /> </div> І тоді: code$ ("# img_content"). html ($ ("# img_content"). html ());
misaizdaleka

35

старе питання, але розміщуйте це для інших гуглерів:

Spin.js працює для цього випадку використання: http://fgnass.github.com/spin.js/


Виправлення, воно працює, але перестає анімувати безпосередньо перед завантаженням сторінки. Тож якщо це коротке завантаження, схоже, що анімація замерзає, як у вихідному номері.
Джеймс Макмахон

Прекрасне рішення, добре працює в ie11, тому все ще здається всім оновленим та підтримуваним.
Адам Найтс,

На жаль, spin.js досить інтенсивний процесор. Див. Випуски / 8 , випуски / 200 , випуски / 215
користувач247702

Spin.js не працює для мене на iPhone. Він також зависає, як тільки сторінку перенаправляється на іншу.
Анкур-м

18

IE передбачає, що натискання на посилання передвіщає нову навігацію, де буде замінено поточний вміст сторінки. В рамках процесу перпіляції для цього він зупиняє код, який оживляє GIF. Я сумніваюся, що ви можете зробити з цим що завгодно (якщо тільки ви насправді не пересуваєтеся, в цьому випадку використовуйте return false у події onclick).


+1 - я спробував обидва найкращі відповіді. Не працює. Я не збираюсь робити всі мої Форми поданнями на запити ajax.
P.Brian.Mackey

2
+1 Я погоджуюся, це єдина справжня правильна відповідь, за винятком spin.js та способів вирішення CodeMonkey.
Марко Демайо

7
А ще в
IE10

9
А ще в IE11!
bileyazan

2
2017 заїзд!
Стів Вейкфорд

17

Ось jsFiddle, який працює чудово під час подання форми з методом = "повідомлення". Спінер додається при події надсилання форми.

$("form").bind("submit", onFormSubmit);

function onFormSubmit() {
    setTimeout(showSpinner, 1);
}

function showSpinner() {
    $("body").append($('<img id="spinner" src="spinner.gif" alt="Spinner" />'));
}

Дивіться код jsFiddle тут

Тестуйте його у своєму браузері IE тут


2
Так, це чудово (поки що протестовано лише в IE 10). Але я не можу зрозуміти, чому анімація зупиняється, коли я попередньо завантажую зображення в пам'ять. Я можу передзавантажити вашу скрипку, і вона працює добре, тільки не в моєму коді, арг.
Simon Simon

Ви щось зробили не так. :) Додати зображення спінера як тег img на свою сторінку? Я оновив URL-адресу. Може допомогти.
oldwizard

IE - це просто ривок. Припиняє анімацію після попереднього завантаження. Якщо вводити через jquery, анімація продовжуватиме балакати. Дякую за це рішення.
Ентоні

8

Я зайшов на цю посаду, і, поки на неї вже відповіли, я відчув, що повинен опублікувати деяку інформацію, яка допомогла мені вирішити цю проблему, характерну для IE 10, і могла б допомогти іншим, хто прийшов на цю посаду, з подібною проблемою.

Мене здивувало те, як анімовані gif просто не відображаються в IE 10, а потім знайшов цей дорогоцінний камінь.

ToolsInternet OptionsAdvancedMultiMediaPlay animations in webpages

сподіваюся, що це допомагає.


Ні, це не вирішує проблему в IE11 (але +1 за спробу допомогти)! :( Тобто - у мене ввімкнено цю опцію, а анімовані GIF-файли не анімовані, коли вони відображаються у події beforeunloadчи unloadподії.
trejder

1
Це не має нічого спільного з проблемою, поставленою у питанні.
user247702

2

Я зіткнувся з цією проблемою, намагаючись показати gif завантаження під час обробки надсилання форми. Це отримало додатковий шар задоволення тим, що той самий підряд повинен був запустити валідатор, щоб переконатися, що форма правильна. Як і всі інші (у будь-якій публікації форми IE / gif в Інтернеті), я не міг дозволити завантажувальну машину для "закрутки" в IE (і, в моєму випадку, підтвердити / подати форму). Переглядаючи поради на веб-сайті http://www.west-wind.com, я знайшов допис від ev13wt, який припустив, що проблема полягає в тому, що "... IE не надає зображення як анімоване, оскільки воно було непомітним під час його надання. " Це мало сенс. Його рішення:

Залиште порожнім місце, де би перейшов gif, і використовуйте JavaScript для встановлення джерела у функції onsubmit - document.getElementById ('loadingGif'). Src = "шлях до файлу gif".

Ось як я це реалізував:

<script type="text/javascript">
    function validateForm(form) {

        if (isNotEmptyid(form.A)) {
            if (isLen4(form.B)) {        
                if (isNotEmptydt(form.C)) {
                    if (isNumber(form.D)) {        
                        if (isLen6(form.E)){
                            if (isNotEmptynum(form.F)) {
                                if (isLen5(form.G)){
                                    document.getElementById('tabs').style.display = "none";                
                                    document.getElementById('dvloader').style.display = "block";                
                                    document.getElementById('loadingGif').src = "/images/ajax-loader.gif"; 
                                    return true;
                                }
                            }
                        }
                    }
                }
            }
        }
        return false;   
    }               
</script>

<form name="payo" action="process" method="post" onsubmit="return validateForm(this)">
    <!-- FORM INPUTS... -->
    <input type="submit" name="submit" value=" Authorize ">

    <div style="display:none" id="dvloader">  
        <img id="loadingGif" src="" alt="Animated Image that appears during processing of document." />
        Working... this process may take several minutes.
    </div>

</form>

Це добре працювало для мене у всіх браузерах!


Налаштування src працювало і для мене в IE11. У моєму випадку це поєднання з повторним додаванням img html спочатку. Я не впевнений, навіщо мені потрібно обоє. Цікаво зазначити, що я також встановлюю 'display' (щоб заблокувати), на відміну від зміни 'vidibility'.
Cfold

2

Ось що я зробив. Все, що вам потрібно, - це розбити свій GIF, щоб сказати 10 зображень (у цьому випадку я починав 01.gifі закінчував 10.gif) і вказати каталог, де ви їх зберігаєте.

HTML:

<div id="tester"></div>

JavaScript:

function pad2(number) {   
    return (number < 10 ? '0' : '') + number 
}
var 
    dirURL = 'path/to/your/images/folder',
    ajaxLoader = document.createElement('img');
ajaxLoader.className = 'ajax-image-loader';
jQuery(document).ready(function(){
    jQuery('#tester').append(ajaxLoader);
    set(0);
});
function set(i) {
    if (i > 10) i = 1;    
    img.src = dirURL + pad2(i) + '.gif';
    setTimeout(function() {
        set(++i);
    }, 100);    
}

Цей метод працює з IE7, IE8 та IE9 (все-таки для IE9, який ви могли використовувати spin.js ). ПРИМІТКА: Я не тестував це в IE6, оскільки у мене немає машини, що працює з браузером з 60-х років, хоча метод настільки простий, він, ймовірно, працює навіть в IE6 і нижче.


1
Це вирішення, засноване на тому самому принципі спіну, js в основному використовує JS setTimeout для імітації gif-анімації.
Марко Демайо

1

У зв’язку з цим мені довелося знайти виправлення, де анімовані графічні зображення використовувались як фонове зображення, щоб забезпечити збереження стилю до таблиці стилів. Подібне виправлення працювало і для мене ... мій сценарій вийшов приблизно таким (я використовую jQuery, щоб полегшити обчислений стиль тла - як це зробити без jQuery - це тема для іншої публікації):

var spinner = <give me a spinner element>

window.onbeforeunload = function() {
  bg_image = $(spinner).css('background-image');
  spinner.style.backgroundImage = 'none';
  spinner.style.backgroundImage = bg_image;
}

[EDIT] За допомогою трохи більше тестування я щойно зрозумів, що це не працює з фоновими зображеннями в IE8. Я намагаюся все, що я можу придумати, щоб IE8 відтворила анімаційну анімацію, яка завантажує сторінку, але наразі це не представляється можливим.


Чому ви читаєте CSS-код за допомогою jQuery ( $(spinner).css('background-image')), але замість того, щоб встановлювати його так само, ви використовуєте чистий Javascript шлях ( spinner.style.backgroundImage). Ваш код не працює для мене в жодному браузері. Якщо я використовую безпосередньо ваш код, то я отримую cannot set backgroundImage property of undefinedпомилку. Якщо я зміню ваш код на встановлення CSS за допомогою jQuery, код запускається без будь-яких помилок, але зображення не скидається, і елемент div / spinner залишається порожнім. Я не знаю, чому?
трейдер

Перевірено ! Нема шансів, ваш код запрацює. Жоден веб-переглядач не може (станом на грудень 2014 р.) Встановлюватиbackground-imageвластивостіunloadабоbeforeunloadподії. Докладніше див. У цьому питанні чи у цьому jsFiddle .
трейдер

1

Спираючись на відповідь @danfolkes, це працювало для мене в IE 8 та ASP.NET MVC3.

У нашому _Layout.cshtml

<body style="min-width: 800px">
    <div id="progress">
        <div style="min-height: 200px">
        </div>
        <div id="throbber">
            <img src="..\..\Content\ajax-loader.gif" alt="Progress" style="display: block;
                margin-left: auto; margin-right: auto" />
        </div>
    </div>
    <div id="main">

<<< зміст тут >>> ...

<script type="text/javascript" language="javascript">
    function ShowThrobber() {
        $('#main').hide();
        $('#progress').show();
        // Work around IE bug which freezes gifs
        if (navigator.appName == 'Microsoft Internet Explorer') {
            // Work around IE bug which freezes gifs
            $("#throbber").html('<img src="../../Content/ajax-loader.gif" alt="Progress" style="display: block; margin-left: auto; margin-right: auto"/>');
         }
</script>
<script type="text/javascript" language="javascript">
    function HideThrobber() {
        $('#main').show();
        $('#progress').hide();
    }
</script>
<script type="text/javascript" language="javascript">
    $(document).ready(function () {
        HideThrobber();
    });
</script>

І в наших навігаційних посиланнях:

<input type="submit" value="Finish" class="submit-link" onclick="ShowThrobber()"/>

або

@Html.ActionLink("DoSometthing", "MyController", new { Model.SomeProperty }, new { onclick = "ShowThrobber()" })

1

Знайшов це рішення на веб-сайті http://timexwebdev.blogspot.com/2009/11/html-postback-freezes-animated-gifs.html і воно РОБОТАЄ! Просто перезавантажте зображення перед тим, як встановити видиме. Викличте наступну функцію Javascript від натискання кнопки:

function showLoader()
{
   //*** Reload the image for IE ***
   document.getElementById('loader').src='./images/loader.gif';
   //*** Let's make the image visible ***
   document.getElementById('loader').style.visibility = 'visible';
}

0

Я усвідомлюю, що це давнє запитання, і на сьогоднішній день в оригінальних плакатах кожен знайшов рішення, яке працює для них, але я наткнувся на цю проблему і виявив, що теги VML не стають жертвою цієї помилки IE. Анімовані GIF все ще рухаються під час завантаження сторінки при розміщенні в браузері IE за допомогою тегів VML.

Зверніть увагу: я спочатку виявив VML, перш ніж прийняти рішення використовувати теги VML, тому це працює в FireFox та інших браузерах, використовуючи нормальну анімовану поведінку GIF.

Ось як я це вирішив.

<input class="myExitButton" type="button" value="Click me"  />

<div class="loadingNextPage" style="display:none" >
    <span style="left:-24px; POSITION: relative; WIDTH: 48px; DISPLAY: inline-block; HEIGHT: 48px" class="spinnerImageVml"><?xml:namespace prefix="rvml" ns = "urn:schemas-microsoft-com:vml" /><rvml:group style="POSITION: absolute; WIDTH: 48px; HEIGHT: 48px; rotation: 1deg" class="rvml" coordsize = "47,47"><rvml:image style="POSITION: absolute; WIDTH: 48px; HEIGHT: 48px; TOP: 0px; LEFT: 0px" class="rvml" src="/images/loading_gray.gif" coordsize="21600,21600"></rvml:image></rvml:group></span>
    <img class="spinnerImage" src="/images/loading_gray.gif" alt="loading..." />
    <div>Just one moment while we access this information...</div>
</div>

<script language="javascript" type="text/javascript">
    window.LoadProgress = (function (progress, $) {

        var getdialogHeight = function (height) {
            var isIE = navigator.userAgent.toLowerCase().indexOf('msie') > -1;
            if (isIE) {
                return height + 'px';
            }
            return height;
        };

        var isVmlSupported = function () {
            var a = document.body.appendChild(document.createElement('div'));
            a.innerHTML = '<v:shape id="vml_flag1" adj="1" />';
            var b = a.firstChild;
            b.style.behavior = "url(#default#VML)";
            var supported = b ? typeof b.adj == "object" : true;
            a.parentNode.removeChild(a);
            return supported;
        };

        var showAnimationDuringPageUnload = function () {
            if (isVmlSupported()) {
                $(".loadingNextPage > .spinnerImage").hide();
            }
            else {
                $(".loadingNextPage > .spinnerImageVml").hide();
            }
        };

        var openLoadingMessage = function () {
            $(".loadingNextPage").dialog({
                modal: true,
                closeOnEscape: true,
                title: 'Please wait...',
                closeText: 'x',
                height: getdialogHeight(200),
                buttons: {
                    "Close": function () {
                        $(this).dialog("close");
                    }
                }
            });
        };

        $('.myExitButton').click(function () {
            openLoadingMessage();
            showAnimationDuringPageUnload();
            window.location.href = 'http://www.stackoverflow.com';
        });


        return progress;
    })(window.LoadProgress || {}, window.jQuery);
</script>

Звичайно, це покладається на jQuery, jQueryUI і вимагає анімований GIF певного типу ("/images/loading_gray.gif").



0

Просто було подібне питання. Вони прекрасно працювали для мене.

$('#myElement').prepend('<img src="/path/to/img.gif" alt="My Gif" title="Loading" />');

$('<img src="/path/to/img.gif" alt="My Gif" title="Loading" />').prependTo('#myElement');

Інша ідея полягала у використанні jQuery's .load (); щоб завантажити та потім додати зображення.

Працює в IE 7+


0

Дуже дуже пізно відповісти на це, але я щойно виявив, що використання фонового зображення, кодованого як базовий 64 URI в CSS, а не утримується як окреме зображення, продовжує анімувати в IE8.


0

Дуже простий спосіб - використовувати плагін jQuery та SimpleModal . Тоді, коли мені потрібно буде показати свій "завантажувальний" gif при подачі, я роблю:

$('*').css('cursor','wait');
$.modal("<table style='white-space: nowrap'><tr><td style='white-space: nowrap'><b>Please wait...</b></td><td><img alt='Please wait' src='loader.gif' /></td></tr></table>", {escClose:false} );

-1

У мене була така ж проблема, спільна також для інших борців, таких як Firefox. Нарешті я виявив, що динамічно створюваний елемент з анімованим gif всередині форми для подачі форми не анімував, тому я розробив наступний трудопис.

1) На document.ready()кожній ФОРМІ, знайденій на сторінці, отримують position:relativeвластивість, а потім до кожної додається невидимка DIV.bg-overlay.

2) Після цього, припускаючи, що кожне значення мого веб-сайту визначається btn-primaryкласом css, знову на document.ready(), я шукаю ці кнопки, переходжу до батьківського ФОРМУ кожного з них, і при подачі форми я запускаю showOverlayOnFormExecution(this,true);функцію, передаючи натиснуту кнопку і булева, яка перемикає видимість DIV.bg-overlay.

$(document).ready(function() {

  //Append LOADING image to all forms
  $('form').css('position','relative').append('<div class="bg-overlay" style="display:none;"><img src="/images/loading.gif"></div>');

  //At form submit, fires a specific function
  $('form .btn-primary').closest('form').submit(function (e) {
    showOverlayOnFormExecution(this,true);
  });
});

CSS для DIV.bg-overlay:

.bg-overlay
{
  width:100%;
  height:100%;
  position:absolute;
  top:0;
  left:0;
  background:rgba(255,255,255,0.6);
  z-index:100;
}

.bg-overlay img
{
  position:absolute;
  left:50%;
  top:50%;
  margin-left:-40px; //my loading images is 80x80 px. This is done to center it horizontally and vertically.
  margin-top:-40px;
  max-width:auto;
  max-height:80px;
}

3) При будь-якому поданні форми наступна функція запускається, щоб показати напівбілене накладення фону по всьому (що заперечує можливість знову взаємодіяти з формою) та анімований gif всередині неї (що візуально показує дію завантаження).

function showOverlayOnFormExecution(clicked_button, showOrNot) 
{
    if(showOrNot == 1)
    {
        //Add "content" of #bg-overlay_container (copying it) to the confrm that contains clicked button 
        $(clicked_button).closest('form').find('.bg-overlay').show();
    }
    else
        $('form .bg-overlay').hide();
}

Показаний анімований gif при надсиланні форми, замість того, щоб додавати його на цьому заході, вирішує проблему «заморожування анімації gif» у різних браузерах (як сказано, я виявив цю проблему в IE та Firefox, а не в Chrome)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.