IE의 애니메이션 GIF 중지


109

링크를 클릭하거나 IE의 페이지에서 양식을 제출 한 후에도 애니메이션 GIF가 계속 애니메이션되도록 만드는 방법을 아는 사람이 있습니까? 이것은 다른 브라우저에서 잘 작동합니다.

감사.


3
여기에 대한 유일한 정답은 @AnthonyWJones입니다. POST의 경우 실제 제출 (Ajax 아님)은 작동하지 않습니다.
P.Brian.Mackey

사실 그것은 전혀 사실이 아닙니다. 시간 초과를 사용하여 onsubmit 이벤트에 이미지를 표시하는 것은 POST 양식에서 잘 작동합니다.
oldwizard

@ P.Brian.Mackey-j.davis의 솔루션은 포스트 요청에도 도움이되었습니다. 그러나 우리는 또한 ajaxcontrol 툴킷을 사용하여 서버 측 메소드를 호출합니다. 이 경우에는 작동하지 않습니다.
Ankur-m


여기 에서 Jourdan의 답변을 확인 하십시오 . 더 나은 솔루션이라고 생각하며 하위 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, ie6, ie7 및 ie8에서 테스트되었습니다.



8
코드에서 실제로 POST를 수행하지 않습니다. "onclick ="javascript 호출 만. 제출을 클릭했을 때 예상대로 POST로 시도했지만 작동하지 않습니다.
P.Brian.Mackey

onclick이 끝날 때 false를 반환하지 않는 한 제출 버튼은 POST를 트리거합니다. 이것이 제출 버튼이하는 일입니다.
Frug

2
-1이 답변도 잘못되었습니다. IE7 및 IE8에서는 양식 제출 후 gif 이미지 FREZEES에서 작동하지 않습니다.
Marco Demaio 2012

2
이것은 jQuery를 사용하여 나를 위해 일했습니다. 해킹은 꽤 이상합니다. 인정해야합니다. 다음은 내 예에서 작동 한 방식입니다. code<div id = "img_content"> <img id = 'aj_loader'src = 'assets / 2631.gif'style = "display : none;"/> </ div> 그리고 다음 : code$ ( "# img_content"). html ($ ( "# img_content"). html ());
misaizdaleka

35

오래된 질문이지만 동료 Google 직원을 위해 다음을 게시하십시오.

Spin.js는이 사용 사례에서 작동합니다 : http://fgnass.github.com/spin.js/


수정, 작동하지만 페이지가로드되기 직전에 애니메이션이 중지됩니다. 따라서로드가 짧으면 애니메이션이 원래 문제처럼 멈춘 것처럼 보입니다.
James McMahon 2011 년

훌륭한 솔루션, ie11에서 잘 작동하므로 여전히 모든 것이 최신이며 지원되는 것처럼 보입니다.
Adam Knights

spin.js는 안타깝게도 CPU 집약적입니다. 문제 보기 / 8 , issues / 200 , issues / 215
user247702

Spin.js가 iPhone에서 작동하지 않습니다. 또한 페이지가 다른 페이지로 리디렉션되는 즉시 중지됩니다.
Ankur-m

18

IE는 링크를 클릭하면 현재 페이지 내용이 대체 될 새로운 탐색이 시작된다고 가정합니다. 이를 확인하는 프로세스의 일부로 GIF 애니메이션 코드를 중지합니다. 나는 당신이 그것에 대해 할 수있는 일이 없을 것입니다 (실제로 onclick 이벤트에서 false를 반환하는 경우를 탐색하지 않는 한).


+1-두 가지 상위 답변을 모두 시도했습니다. 둘 다 작동하지 않습니다. 모든 Form 제출을 ajax 요청으로 만들지는 않을 것입니다.
P.Brian.Mackey

2
+1 동의합니다. 이것은 spin.js 및 CodeMonkey 해결 방법을 제외하고는 유일한 정답입니다.
Marco Demaio 2012

7
그리고 여전히 IE10
ChadT 2013

9
그리고 여전히 IE11에서!
bileyazan 2014

2
2017 체크인!
Steve Wakeford

17

다음은 method = "post"로 양식 제출시 잘 작동하는 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에서만 테스트되었습니다). 하지만 메모리에 이미지를 미리로드 할 때 애니메이션이 중지되는 이유를 알 수 없습니다. 나는 당신의 바이올린에 미리로드 할 수 있고 그것은 내 코드에서가 아니라 argh에서 잘 작동합니다.
사이먼 이스트

당신은 뭔가 잘못했습니다. :) 페이지에 스피너 이미지를 img 태그로 추가 하시겠습니까? URL을 업데이트했습니다. 도움이 될 수 있습니다.
oldwizard 2013 년

IE는 멍청한 것 같습니다. 미리로드되면 애니메이션을 중지합니다. jquery를 통해 삽입되면 애니메이션이 계속해서 움직입니다. 이 솔루션에 감사드립니다.
Anthony

8

이 게시물을 보았고 이미 답변을 받았지만 IE 10에만 해당되는이 문제를 해결하는 데 도움이되는 정보를 게시해야하며 비슷한 문제로이 게시물에 도착하는 다른 사람들에게 도움이 될 수 있다고 생각했습니다.

IE 10에서 애니메이션 GIF가 표시되지 않는 방식에 당황해서이 보석을 발견했습니다.

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을 다시 추가하는 것과 결합합니다. 둘 다 필요한 이유를 잘 모르겠습니다. '가시성'을 수정하는 대신 '표시'(차단)도 설정하고 있다는 점이 흥미 롭습니다.
Cfold

2

여기 내가 한 일이 있습니다. 당신이해야 할 일은 GIF를 분해하여 10 개의 이미지 (이 경우 나는으로 시작 01.gif하고 끝났음 10.gif) 를 말하고 보관할 디렉토리를 지정하는 것입니다.

HTML :

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

자바 스크립트 :

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). 참고 : 60 년대부터 브라우저를 실행하는 컴퓨터가 없기 때문에 IE6에서 테스트하지 않았습니다. 방법이 너무 간단해서 IE6 이하에서도 작동 할 수 있습니다.


1
이 해결 방법은 기본적으로 gif 애니메이션을 시뮬레이션하기 위해 JS setTimeout을 사용하는 spin, js의 동일한 원칙에 따라 작동합니다.
Marco Demaio 2012

1

이와 관련하여 스타일 시트에 스타일이 유지되도록 애니메이션 GIF가 배경 이미지로 사용되는 수정 사항을 찾아야했습니다. 비슷한 수정이 저에게도 효과가있었습니다 ... 제 스크립트는 다음과 같이 진행되었습니다 (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;
}

[편집] 좀 더 테스트를 통해 IE8의 배경 이미지에서 작동하지 않는다는 것을 깨달았습니다. IE8이 페이지를로드하는 gif 애니메이션을 렌더링하도록 생각할 수있는 모든 것을 시도해 왔지만 지금은 불가능 해 보입니다.


jQuery ( $(spinner).css('background-image'))를 사용하여 CSS 코드를 읽는 이유 는 동일하게 설정하는 대신 순수한 Javascript 방식 ( spinner.style.backgroundImage)을 사용하는 것입니다. 귀하의 코드는 어떤 브라우저에서도 작동하지 않습니다. 코드를 직접 사용하면 cannot set backgroundImage property of undefined오류 가 발생합니다. jQuery를 사용하여 CSS를 설정하도록 코드를 변경하면 코드가 오류없이 실행되지만 이미지가 재설정되지 않고 div / spinner 요소가 비어 있습니다. 모르겠어, 왜?
trejder 2014-12-16

확인되었습니다 ! 기회가 없으며 코드가 작동합니다. 또는이벤트에서 속성을 설정할 수있는브라우저가 없습니다 (2014 년 12 월 현재). 자세한 내용은 이 질문 또는 이 jsFiddle 을 참조하십시오. background-imageunloadbeforeunload
trejder

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 에서 찾았 으며 작동합니다! 표시로 설정하기 전에 이미지를 다시로드하기 만하면됩니다. 버튼의 onclick에서 다음 자바 스크립트 함수를 호출합니다.

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 버그의 희생양이되지 않음을 발견했습니다. VML 태그를 사용하여 IE 브라우저에 배치하면 애니메이션 GIF가 페이지 언로드 중에 계속 이동합니다.

VML 태그를 사용하기로 결정하기 전에 먼저 VML을 감지 했으므로 일반적인 애니메이션 GIF 동작을 사용하는 FireFox 및 기타 브라우저에서 작동합니다.

이 문제를 해결 한 방법은 다음과 같습니다.

<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

Jquery :

$("#WhereYouWantTheImageToAppear").html('<img src="./Animated.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의 .load (); 로드 한 다음 이미지 앞에 추가합니다.

IE 7 이상에서 작동


0

이 질문에 답하기에는 아주 늦었지만 CSS에서 base64 URI로 인코딩 된 배경 이미지를 별도의 이미지로 유지하는 대신 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()에서 페이지에서 찾은 각 FORM은 position:relative속성을 수신 한 다음 각 FORM 에 보이지 않는 DIV.bg-overlay.

2) 그 후 내 웹 사이트의 각 제출 값이 btn-primarycss 클래스 로 식별된다고 가정하고 다시 document.ready()에서이 버튼을 찾고 각 버튼의 FORM 부모로 이동 한 다음 양식 제출시 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 애니메이션 정지"문제가 해결 됩니다 (말했듯이 Chrome이 아닌 IE 및 Firefox에서이 문제를 발견했습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.