Hoạt ảnh GIF trong IE dừng


109

Có ai biết cách làm cho GIF động tiếp tục được làm động sau khi bạn nhấp vào liên kết hoặc gửi biểu mẫu trên trang của bạn trong IE không? Điều này hoạt động tốt trong các trình duyệt khác.

Cảm ơn.


3
Câu trả lời đúng duy nhất ở đây là @AnthonyWJones. Đối với POST, các lần gửi thực tế (không phải ajax) không hoạt động.
P.Brian.Mackey

Thực ra điều đó hoàn toàn không đúng. Sử dụng thời gian chờ để hiển thị hình ảnh trong sự kiện gửi trực tiếp hoạt động tốt với biểu mẫu POST.
oldwizard

@ P.Brian.Mackey - giải pháp của j.davis đã làm việc cho tôi ngay cả khi yêu cầu đăng bài. Tuy nhiên, chúng tôi cũng đang sử dụng bộ công cụ ajaxcontrol để thực hiện một cuộc gọi tới phương thức phía máy chủ. Nó không hoạt động trong trường hợp đó.
Ankur-m


Kiểm tra câu trả lời của Jourdan tại đây . Tôi nghĩ đó là một giải pháp tốt hơn và nó cũng hoạt động trên IE cấp thấp hơn.
Jason Kresowaty

Câu trả lời:


99

Giải pháp được chấp nhận không hoạt động đối với tôi.

Sau một số nghiên cứu thêm, tôi đã tìm ra cách giải quyết này và nó thực sự hoạt động.

Đây là ý chính của nó:

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

và trong html của bạn:

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

Vì vậy, khi biểu mẫu được gửi, <img/>thẻ sẽ được chèn và vì một số lý do, nó không bị ảnh hưởng bởi các vấn đề về hoạt ảnh.

Đã thử nghiệm trên Firefox, ie6, ie7 và ie8.



8
Trong mã của bạn, bạn không bao giờ thực sự thực hiện ĐĂNG. Chỉ lệnh gọi javascript "onclick =". Tôi đã thử điều này với một ĐĂNG như mong đợi khi bạn nhấp vào gửi và nó không hoạt động.
P.Brian.Mackey

Trừ khi bạn trả về false ở cuối lần nhấp chuột của mình, nút gửi sẽ kích hoạt ĐĂNG. Đó là những gì các nút gửi làm.
Frug

2
-1 Câu trả lời này cũng SAI. Nó không hoạt động trong IE7 và IE8, FREZEES hình ảnh gif sau khi gửi biểu mẫu.
Marco Demaio

2
Điều này làm việc cho tôi bằng cách sử dụng jQuery. Tôi phải thừa nhận rằng vụ hack khá kỳ lạ. Đây là cách nó hoạt động trong ví dụ của tôi: code<div id = "img_content"> <img id = 'aj_loader' src = 'asset / 2631.gif' style = "display: none;" /> </div> Và sau đó: code$ ("# img_content"). html ($ ("# img_content"). html ());
misaizdaleka

35

câu hỏi cũ, nhưng đăng câu này cho những người bạn google:

Spin.js CÓ HOẠT ĐỘNG cho trường hợp sử dụng này: http://fgnass.github.com/spin.js/


Chỉnh sửa, nó hoạt động nhưng ngừng hoạt ảnh ngay trước khi tải trang. Vì vậy, nếu đó là một tải ngắn, có vẻ như hoạt ảnh bị đóng băng giống như trong vấn đề gốc.
James McMahon

Giải pháp tuyệt vời, hoạt động tốt trong ie11 vì vậy dường như tất cả vẫn được cập nhật và hỗ trợ.
Adam Knights

spin.js không may là khá nhiều CPU. Xem các vấn đề / 8 , các vấn đề / 200 , các vấn đề / 215
user247702

Spin.js không hoạt động với tôi trên iPhone. Nó cũng đóng băng ngay khi một trang được chuyển hướng đến một trang khác.
Ankur-m,

18

IE giả định rằng việc nhấp vào một liên kết báo trước một điều hướng mới, nơi nội dung trang hiện tại sẽ được thay thế. Là một phần của quá trình sửa đổi nó, nó tạm dừng mã tạo hoạt ảnh GIF. Tôi nghi ngờ bạn có thể làm gì về điều này (trừ khi bạn không thực sự điều hướng trong trường hợp đó, hãy sử dụng return false trong sự kiện onclick).


+1 - Tôi đã thử cả hai câu trả lời hàng đầu. Không hoạt động. Tôi sẽ không biến tất cả các lần gửi Biểu mẫu của mình thành các yêu cầu ajax.
P.Brian.Mackey

2
+1 Tôi đồng ý, đây là câu trả lời đúng thực sự duy nhất, ngoại trừ các giải pháp thay thế spin.js và CodeMonkey.
Marco Demaio

7
Và vẫn còn trong IE10
ChadT

9
Và vẫn còn trong IE11!
bileyazan

2
2017 đăng ký!
Steve Wakeford

17

Đây là một jsFiddle hoạt động tốt trên biểu mẫu gửi với method = "post". Spinner được thêm vào sự kiện gửi biểu mẫu.

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

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

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

Xem mã jsFiddle tại đây

Kiểm tra nó trong trình duyệt IE của bạn tại đây


2
Vâng, điều này hoạt động tuyệt vời (chỉ được thử nghiệm trong IE 10 cho đến nay). Nhưng tôi không thể tìm ra lý do tại sao hoạt ảnh bị dừng khi tôi tải trước hình ảnh vào bộ nhớ. Tôi có thể tải trước trong fiddle của bạn và nó hoạt động tốt, chỉ là không có trong mã của tôi, argh.
Simon East

Bạn đã làm sai điều gì đó. :) Thêm hình ảnh quay vòng làm thẻ img vào trang của bạn? Tôi đã cập nhật url. Có thể giúp.
oldwizard

Có vẻ như IE chỉ là một kẻ ngu ngốc. Dừng hoạt ảnh khi được tải trước. Khi được tiêm qua jquery, hoạt ảnh sẽ tiếp tục chạy theo. Cảm ơn vì giải pháp này.
Anthony

8

Tôi đã xem bài đăng này và trong khi nó đã được trả lời, tôi cảm thấy tôi nên đăng một số thông tin giúp tôi giải quyết vấn đề này cụ thể cho IE 10 và có thể giúp những người khác đến bài đăng này với vấn đề tương tự.

Tôi đã bối rối vì sao ảnh gif động không hiển thị trong IE 10 và sau đó tìm thấy viên ngọc này.

ToolsInternet OptionsAdvancedMultiMediaPlay animations in webpages

hi vọng điêu nay co ich.


Không, điều đó không giải quyết được vấn đề trong IE11 (nhưng +1 để cố gắng trợ giúp)! :( Đó là - Tôi đã bật tùy chọn này và GIF động không sinh động, khi thể hiện trong beforeunloadhoặc unloadsự kiện.
trejder

1
Điều này không liên quan gì đến vấn đề được đặt ra trong câu hỏi.
user247702

2

Tôi gặp sự cố này khi cố gắng hiển thị gif đang tải trong khi gửi biểu mẫu đang được xử lý. Nó có thêm một lớp thú vị ở chỗ cùng một người gửi phải chạy trình xác thực để đảm bảo biểu mẫu là chính xác. Giống như những người khác (trên mọi bài đăng biểu mẫu IE / gif trên internet), tôi không thể làm cho trình quay tải để "quay" trong IE (và trong trường hợp của tôi, xác thực / gửi biểu mẫu). Trong khi xem xét lời khuyên trên http://www.west-wind.com, tôi đã tìm thấy một bài đăng của ev13wt cho rằng vấn đề là "... rằng IE không hiển thị hình ảnh dưới dạng hoạt ảnh vì nó không nhìn thấy khi được hiển thị. " Điều đó có ý nghĩa. Giải pháp của anh ấy:

Để trống nơi gif sẽ chuyển đến và sử dụng JavaScript để đặt nguồn trong hàm gửi đi - document.getElementById ('loadingGif'). Src = "đường dẫn đến tệp gif".

Đây là cách tôi triển khai nó:

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

Điều này hoạt động tốt cho tôi trên tất cả các trình duyệt!


Cài đặt src cũng hoạt động với tôi trong IE11. Trong trường hợp của tôi, nó được kết hợp với việc thêm lại html img trước. Tôi không chắc tại sao tôi cần cả hai. Điều thú vị cần lưu ý là tôi cũng đang đặt 'hiển thị' (để chặn), trái ngược với việc sửa đổi 'hiển thị'.
Cfold

2

Đây là những gì tôi đã làm. Tất cả những gì bạn phải làm là chia nhỏ GIF của mình thành 10 hình ảnh (trong trường hợp này là tôi bắt đầu 01.gifvà kết thúc bằng 10.gif) và chỉ định thư mục bạn lưu giữ chúng.

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);    
}

Phương pháp này hoạt động với IE7, IE8 và IE9 (đối với IE9 bạn có thể sử dụng spin.js). LƯU Ý: Tôi chưa kiểm tra điều này trong IE6 vì tôi không có máy nào chạy trình duyệt từ những năm 60, mặc dù phương pháp này rất đơn giản nhưng nó có thể hoạt động ngay cả trong IE6 trở xuống.


1
Cách giải quyết này hoạt động dựa trên cùng một nguyên tắc quay, về cơ bản, js sử dụng JS setTimeout để mô phỏng hoạt ảnh gif.
Marco Demaio

1

Liên quan đến điều này, tôi đã phải tìm một bản sửa lỗi trong đó các gif động được sử dụng làm hình nền để đảm bảo kiểu dáng được giữ cho biểu định kiểu. Một bản sửa lỗi tương tự cũng làm việc cho tôi ở đó ... tập lệnh của tôi giống như thế này (Tôi đang sử dụng jQuery để giúp dễ dàng hơn trong việc tạo kiểu nền được tính toán - cách thực hiện điều đó mà không có jQuery là một chủ đề cho một bài đăng khác):

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] Với thử nghiệm thêm một chút, tôi vừa nhận ra rằng điều này không hoạt động với ảnh nền trong IE8. Tôi đã thử mọi thứ có thể nghĩ ra để khiến IE8 hiển thị ảnh động gif khi tải trang, nhưng có vẻ như không khả thi vào lúc này.


Tại sao bạn đang đọc mã CSS bằng jQuery ( $(spinner).css('background-image')), nhưng thay vì đặt nó theo cách tương tự, bạn đang sử dụng cách Javascript thuần túy ( spinner.style.backgroundImage). Mã của bạn không hoạt động đối với tôi trong bất kỳ trình duyệt nào. Nếu tôi sử dụng trực tiếp mã của bạn, thì tôi đang gặp cannot set backgroundImage property of undefinedlỗi. Nếu tôi thay đổi mã của bạn để đặt CSS bằng jQuery, mã chạy mà không có bất kỳ lỗi nào, nhưng hình ảnh không được đặt lại và phần tử div / spinner vẫn trống. Tôi không biết, tại sao?
trejder

Đã xác minh ! Không có cơ hội, mã của bạn sẽ hoạt động. Không có trình duyệt nào không thể (kể từ tháng 12 năm 2014) để đặtbackground-imagethuộc tính trongunloadhoặcbeforeunloadcác sự kiện. Xem câu hỏi này hoặc jsFiddle này để biết chi tiết.
trejder

1

Dựa trên câu trả lời của @danfolkes, điều này phù hợp với tôi trong IE 8 và ASP.NET MVC3.

Trong _Layout.cshtml của chúng tôi

<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">

<<< nội dung tại đây >>> ...

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

Và trong các liên kết điều hướng của chúng tôi:

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

hoặc là

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

1

Tìm thấy giải pháp này tại http://timexwebdev.blogspot.com/2009/11/html-postback-freezes-animated-gifs.html và nó HOẠT ĐỘNG! Chỉ cần tải lại hình ảnh trước khi cài đặt thành hiển thị. Gọi hàm Javascript sau từ onclick của nút của bạn:

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

Tôi nhận ra rằng đây là một câu hỏi cũ và đến nay các áp phích ban đầu đều đã tìm ra giải pháp phù hợp với họ, nhưng tôi đã xem xét vấn đề này và nhận thấy rằng các thẻ VML không trở thành nạn nhân của lỗi IE này. GIF động vẫn di chuyển trong quá trình tải trang khi được đặt trên trình duyệt IE bằng thẻ VML.

Lưu ý rằng tôi đã phát hiện VML đầu tiên trước khi đưa ra quyết định sử dụng thẻ VML vì vậy thẻ này đang hoạt động trong FireFox và các trình duyệt khác sử dụng hành vi GIF động bình thường.

Đây là cách tôi giải quyết vấn đề này.

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

Đương nhiên, điều này dựa vào jQuery, jQueryUI và yêu cầu một số loại GIF động ("/images/loading_gray.gif").


0

Truy vấn:

$("#WhereYouWantTheImageToAppear").html('<img src="./Animated.gif" />');

0

Chỉ có một vấn đề tương tự. Những điều này đã làm việc hoàn hảo cho tôi.

$('#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');

Một ý tưởng khác là sử dụng jQuery's .load (); để tải và sau đó thêm trước hình ảnh.

Hoạt động trong IE 7+


0

Rất, rất muộn để trả lời câu hỏi này, nhưng tôi vừa phát hiện ra rằng việc sử dụng hình ảnh nền được mã hóa dưới dạng URI base64 trong CSS, thay vì được giữ dưới dạng hình ảnh riêng biệt, tiếp tục hoạt động trong IE8.


0

Một cách rất dễ dàng là sử dụng jQuery và plugin SimpleModal . Sau đó, khi tôi cần hiển thị gif "đang tải" khi gửi, tôi thực hiện:

$('*').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

Tôi đã gặp vấn đề tương tự, cũng thường xảy ra với các trình duyệt khác như Firefox. Cuối cùng, tôi phát hiện ra rằng việc tạo động một phần tử với gif động bên trong khi gửi biểu mẫu không tạo hoạt ảnh, vì vậy tôi đã phát triển quỹ công việc sau.

1) Tại document.ready(), mỗi MẪU được tìm thấy trong trang, nhận position:relativetài sản và sau đó đối với mỗi MẪU được đính kèm một vô hình DIV.bg-overlay.

2) Sau đó, giả sử rằng mỗi giá trị gửi của trang web của tôi được xác định bởi btn-primarylớp css, một lần nữa tại document.ready(), tôi tìm kiếm các nút này, chuyển đến MẪU mẹ của mỗi cái và tại biểu mẫu gửi, tôi kích showOverlayOnFormExecution(this,true);hoạt chức năng, chuyển nút được nhấp và một boolean chuyển đổi khả năng hiển thị 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 cho DIV.bg-overlaynhư sau:

.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) Ở bất kỳ lần gửi biểu mẫu nào, hàm sau được kích hoạt để hiển thị lớp phủ nền nửa trắng trên toàn bộ biểu mẫu (từ chối khả năng tương tác lại với biểu mẫu) và ảnh gif bên trong biểu mẫu (hiển thị trực quan hành động tải).

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

Hiển thị gif hoạt ảnh khi gửi biểu mẫu, thay vì thêm nó tại sự kiện này, giải quyết vấn đề "đóng băng hoạt ảnh gif" của các trình duyệt khác nhau (như đã nói, tôi tìm thấy vấn đề này trong IE và Firefox, không phải trong Chrome)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.