IE停止中的GIF动画


109

在您单击链接或在IE中打开页面上的表单后,是否有人知道可以使GIF动画继续动画的解决方法?在其他浏览器中也可以正常工作。

谢谢。


3
唯一正确的答案是@AnthonyWJones。对于POST,实际提交(而不是Ajax)无效。
P.Brian.Mackey 2011年

其实那根本不是真的。使用超时在onsubmit事件上显示图像可以与POST表单一起使用。
oldwizard 2013年

@ P.Brian.Mackey-j.davis的解决方案甚至为我提供了帖子请求。但是,我们也使用ajaxcontrol工具箱来调用服务器端方法。在这种情况下不起作用。
Ankur-m


在此处查看乔丹的答案。我认为这是一个更好的解决方案,它也适用于较低级别的IE。
杰森·克雷索瓦蒂

Answers:


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 2011年

除非您在onclick结束时返回false,否则提交按钮将触发POST。这就是提交按钮的作用。
Frug 2011年

2
-1这个答案也是错误的。提交表单后,在IE7和IE8中gif图像FREZEES不起作用。
Marco Demaio

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/


更正,它可以正常工作,但是会在页面加载之前立即停止动画处理。因此,如果负载很短,看起来就像原始发行版中的动画一样冻结。
詹姆斯·麦克马洪

很棒的解决方案,在ie11中可以正常工作,因此似乎仍然是最新的并受支持。
亚当·

不幸的是,spin.js占用大量CPU。请参见Issues / 8Issues / 200
Issues

Spin.js在iPhone上不适用于我。一旦页面被重定向到另一个页面,它也会冻结。
Ankur-m 2015年

18

IE假定单击链接预示着一个新的导航,其中将替换当前页面的内容。作为准备过程的一部分,它停止了动画GIF的代码。我怀疑您对此无能为力(除非您实际上没有导航,在这种情况下,请在onclick事件中使用return false)。


+1-我尝试了两个最佳答案。都不行。我不会将所有表单提交到ajax请求中。
P.Brian.Mackey 2011年

2
+1我同意,这是唯一正确的答案,除了spin.js和CodeMonkey解决方法。
Marco Demaio

7
而且还在IE10
ChadT

9
仍然在IE11中!
bileyazan

2
2017年入住!
史蒂夫·韦克福德

17

这是一个jsFiddle,在使用method =“ post”提交表单时效果很好。微调器添加到表单提交事件中。

$("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标签添加到您的页面吗?我已经更新了网址。可能有帮助。
oldwizard,2013年

IE似乎只是一个混蛋。预加载时停止动画。当通过jquery注入时,动画将继续变化。感谢您的解决方案。
安东尼

8

我来到了这篇文章,尽管已经得到解答,但我觉得我应该发布一些信息来帮助我解决IE 10特有的问题,并且可能会帮助其他人遇到类似问题。

我很困惑如何在IE 10中不显示动画gif,然后发现了这个宝石。

Tools→交通Internet Options→交通Advanced→交通MultiMedia→交通Play animations in webpages

希望这可以帮助。


不,这不能解决IE11中的问题(但可以尝试+1)!:(那就是-我有这个选项启用和动画GIF不会有动画中所示,当beforeunloadunload事件。
trejder

1
这与问题中提出的问题无关。
user247702

2

在尝试处理表单提交时显示加载的gif时,我遇到了此问题。它带来了更多的乐趣,因为相同的onsubmit必须运行验证程序以确保表格正确。像其他所有人一样(在Internet上的每个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>

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
该解决方法基于spin,js的相同原理,基本上使用JS setTimeout模拟gif动画。
Marco Demaio

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年

已验证!没有机会,您的代码将起作用。截至2014年12月,没有浏览器无法设置background-image属性unloadbeforeunload事件。有关详细信息,请参见此问题此jsFiddle
trejder 2014年

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()" })


0

我意识到这是一个古老的问题,到目前为止,每个原始发布者都找到了一种适用于他们的解决方案,但是我遇到了这个问题,发现VML标签不会成为该IE错误的受害者。当使用VML标记将IF动画放置在IE浏览器上时,在页面卸载期间动画GIF仍会移动。

注意,在决定使用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

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的元素没有动画,因此我开发了以下workaorund。

1)在document.ready(),在页面中找到的每个FORM接收position:relative属性,然后在每个表单上附加一个invisible 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动画冻结”问题(如上所述,我在IE和Firefox中发现了此问题,而不是在Chrome中发现了此问题)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.