jka*_*lik 4 html javascript css safari
我们的 Safari/Mac 用户报告页面片段上的图像闪烁,该页面片段由 AJAX 调用定期更新。我们无法在 Win 和 Linux 上的 Chrome/Firefox/IE 中重现该行为,甚至无法在 Mac 上重现 Chrome。
我们没有可用于开发的 Mac,所以我有时只能请朋友帮我检查一下。我准备了一个简化的测试用例:https : //jsfiddle.net/tgb1jaog/1/
我们使用刷新后的 div 内的 IMG 元素,但对于给定页面始终相同且位于相同位置,并且在 Safari 中查看时每次刷新时都会闪烁 - 在真实页面和 jsfiddle 上(第一个 div)。
我试图将它更改为由 DIV 上的 STYLE 设置的 CSS 背景代替原始 IMG,这似乎在 jsfiddle(第二个 div)上工作正常,但在我们的真实页面上以相同的方式闪烁。
我将尝试在外部 css 中定义背景并只给 div 一个类(jsfiddle 第三个 div),但由于测试用例行为不同,我不确定它会有所帮助。
所有这些都可以使用不同的浏览器很好地工作。
这是 Safari 中的某种错误(我找不到任何参考资料)?或者有什么方法可以让 Safari 像其他人一样工作?
function replace(id, data) {
$("#" + id).empty();
$("#" + id).append($.trim(data));
$("#" + id).hide();
$("#" + id).show()
}
function d1() {
replace("d1", '<img src="https://live.victoriatip.cz/images/baseball-header.jpg" width="797" height="69" />');
}
function d2() {
replace("d2", '<div style="background: url(https://live.victoriatip.cz/images/baseball-header.jpg); width: 797px; height: 69px;"></div>');
}
function d3() {
replace("d3", '<div class="b"></div>');
}
setInterval(d1, 2000);
setInterval(d2, 2500);
setInterval(d3, 3000);
Run Code Online (Sandbox Code Playgroud)
#d3 .b {
background: url("https://live.victoriatip.cz/images/baseball-header.jpg");
width: 797px;
height: 69px;
}
.clearfix:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div class="clearfix" id="d1"></div>
<div class="clearfix" id="d2"></div>
<div class="clearfix" id="d3"></div>
Run Code Online (Sandbox Code Playgroud)
事实证明,如果缓存已过期,Safari 将重新请求图像,即使它已经在内存中(与 Chrome、Firefox 等不同)。如果您在 jsfiddle 运行时查看 Safari 调试工具,您会看到服务器请求堆积如山(它们返回 304 但足以导致闪烁)。
您的 jsfiddle 示例中的此图像:https://live.victoriatip.cz/images/baseball-header.jpg
设置为立即过期 - Expires: Wed, 19 Aug 2015 14:26:53 GMT
。
如果您调整缓存标头,问题应该会消失。
这是一个更新的 jsfiddle,带有缓存的谷歌图像:https ://jsfiddle.net/tgb1jaog/2/ 。