【问题标题】:Restart gif without reloading it in IE11重新启动 gif 而不在 IE11 中重新加载它
【发布时间】:2018-10-13 14:09:41
【问题描述】:

我正在尝试在用户单击它时重新启动 gif,而无需重新加载它(我的 gif 太重了,我实际上为我的应用程序预加载了它)。我当前的代码在 Chrome 和所有“现代浏览器”上都能完美运行,但我也需要它在 IE11 中运行,这就是斗争的开始。

这是一个示例代码,它在 Chrome 上完美运行,但在 IE11 上却不行:

function activate_gif(){
    document.getElementById("img1").src = "https://i.imgur.com/Rsc0qOw.gif";
}
.myDiv{
  width: 500px;
  height: 300px;
}

.myDiv img{
  width: 100%;
  height: 100%;
}
<button onclick="activate_gif()">
  Click me
</button>
<div class="myDiv">
  <img id="img1" src="https://i.imgur.com/Rsc0qOw.gif">
</div>

你也可以在这个 jsFiddle 上找到它:https://jsfiddle.net/c6hodyh2/3/

您可以找到该问题的另一个(不)工作示例(完美适用于 Chrome,不适用于 IE):https://codepen.io/InSightGraphics/pen/CAlci

到目前为止我已经尝试过什么

尝试 1

来自this SO question,我尝试了以下JS代码,以“强制”刷新缓存:

function activate_gif(){
    document.getElementById("img1").src = "";
    document.getElementById("img1").src = "https://i.imgur.com/Rsc0qOw.gif";
}

结果:没有成功,和我原来的代码完全没有区别。

尝试 2

来自this article,我尝试刷新innerHTML内容:

function activate_gif(){
    document.getElementById("img1").style.display = '';
    document.getElementById("img1").innerHTML = document.getElementById("img1").innerHTML;
}

结果: IE 没有变化,并且在其他浏览器中停止工作,所以我想它触发了控制台错误。

尝试 3

来自this SO question,我尝试使用简化版本的解决方案,基本上是通过在其源 URL 中添加随机后缀来强制重新加载图像:

function activate_gif(){
    document.getElementById('myImg').src = 'mysrc.gif?' + Math.random();
}

结果: 这会重新加载 gif,它自己解决了缓存问题。但是,我在实际应用中使用的 gif 太重了,所以如果每次用户按下按钮时都需要下载图像,会导致用户体验不佳,尤其是对于带宽较弱的用户而言。

尝试 4

根据@IStepashka 的回答,我尝试在设置原始来源之前先设置一个(在网络上随机找到的)空白图像:

function activate_gif(){
    document.getElementById("img1").src = "https://i.ytimg.com/vi/f3cLOucMpD0/maxresdefault.jpg";
    document.getElementById("img1").src = "https://i.imgur.com/Rsc0qOw.gif";
}

结果:尝试 1 相同,它没有改变任何东西。我的代码仍在 Chrome 上运行,但不在 IE 上。

【问题讨论】:

  • 哥们,我能感觉到你的痛苦。我每天晚上都梦想着一个没有 IE 的世界。

标签: javascript html internet-explorer gif


【解决方案1】:

尝试首先将任何空白图像设置为源并取回原始源图像。 像这样:

function activate_gif(){
    document.getElementById("img1").src = "images/blank.jpg"     
    document.getElementById("img1").src = "https://i.imgur.com/Rsc0qOw.gif";

}

【讨论】:

  • 您好,谢谢您的回答。不幸的是,我尝试了您的解决方案,但它并没有改变任何结果,它仍然无法在 IE 中工作......:/
  • 值得一试。在 ie edge 上,它像魅力一样对我有用
【解决方案2】:

似乎 IE 11 实际上不会重播(非循环)gif,如果它在缓存中,并且相同 src gif 的所有实例实际上都是同步的……这似乎是 IE 的另一个……呃,我们称它们为怪癖

这是一个(悲伤的)解决方法。它确实会重新加载 gif,但至少它会在后台预先重新加载它,以免对用户 xp 产生太大影响。我将您的 gif 更改为 2MO+ 以显示背景加载。

请注意,这只能在 IE 上使用,因为其他浏览器可以很好地使用简单的解决方案。

var oldNode = document.getElementById("img1"),
    src = oldNode.src + "?bust=",
    nextNode = oldNode.cloneNode(),
    parent = oldNode.parentNode;
nextNode.src = src + new Date().getTime();
function activate_gifIE(){
  oldNode.removeNode();
  parent.appendChild(nextNode);
  oldNode = nextNode;
  nextNode = oldNode.cloneNode();
  
  nextNode.src = src + new Date().getTime();
}
.myDiv{
  width: 500px;
  height: 300px;
}

.myDiv img{
  width: 100%;
  height: 100%;
}
<button onclick="activate_gifIE()">
  Click me
</button>
<div class="myDiv">
  <img id="img1" src="https://media.giphy.com/media/LRVnPYqM8DLag/giphy.gif" height="200px">
</div>

我见过诸如this onethat one 之类的解决方法,但它们涉及循环gif,并在它们前面覆盖静止帧,或者用它替换它们。同样在 IE 11 上,您必须让用户在 gif 中随机登陆,因为您似乎无法让它重播……

不管怎样,希望对你有帮助。

【讨论】:

    【解决方案3】:

    将 GIF 文件转换为视频并使用&lt;video&gt; HTML 标签可能更合适。请参阅 Jeremy Wagner 的 Replace Animated GIFs with Video 文章。但是如果你想坚持使用 GIF,你可以使用XMLHttpRequestBlob 和对象 URL,给定 CORS 和缓存相关的 HTTP 标头已适当配置:

    function activate_gif(){
        var url = "https://i.imgur.com/Rsc0qOw.gif";
        var img = document.getElementById( "img1" );
    
        var xhr = new XMLHttpRequest();
        // Browser will take cached response if it has cache entry with url key.
        xhr.open( "GET", url );
        xhr.responseType = "blob";
        xhr.onload = function() {
            if ( xhr.status != 200 ) {
                // Complain.
                return;
            }
            var blobUrl = URL.createObjectURL( xhr.response );
            img.src = blobUrl;
            setTimeout( function () {
                // Let browser display blob and revoke blob after stack unwind.
                URL.revokeObjectURL( blobUrl );
            }, 0 ); // You might need to increase delay time for large images.
        };
        xhr.send();
    }
    .myDiv{
      width: 500px;
      height: 300px;
    }
    
    .myDiv img{
      width: 100%;
      height: 100%;
    }
    <button onclick="activate_gif()">
      Click me
    </button>
    <div class="myDiv">
      <img id="img1" src="https://i.imgur.com/Rsc0qOw.gif">
    </div>

    您还可以使用浏览器检测在其他用户代理中使用更高效、更简单的代码。

    更多信息请查看:

    【讨论】:

    • 您好,感谢您的回答!结果看起来很神奇,我想这就是我想要的。如果我理解得很好,XMLHttpRequest 从缓存中获取图像(如果存在)(意味着没有额外的下载时间),然后创建一个新的 URL 对象,然后将其解释为新图像(意味着它会重新启动 gif)。我说的对吗?
    • 是的,如果缓存条目存在并且是新鲜的,则不会有网络请求。不过,从磁盘缓存加载也需要一些时间。尽管此代码 sn-p 在我的 Firefox 测试页面上有效,但由于某种原因,它在 Stack Overflow 代码 sn-p 中不起作用。但无论如何,我可能会在其他浏览器中使用更简单、更高效的代码。
    • 您的 sn-p 在 Chrome 和 IE 上都适用于我。是的,无论如何,我只使用 IE 和 Edge 实现了这个解决方案。它在我的应用程序上运行良好。非常感谢您的帮助!
    • 通过使用 HTML &lt;video&gt; 标记和相关链接的解决方案查看更新。
    猜你喜欢
    • 2013-11-18
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多