浏览器不同地解码图像

2021-06-23 03:37:09

在我的最后一篇文章中,我写了关于HTML5 Canvas元素,有时刚刚重新绘制DOM的表现比使用HTML5画布更具性能,至少对于该特定用例来说。在那个主题之后,我喜欢对浏览器解码图像的一些想法进行一些想法 - 以及如何以不同的方式进行不同的方式,如果您想为每个用户提供相同的用户体验,您可以为您带来有点棘手你的申请。

那么这是什么意思?好吧,让' s说你的网页上有一个IMG标签,但是通过javascript更新它的SRC属性,并且您经常这样做以触发Firefox中的此错误。如果将滚动事件挂钩以切换SRC属性,可以轻松触发它,以便在每个滚动中滚动图像源更新,这应该在Chrome上工作,但在Firefox上将开始闪烁。

为什么它开始闪烁?嗯,它与图像解码有关。它在Firefox上闪烁的原因是图像Hasn' t又在触发滚动事件时被解码,但您已经尝试显示它 - 因此闪烁。在那里有很方便的解决方案,即我还在错误报告中写道,但问题的主旨是htmlimageElement有一个称为解码的承诺,并且在解码结束之前,您不应该替换SRC属性可以这样做:

const imgurl =' yournewimage.png&#39 ;; //您的新ImageConst IMG = New Image(); //创建临时imageimg.src = imgurl; //在临时imageimg.decode()上添加新映像作为src。然后(()=> {//等到临时图像被解码的文档.QuerySelector(' img')。src = imgurl //现在替换你的实际元素});

你看,因为在Firefox中,一旦解码发生了,即使它发生在除了你正在更新之外的图像元素上,那么该图像的解码结果也被缓存,并用它解决了这个错误。

技术上是,MDN建议将图像添加到DOM中是否安全,但是在Chrome中发生了此代码的情况?好吧,把它放慢到爬行和你'最好不要使用它。现在我不认为Chrome从Firefox中以任何其他方式实施了这个功能,除了一些不知数的原因,这是一个较慢的速度,但我认为这两个浏览器以不同的方式解码图像。

虽然在Firefox中,当解码发生了解码时,我会看到一个眨眼形式的神器,我认为在Chrome' LL只是看不到更新的图像,直到该图像已解码,因此您可以看到' t看眨眼,一切都感觉更平滑,即使它可能只是一样。我试图找到有关差异的更多信息,但不成功,所以如果您确实知道某些内容请联系。目前,在不知道更多的情况下,我最好的推荐是在这种情况下只写一个针对Firefox和另一个Chrome的一个实现,如下所示:

const firefox = navigator.useragent.tolowerCase()。索引(' firefox')> -1; const imgurl =' yournewimage.png&#39 ;; const img = new image(); img.src = imgurl; if(firefox){img.decode()。然后(()=> { document.querySelector(' img')。src = imgurl;}} else {document.queryselector(' img')。src = imgurl;} 在Firefox中,我们等待解码承诺告诉我们,何时我们可以根据MDN规范安全地更新图像SRC属性。 否则,我们' ll只需更新SRC,无论等待解码都发生或不发生。 而这'我如何统一Firefox和Chrome的经验,具有这个特定的问题。 它&#39实际上是有趣的,因为最近我记得在过去的10年里,浏览器在过去的10年里出现了这么长的路,如果你在一个中写一些东西,它总是在其他人工作。 好吧,几乎总是。