javascript - 在大多数移动浏览器上只有在出现重大延迟后图像才会更改

标签 javascript css image mobile delay

我想知道为什么通过图像 src 标签或 css background-image 更改现有元素的图像只能在大多数移动浏览器上延迟很长时间后才能完成。 (Android Chrome、iOS Chrome、iOS Safari,...)

我基本上有一个图像标签或一个 div,我想立即更改图像:

// preload images
for(var i = 1; i < 21; i++){
  var img = new Image();
  img.src = "covers/" + i + ".jpg";
}

var cover = $("#cover");
$("#flow").on("touchstart", function(){
  p++;
  cover.src = "covers/" + p + ".jpg";
  // cover.style['background-image'] = "url('covers/" + p + ".jpg')";
});

这两种方法都适用于桌面浏览器和原生 Android 浏览器。我创建了一个 example here (您需要触摸才能更改图像标签的 src - 您可以在 Chrome 浏览器中通过在 Web 检查器中选择 Emulate touch events 来执行此操作)。在 iOS 6 和 7、Safari 和 Chrome 中,更改不会立即发生,而是有明显的延迟。 Android Chrome 也是如此。

图像都是预加载的(Safari Web Inspector Remote Debugging 也这么说)。当通过带有 display: none; 的图像标签预加载图像时,行为不会改变。

你能想象这是为什么吗?

最佳答案

对此的解决方案是注意服务器 Cache-Control header 。

我测试了从 Dropbox 提供页面以在不同设备上查看。 Dropbox 目前不允许其服务的资源被浏览器缓存。这意味着,一个好的浏览器必须在应用之前与服务器核对更新版本(在 RFC 2616 Spec 中定义)。

因此,所有具有 JS 预加载、图像标签预加载、css background-image 或图像标签 src 的版本在浏览器不被强制检查后都能完美工作。这可以通过让服务器响应 Cache-Control: public 的缓存控制 header 来完成。

感谢任何其他方法!

关于javascript - 在大多数移动浏览器上只有在出现重大延迟后图像才会更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19200928/

相关文章:

javascript范围引用变量

javascript - 使用 ember-data 创建新记录并提交事务

html - DIV溢出问题

android - 来自 url 的 LinearLayout setBackgroundDrawable 位图

html - 如何在图像上放置文本 block ?

javascript - AngularJS 在列中使用 ng-repeat 填充表格

javascript - 如何从 JavaScript 模块模式中的私有(private)函数中调用公共(public)函数

javascript - 展开一个子菜单其他人应该自动隐藏在 jquery 中

css - 覆盖CSS类

php - 从android在php服务器上上传多个图像