前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【译】怎样处理 Safari 移动端对图片资源的限制

【译】怎样处理 Safari 移动端对图片资源的限制

作者头像
对角另一面
发布于 2017-12-27 04:07:10
发布于 2017-12-27 04:07:10
1.6K00
代码可运行
举报
文章被收录于专栏:对角另一面对角另一面
运行总次数:0
代码可运行

原文作者:Thijs van der Vossen

本文翻译自《How to work around the Mobile Safari image resource limit》,原文写于2010年10月25日。可能部分限制已经不再适用。

翻译本文的目的是作为《读Zepto源码之assets模块》的附文,读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto

正文开始:

受限于 IpadIphone 的可用内存,Safari 浏览器的移动端会比桌面端有着更严格的资源使用限制

其中之一是每个 HTML 页面的图片数据总量。当移动端的 Safari 浏览器加载了 810MB 的图片数据后,就会停止加载其他图片,甚至浏览器还会崩溃。

大多数网站都不会受到这条限制的影响,因为保持页面合理的大小通常是一种很聪明的做法。

但是,在下面的场景中,你可能会遇到麻烦,如大型的图片画廊和幻灯片,或者是异步加载新数据的 web 应用,例如模拟不同版块切换时的原生动画(是的,你可以用移动端 Safari 模拟 Flipboard 的切换效果 )。

我们有充足的理由相信,只通过删除不再需要的图片元素,就可以不受这条限制的影响:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var img = document.getElementById('previous');
img.parentNode.removeChild(img);

但是然并卵,因为某些原因,将图片从 DOM (或者一个包含图片的元素)中删除时,图片的真实数据并没有释放。真是头大啊!

而将图片的 src 属性设置为其他的(更小的)图片链接,却起到了作用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var img = document.getElementById('previous');
img.src = 'images/empty.gif';

替换掉 src 属性后,旧的图片数据最终得到了释放。

我已经彻底测试过这种方法,下面几个方面是需要注意的:

  1. src 属性设置为其他图片后,图片数据不会立即释放,需要一段时间让垃圾回收器来真正地释放内存。这意味着,如果你太块地插入图片,依旧可能会陷入麻烦中。
  2. 在移动端 Safari 触发限制后,即便删除一部分或者全部已经加载的数据,Safari 也不会再加载额外的图片,这种情况即便在切换到其他页面时也继续存在。这意味着在测试这项技术时,你需要经常重启 Safari(这差点把我逼疯了)。
  3. 如果你想将图片元素从 DOM 中删除,你还必须确保在更改 src 前,元素不能为垃圾回收掉,否则,旧图片数据不会被释放。下面这个是最好的解决方案:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var img = document.getElementById('previous');
img.parentNode.removeChild(img);
img.src = 'data:image/gif;base64,' + 
      'R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';
window.timeout(function() {
img = null;
}, 60000);

你可以看到,我使用了 data URI 作为替换图片。

(如果你只是删除图片元素, iPad 在加载8张图片后会停止继续加载,如果用 Zeptoassets 插件,会持续加载。)

在上周我和 Thomas Fuchs 解释了这项技术后,他立即将它加入了 Zepto 中。这个周末,我贡献了一个测试函数,你可以自己用它来测试下。

译者:对角另一面

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
读Zepto源码之assets模块
本文介绍了Zepto assets模块的原理,通过阅读源码,分析其实现逻辑,并探讨了在移动设备上处理图片加载限制的问题。同时,作者还参考了相关文档,并分享了如何规避图片资源限制的方法。
对角另一面
2017/12/27
8200
移动端H5坑位指南
使用<a>能快速调用移动设备的电话/短信/邮件三大通讯功能,使用<input>能快速调用移动设备的的图库/文件。 这些功能方便了页面与系统的交互,关键在于调用格式一定要准确,否则会被移动端浏览器忽略。
饼干_
2022/08/23
3.6K0
中高级前端必须注意的40条移动端H5坑位指南 | 网易三年实践
不知不觉在网易已有三年半,占了一半时间都在与移动端打交道,整个阶段都是遇坑填坑的学习过程。移动端开发在前端里像神一样地存在,不是说它多难而是说它坑位实在太多了,怎样填都填不完。Android和iOS各显神通,Android的系统版本和屏幕分辨率多得难以一招兼容,iOS的顽固标准和未知特性多得难以快速掌握。
JowayYoung
2021/02/03
4.4K0
JavaWeb——JavaScript精讲之DOM、BOM对象与案例实战(动态添加删除表格)
上一博文种讲解了JavaScript基础的ECMAScript,包括基本语法和部分对象,本文中继续讲解JavaScript中比较重要的两部分内容BOM、DOM及事件,后文中有对应的实战练习。
Winter_world
2020/09/25
2.3K0
JavaWeb——JavaScript精讲之DOM、BOM对象与案例实战(动态添加删除表格)
Canvas之使用图片 原
canvas有比较强的图片操作能力。可以用于动态的图像合成或者作为图形的背景。浏览器支持任意格式如PNG、GIF、或者JPEG,你甚至可以将同一个页面中的其他canvas元素生成的图片作为图片源(toDataURL("image/png"),canvas.toDataURL('image/jpeg', quality))
tianyawhl
2019/04/04
1.1K0
Canvas之使用图片
                                                                            原
移动端minimvvm框架qvm实现
gitHub地址 1,移动端minimvvm框架qvm实现 qvm概念,一个适用于移动端的mini mvvm(什么是mvvm?没了解的同学自己去了解)框架。参考了angular和vuejs的设计实现思
IMWeb前端团队
2017/12/29
1.4K0
第85节:Java中的JavaScript
后代选择器: 选择器1 选择器2 子元素选择器:选择器1 > 选择器2 选择器分组: 选择器1,选择器2,选择器3{} 属性选择器:选择器[属性名称='属性值']
达达前端
2019/07/03
2.6K0
第85节:Java中的JavaScript
【前端探索】移动端H5生成截图海报的探索
移动端H5生成图片海报分享,是比较常见的交互方式。生成的海报中,往往会有用户的个性化信息,比如头像、昵称等等。
luciozhang
2023/04/22
7710
移动端上传图片
<!DOCTYPE html>   <html>   <head>   <title>pc和手机端的图片上传处理</title>   <meta charset="utf-8" />   <meta name="viewport" content="width=device-width" />   </head>   <body>   <p>选择:</p>   <p><input type="file" accept="image/*" id="upload" name="upload"></p>
windseek
2018/06/15
1.3K0
JAVA保姆式上手教程之免费JAVA 案例day02-js高级
bom: browser object model 浏览器对象模型 js希望和浏览器有一定的交互能力
张哥编程
2024/12/13
980
前端学习(47)~DOM简介和DOM操作
DOM:Document Object Model,文档对象模型。DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。目的其实就是为了能让js操作html元素而制定的一个规范。
Vincent-yuan
2020/03/19
1.9K0
第七节图片延迟加载
图片延迟加载/图片懒加载的作用:保证页面打开的速度(3s之后如果首页打不开被称为死亡页面) 原理: 1>对于首屏内容中的图片:首先给对应的区域一张默认图片占着位置(默认图需要非常的小,一般可以维持在5kb以内) 当首屏内容都加载完成后(或者也可以给一个延迟的时间),再开始加载真实的图片 2>对于其它屏中的图片:也是给一张默认的图片占位,当滚动条滚动到对应区域的时候,我们再开始加载真实的图片 网站性能优化的几种方式: 尽量减少向服务器请求的次数(减少http请求) css/js文件进行合并 icon图片也进
河湾欢儿
2018/09/06
8190
JavaScript——DOM基础
文档对象模型(Document Object Model),简称DOM,是W3C组织推荐的处理可扩展标记语言(HTML或者XML)的标准接口。
岳泽以
2022/10/26
6.6K0
JavaScript——DOM基础
文件上传那些事儿
导语 作为一枚初入鹅厂的鲜鹅,对这里的一切都充满着求知欲。看到我们的KM平台如此生机勃勃,各种技术分享交流如火如荼,在努力的汲取着养分的同时也期待自己能为这个生态圈做出贡献。正好新人导师让我看看能否把
谭伟华
2017/05/04
10.7K5
接上一篇事件详解
事件类型: DOM3级事件规定了以下几类事件;如下: UI事件: 当用户与页面上的元素交互时触发; load事件:当页面加载完后(包括所有图像,所有javascript文件,css文件等外部资源),就会触发window上面的load事件,如下代码是加载图片的: HTML代码:<img src = “event.png” id=”img”/> JS代码如下: var img = document.getElementById("img"); EventUtil.addHandler(img,'load',fu
前朝楚水
2018/04/02
1.9K0
JS魔法堂:再识IE的内存泄露
一、前言                               IE6~8除了不遵守W3C标准和各种诡异外,我想最让人诟病的应该是内存泄露的问题了。这阵子趁项目技术调研的机会好好的再认识一回,以下内容若有纰漏请大家指正,谢谢!   目录一大坨! 二、内存泄漏到底是哪里漏了? 2.1. JS Engine Object、DOM Element 和 BOM Element 2.2. JS Engine Object的内存回收机制 2.3. DOM Element的内存回收机制 2.4. 两种泄漏
^_^肥仔John
2018/01/18
3.5K0
JS魔法堂:再识IE的内存泄露
国庆节前端技术栈充实计划(5):JavaScript SDK设计指南
SDK是软件开发工具包 的缩写,是能够让编程者开发出应用程序的软件包。一般SDK包括一个或多个API、开发工具集和说明文档。
疯狂的技术宅
2019/03/27
2.1K0
国庆节前端技术栈充实计划(5):JavaScript SDK设计指南
原生JS调取PC端摄像头源码记录
今天简单的记录一个JS调取摄像头的源码,不是很难,只是为了以后可以直接拿来使用,好的废话不多说,看源码!
何处锦绣不灰堆
2020/05/28
1.9K0
JavaScript-Dom
JavaScript-Dom 简介 DOM:Document Object Model 节点 HTML 文档中的所有内容都是节点 整个文档是一个文档节点 每个 HTML 元素是元素节点 HTML 元素内的文本是文本节点 每个 HTML 属性是属性节点 注释是注释节点 document对象 常用属性 名称 说 明 referrer 返回载入当前文档的**URL** URL 返回当前文档的**URL** document.referrer document.URL ​ document常用方法 名称 说 明
xiaozhangStu
2023/05/04
4640
【建议】记录一次BAT一线互联网公司前端JavaScript面试
你需要一些HTML和css的基础知识,掌握JavaScript和ES6的基本语法,对事物的好奇心。
达达前端
2022/04/13
1.7K0
【建议】记录一次BAT一线互联网公司前端JavaScript面试
相关推荐
读Zepto源码之assets模块
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验