移动端使用h5 h5本地存储安全吗将文件存在哪

查看: 2128|回复: 12
[连载]F12和pc浏览器前端测试工具与移动端H5页面测试工具(基础知识)
TA的每日心情擦汗 14:20签到天数: 16 天连续签到: 1 天[LV.4]测试营长
本帖最后由 qqqzhch 于
11:49 编辑
工具:浏览器F12(这是个键盘上的键), Firebug, Fiddler,YSlow,Browser Insight ,HttpWatch,WeinrePS:本帖主要介绍这些工具是怎么使用的,开始觉得F12这个快被我按坏的键盘按键已经不用介绍了,单细心一想,其实我用手表右键审查元素看404错误的情况因为是比较多的,
所以先介绍F12
主要围绕几类网页测试 如何使用这些工具
<font color="# 那种新浪首页类 没有什么交互和ajax请求的
<font color="# 那种微博首页类 有大量交互和ajax请求的
<font color="# 那种页面上N多个按钮需要点击的
<font color="# 微信业务,微信朋友圈分享的页面的测试
<font color="# 安卓和ios 应用调用浏览器打开网页的这种页面的测试
先发个帖子占个坑,妹子们,我来了
平时时间比较紧,每天晚上1帖O(∩_∩)O~
TA的每日心情擦汗 14:20签到天数: 16 天连续签到: 1 天[LV.4]测试营长
本帖子中包含更多资源
才可以下载或查看,没有帐号?
TA的每日心情擦汗 14:20签到天数: 16 天连续签到: 1 天[LV.4]测试营长
这个F12 不同的浏览器 名称不太一样,功能也各有特色,但是用于开发和测试的基本功能点都是一样ie浏览器:ie6 没有这个工具,ie7和8很薄弱,ie9以后开始具备基本的网络,看脚本错误,看html文档结构了& && && &
火狐浏览器:36版本以前的浏览器用Firebug插件(页面测试鼻祖),37后火狐有了自己的调试工具,但是我觉得不好使用
谷歌浏览器:谷歌浏览器诞生的年代较晚,一开始就有强大的F12工具,现在还可以模拟手机端的网络类型,页面尺寸,触摸等好用的功能
苹果浏览器:最近一次下载苹果5还是苹果8,默认不开启开发人员工具,但是细心找找,还是可以开启的,和谷歌的差不多
移动端原生浏览器:没有这个功能,但是可以连接PC 上的浏览器,用pc的开发者工具也可以通过Weinre
移动端的webview(微信):没有这个功能,用Browser Insight的js代码收集最基础的js错误和ajax信息
对于逼格搞的公司喜欢搞多设备,多浏览器兼容性测试,Browser Insight收集错误信息和ajax信息还是可以的
--------------------------------------------------------------------------------------------------------------------------------------
就目前而言 谷歌浏览器是最好的移动端和pc端 ,移动端还可以模拟触摸点击和和改变浏览器尺寸等
TA的每日心情擦汗 14:20签到天数: 16 天连续签到: 1 天[LV.4]测试营长
F12 的主要功能和常用功能
cookie等本地资源
console控制台
常用的 也就 console控制台看看有没有报错,网络卡看接口有没有报错有没有404找不到
TA的每日心情慵懒 08:49签到天数: 138 天连续签到: 2 天[LV.7]测试师长
该用户从未签到
TA的每日心情擦汗 14:20签到天数: 16 天连续签到: 1 天[LV.4]测试营长
本帖最后由 qqqzhch 于
09:08 编辑
Fiddler&&web测试神器&&双屏幕工作的 一个屏幕web页面 一个屏幕Fiddler&&效率杠杠的
本帖子中包含更多资源
才可以下载或查看,没有帐号?
TA的每日心情擦汗 14:20签到天数: 16 天连续签到: 1 天[LV.4]测试营长
Fiddler 最常用的功能就是放在另外一个显示器上,可以看到在页面上点击 等操作引起的ajax等请求和参数以及header 信息
有人说 这些火狐和谷歌不都能干嘛? 问题是Fiddler看着尺寸更大 更方面
有些应用会在页面卸载时候,Fiddler 服务器发送请求,这个请求是否成功,发的参数是否正确用火狐和谷歌都是看不到的,
毕竟他们是开发工具,和Fiddler相比还是弱了
就是测试loading
网速慢了才回loading Fiddler有个控制网速的功能测试loading的神器
<font color="# 是http的状态吗
<font color="# 是请求的地址
<font color="# 是发送的参数
<font color="# 是返回时候的head信息
TA的每日心情擦汗 14:20签到天数: 16 天连续签到: 1 天[LV.4]测试营长
YSlow 当你发现一个网页打开很慢的时候 你就需要用YSlow 来分析 为什么这个网页打开慢,
slow 这个工具相信无论是搞前端的攻城师或者是搞网站的站长都了解,Yslow 可比谷歌的PageSpeed 有名多了;那个百分制下的评分数据总让国人着迷,看来应试教育造的孽太深了。Jeff 认为的话,Yslow 比较专业,但是因为是英文的,所以在个人分析结果上对某些人比较吃力,建议先使用PageSpeed Insights熟悉熟悉。
YSlow (解析为 why slow)是雅虎基于网站优化规则推出的工具,帮助你分析并优化网站性能。雅虎网站优化规则在十几个方面给你的网站提出优化建议,包括尽可能的减少 HTTP 的请求数 、使用 Gzip 压缩、将 CSS 样式放在页面的上方、将脚本移动到底部、减少 DNS 查询等十几条规则,YSlow 会根据这些规则分析你的网站,并给出评级
TA的每日心情开心 08:26签到天数: 113 天连续签到: 1 天[LV.6]测试旅长
这个可以看看,占座先。
TA的每日心情擦汗 14:20签到天数: 16 天连续签到: 1 天[LV.4]测试营长
这些呢是属于心梗测试的范围,不过yslow 插件已经坏掉了
我这里还有个能用的,是找人修过的
YSlow是Yahoo发布的一款基于FireFox的插件。安装YSlow必须首先先安装 Firebug,然后下载YSlow,再对其安装。YSlow可以对网站的页面进行分析,并告诉你为了提高网站性能,如何基于某些规则而进行优化。YSlow可以分析任何网站,并为每一个规则产生一个整体报告,如果页面可以进行优化,则YSlow会列出具体的修改意见。以下是23条可以提高网站性能的建议:
1. 减少HTTP请求次数
合并图片、CSS、JS,改进首次访问用户等待时间。
2. 使用CDN
就近缓存==&智能路由==&负载均衡==&WSA全站动态加速
3. 避免空的src和href
当link标签的href属性为空、script标签的src属性为空的时候,浏览器渲染的时候会把当前页面的URL作为它们的属性值,从而把页面的内容加载进来作为它们的值。
4. 为文件头指定Expires
使内容具有缓存性。避免了接下来的页面访问中不必要的HTTP请求。
5. 使用gzip压缩内容
压缩任何一个文本类型的响应,包括XML和JSON,都是值得的。
6. 把CSS放到顶部&&
7. 把JS放到底部
防止js加载对之后资源造成阻塞。
8. 避免使用CSS表达式
9. 将CSS和JS放到外部文件中
目的是缓存,但有时候为了减少请求,也会直接写到页面里,需根据PV和IP的比例权衡。
10. 权衡DNS查找次数
减少主机名可以节省响应时间。但同时,需要注意,减少主机会减少页面中并行下载的数量。
IE浏览器在同一时刻只能从同一域名下载两个文件。当在一个页面显示多张图片时,IE 用户的图片下载速度就会受到影响。所以新浪会搞N个二级域名来放图片。
11. 精简CSS和JS
12. 避免跳转
同域:注意避免反斜杠 “/” 的跳转;
跨域:使用Alias或者mod_rewirte建立CNAME(保存域名与域名之间关系的DNS记录)
13. 删除重复的JS和CSS
重复调用脚本,除了增加额外的HTTP请求外,多次运算也会浪费时间。在IE和Firefox中不管脚本是否可缓存,它们都存在重复运算JavaScript的问题。
14. 配置ETags
它用来判断浏览器缓存里的元素是否和原来服务器上的一致。比last-modified date更具有弹性,例如某个文件在1秒内修改了10次,Etag可以综合Inode(文件的索引节点(inode)数),MTime(修改时间)和Size来精准的进行判断,避开UNIX记录MTime只能精确到秒的问题。 服务器集群使用,可取后两个参数。使用ETags减少Web应用带宽和负载。
15. 可缓存的AJAX
“异步”并不意味着“即时”:Ajax并不能保证用户不会在等待异步的JavaScript和XML响应上花费时间。&&
16. 使用GET来完成AJAX请求
当使用XMLHttpRequest时,浏览器中的POST方法是一个“两步走”的过程:首先发送文件头,然后才发送数据。因此使用GET获取数据时更加有意义。
17. 减少DOM元素数量
是否存在一个是更贴切的标签可以使用?人生不仅仅是DIV+CSS
18. 避免404
有些站点把404错误响应页面改为“你是不是要找***”,这虽然改进了用户体验但是同样也会浪费服务器资源(如数据库等)。最糟糕的情况是指向外部 JavaScript的链接出现问题并返回404代码。首先,这种加载会破坏并行加载;其次浏览器会把试图在返回的404响应内容中找到可能有用的部分当作JavaScript代码来执行。
19. 减少Cookie的大小&&
20. 使用无cookie的域
比如图片 CSS 等,Yahoo! 的静态文件都在
上,客户端请求静态文件的时候,减少了 Cookie 的反复传输对主域名 () 的影响。&&
21. 不要使用滤镜
png24的在IE6半透明那种东西,别乱使,淡定的切成PNG8+jpg
22. 不要在HTML中缩放图片
23. 缩小favicon.ico并缓存
本帖子中包含更多资源
才可以下载或查看,没有帐号?
TA的每日心情慵懒 16:21签到天数: 3 天连续签到: 1 天[LV.2]测试排长
TA的每日心情慵懒 09:54签到天数: 7 天连续签到: 1 天[LV.3]测试连长
站长推荐 /4
小伙伴们踊跃闯关,赢取测试积点,换取豪礼,还等什么,赶快行动吧~
了解自己的心里圈,学习不同的内容,让自己由内而外强大起来!
工作经验: 8年,从事过服务器、WP7、Win8及算法等方面工作
赏金公告:悬赏任务已,小伙伴们赶紧行动起来,赚取,去积点商城获取奖励吧!
Powered by您所在的位置: &
H5缓存机制浅析 移动端Web加载性能优化(2)
H5缓存机制浅析 移动端Web加载性能优化(2)
H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性。离线存储(也可称为缓存机制)是其中一个非常重要的特性。H5 引入的离线存储,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问。
2.4 Application Cache 机制
Application Cache(简称 AppCache)似乎是为支持 Web App
离线使用而开发的缓存机制。它的缓存机制类似于浏览器的缓存(Cache-Control 和
Last-Modified)机制,都是以文件为单位进行缓存,且文件有一定更新机制。但 AppCache 是对浏览器缓存机制的补充,不是替代。
先拿 W3C 官方的一个例子,说下 AppCache 机制的用法与功能。
WebView&myWebView&=&(WebView)&findViewById(R.id.webview);&WebSettings&webSettings&=&myWebView.getSettings();&webSettings.setDatabaseEnabled(true);&final&String&dbPath&=&getApplicationContext().getDir(&db&,&Context.MODE_PRIVATE).getPath();&webSettings.setDatabasePath(dbPath);&
上面 HTML 文档,引用外部一个 JS 文件和一个 GIF 图片文件,在其 HTML 头中通过 manifest 属性引用了一个 appcache 结尾的文件。
我们在 Google Chrome 浏览器中打开这个 HTML 链接,JS
功能正常,图片也显示正常。禁用网络,关闭浏览器重新打开这个链接,发现 JS
工作正常,图片也显示正常。当然也有可能是浏览缓存起的作用,我们可以在文件的浏览器缓存过期后,禁用网络再试,发现 HTML 页面也是正常的。
通过 Google Chrome 浏览器自带的工具,我们可以查看已经缓存的 AppCache(分 HOST)。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' src="/wyfs02/M01/77/EC/wKioL1ZxLaXyHCeKAACuC6iDj30982.gif" alt="" />
上面截图中的缓存,就是我们刚才打开 HTML 的页面 AppCache。从截图中看,HTML 页面及 HTML 引用的 JS、GIF 图像文件都被缓存了;另外 HTML 头中 manifest 属性引用的 appcache 文件也缓存了。
AppCache 的原理有两个关键点:manifest 属性和 manifest 文件。
HTML 在头中通过 manifest 属性引用 manifest 文件。manifest 文件,就是上面以 appcache 结尾的文件,是一个普通文件文件,列出了需要缓存的文件。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' src="/wyfs02/M01/77/ED/wKiom1ZxLZ2RcbTcAABGgqM7kcc314.gif" alt="" />
上面截图中的 manifest 文件,就 HTML 代码引用的 manifest
文件。文件比较简单,第一行是关键字,第二、三行就是要缓存的文件路径(相对路径)。这只是最简单的 manifest
文件,完整的还包括其他关键字与内容。引用 manifest 文件的 HTML 和 manifest
文件中列出的要缓存的文件最终都会被浏览器缓存。
完整的 manifest 文件,包括三个 Section,类型 Windows 中 ini 配置文件的 Section,不过不要中括号。
CACHE MANIFEST - Files listed under this header will be cached after they are downloaded for the first time
NETWORK - Files listed under this header require a connection to the server, and will never be cached
FALLBACK - Files listed under this header specifies fallback pages if a page is inaccessible
完整的 manifest 文件,如:
CACHE&MANIFEST&#&2012-02-21&v1.0.0&/theme.css&/logo.gif&/main.js&&NETWORK:&login.asp&&FALLBACK:&/html/&/offline.html&&
总的来说,浏览器在首次加载 HTML 文件时,会解析 manifest 属性,并读取 manifest 文件,获取 Section:CACHE MANIFEST 下要缓存的文件列表,再对文件缓存。
AppCache 的缓存文件,与浏览器的缓存文件分开存储的,还是一份?应该是分开的。因为 AppCache 在本地也有 5MB(分 HOST)的空间限制。
AppCache 在首次加载生成后,也有更新机制。被缓存的文件如果要更新,需要更新 manifest
文件。因为浏览器在下次加载时,除了会默认使用缓存外,还会在后台检查 manifest 文件有没有修改(byte by
byte)。发现有修改,就会重新获取 manifest 文件,对 Section:CACHE MANIFEST
下文件列表检查更新。manifest 文件与缓存文件的检查更新也遵守浏览器缓存机制。
如用用户手动清了 AppCache 缓存,下次加载时,浏览器会重新生成缓存,也可算是一种缓存的更新。另外, Web App 也可用代码实现缓存更新。
分析:AppCache 看起来是一种比较好的缓存方法,除了缓存静态资源文件外,也适合构建 Web 离线 App。在实际使用中有些需要注意的地方,有一些可以说是&坑&。
要更新缓存的文件,需要更新包含它的 manifest 文件,那怕只加一个空格。常用的方法,是修改 manifest 文件注释中的版本号。如:#
被缓存的文件,浏览器是先使用,再通过检查 manifest 文件是否有更新来更新缓存文件。这样缓存文件可能用的不是最新的版本。
在更新缓存过程中,如果有一个文件更新失败,则整个更新会失败。
manifest 和引用它的HTML要在相同 HOST。
manifest 文件中的文件列表,如果是相对路径,则是相对 manifest 文件的相对路径。
manifest 也有可能更新出错,导致缓存文件更新失败。
没有缓存的资源在已经缓存的 HTML 中不能加载,即使有网络。例如:http://appcache-demo.s3-website-us-east-/without-network/
manifest 文件本身不能被缓存,且 manifest 文件的更新使用的是浏览器缓存机制。所以 manifest 文件的 Cache-Control 缓存时间不能设置太长。
另外,根据官方文档,AppCache 已经不推荐使用了,标准也不会再支持。现在主流的浏览器都是还支持 AppCache的,以后就不太确定了。
在Android 内嵌 Webview中,需要通过 Webview 设置接口启用 AppCache,同时还要设置缓存文件的存储路径,另外还可以设置缓存的空间大小。
WebView&myWebView&=&(WebView)&findViewById(R.id.webview);&WebSettings&webSettings&=&myWebView.getSettings();&webSettings.setAppCacheEnabled(true);&final&String&cachePath&=&getApplicationContext().getDir(&cache&,&Context.MODE_PRIVATE).getPath();&webSettings.setAppCachePath(cachePath);&webSettings.setAppCacheMaxSize(5*1024*1024);
2.5 Indexed Database
IndexedDB 也是一种数据库的存储机制,但不同于已经不再支持的 Web SQL Database。IndexedDB
不是传统的关系数据库,可归为 NoSQL 数据库。IndexedDB 又类似于 Dom Storage 的 key-value
的存储方式,但功能更强大,且存储空间更大。
IndexedDB 存储数据是 key-value 的形式。Key 是必需,且要唯一;Key 可以自己定义,也可由系统自动生成。Value 也是必需的,但 Value 非常灵活,可以是任何类型的对象。一般 Value 都是通过 Key 来存取的。
IndexedDB 提供了一组 API,可以进行数据存、取以及遍历。这些 API 都是异步的,操作的结果都是在回调中返回。
下面代码演示了 IndexedDB 中 DB 的打开(创建)、存储对象(可理解成有关系数据的&表&)的创建及数据存取、遍历基本功能。
&script&type=&text/javascript&&&&var&&&window.indexedDB&=&window.indexedDB&||&window.mozIndexedDB&||&window.webkitIndexedDB&||&window.msIndexedDB;&&&if&(window.indexedDB)&{&&&&&&&&var&openRequest&=&window.indexedDB.open(&people_db&,&1);&&&&&&&&&openRequest.onupgradeneeded&=&function(e)&{&&&&&&&&console.log(&Upgrading...&);&&&&&&&&&var&thisDB&=&e.target.&&&&&&&&if(!thisDB.objectStoreNames.contains(&people&))&{&&&&&&&&&&&&console.log(&Create&Object&Store:&people.&);&&&&&&&&&&&&&&&&&&&&&&&&&thisDB.createObjectStore(&people&,&{&autoIncrement:true&});&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&}&&&openRequest.onsuccess&=&function(e)&{&&&&&console.log(&Success!&);&&&&&&&&&&&db&=&e.target.&&&&&&&&&&&document.querySelector(&#addButton&).addEventListener(&click&,&addPerson,&false);&&&&&&document.querySelector(&#getButton&).addEventListener(&click&,&getPerson,&false);&&&&&&document.querySelector(&#getAllButton&).addEventListener(&click&,&getPeople,&false);&&&&&&document.querySelector(&#getByName&).addEventListener(&click&,&getPeopleByNameIndex1,&false);&}&&&&&&&openRequest.onerror&=&function(e)&{&&&&&&&console.log(&Error&);&&&&&&&console.dir(e);&&&&}&&}else{&&&&&alert('Sorry!&Your&browser&doesn\'t&support&the&IndexedDB.');&}&&&function&addPerson(e)&{&&&&&var&name&=&document.querySelector(&#name&).&&&&&var&email&=&document.querySelector(&#email&).&&&&&&console.log(&About&to&add&&+name+&/&+email);&&&&&&var&transaction&=&db.transaction([&people&],&readwrite&);&var&store&=&transaction.objectStore(&people&);&&&&&&&&&var&person&=&{&&&&&&&&name:name,&&&&&&&&email:email,&&&&&&&&created:new&Date()&&&&}&&&&&&&&&var&request&=&store.add(person);&&&&&&&&&request.onerror&=&function(e)&{&&&&&&&&console.log(&Error&,e.target.error.name);&&&&&&&&&&&&}&&&&&request.onsuccess&=&function(e)&{&&&&&&&console.log(&Woot!&Did&it.&);&&&&}&}&&&function&getPerson(e)&{&&&&&var&key&=&document.querySelector(&#key&).&&&&&if(key&===&&&&||&isNaN(key))&return;&&&&&&var&transaction&=&db.transaction([&people&],&readonly&);&&&&&var&store&=&transaction.objectStore(&people&);&&&&&&var&request&=&store.get(Number(key));&&&&&&request.onsuccess&=&function(e)&{&&&&&&&&&var&result&=&e.target.&&&&&&&&&console.dir(result);&&&&&&&&&if(result)&{&&&&&&&&&&&&var&s&=&&&p&&h2&Key&&+key+&&/h2&&/p&&;&&&&&&&&&&&&for(var&field&in&result)&{&&&&&&&&&&&&&&&&s+=&field+&=&+result[field]+&&br/&&;&&&&&&&&&&&&}&&&&&&&&&&&&document.querySelector(&#status&).innerHTML&=&s;&&&&&&&&&&}&else&{&&&&&&&&&&&&&document.querySelector(&#status&).innerHTML&=&&&h2&No&match!&/h2&&;&&&&&&&&&&}&&&&&&}&}&&&function&getPeople(e)&{&&&&&&var&s&=&&&;&&&&&&&db.transaction([&people&],&&readonly&).objectStore(&people&).openCursor().onsuccess&=&function(e)&{&&&&&&&&&var&cursor&=&e.target.&&&&&&&&&if(cursor)&{&&&&&&&&&&&&&s&+=&&&p&&h2&Key&&+cursor.key+&&/h2&&/p&&;&&&&&&&&&&&&&for(var&field&in&cursor.value)&{&&&&&&&&&&&&&&&&&s+=&field+&=&+cursor.value[field]+&&br/&&;&&&&&&&&&&&&&}&&&&&&&&&&&&&s+=&&/p&&;&&&&&&&&&&&&&cursor.continue();&&&&&&&&&&}&&&&&&&&&&document.querySelector(&#status2&).innerHTML&=&s;&&&&&&}&}&&&function&getPeopleByNameIndex(e)&{&&&&&var&name&=&document.querySelector(&#name1&).&&&&&&var&transaction&=&db.transaction([&people&],&readonly&);&&&&&var&store&=&transaction.objectStore(&people&);&&&&&var&index&=&store.index(&name&);&&&&&&&&&&&var&request&=&index.get(name);&&&&&&request.onsuccess&=&function(e)&{&&&&&&&&var&result&=&e.target.&&&&&&&&if(result)&{&&&&&&&&&&&&var&s&=&&&p&&h2&Name&&+name+&&/h2&&p&&;&&&&&&&&&&&&for(var&field&in&result)&{&&&&&&&&&&&&&&&&s+=&field+&=&+result[field]+&&br/&&;&&&&&&&&&&&&}&&&&&&&&&&&&s+=&&/p&&;&&&&&}&else&{&&&&&&&&&document.querySelector(&#status3&).innerHTML&=&&&h2&No&match!&/h2&&;&&&&&&}&&&&}&}&&&function&getPeopleByNameIndex1(e)&{&&&&&var&s&=&&&;&&&&&&var&name&=&document.querySelector(&#name1&).&&&&&&var&transaction&=&db.transaction([&people&],&readonly&);&&&&&var&store&=&transaction.objectStore(&people&);&&&&&var&index&=&store.index(&name&);&&&&&&&&&&&index.openCursor().onsuccess&=&function(e)&{&&&&&&&&&var&cursor&=&e.target.&&&&&&&&&if(cursor)&{&&&&&&&&&&&&&s&+=&&&p&&h2&Key&&+cursor.key+&&/h2&&/p&&;&&&&&&&&&&&&&for(var&field&in&cursor.value)&{&&&&&&&&&&&&&&&&&s+=&field+&=&+cursor.value[field]+&&br/&&;&&&&&&&&&&&&&}&&&&&&&&&&&&&s+=&&/p&&;&&&&&&&&&&&&&cursor.continue();&&&&&&&&&&}&&&&&&&&&&document.querySelector(&#status3&).innerHTML&=&s;&&&&&&}&}&&&/script&&&&p&添加数据&br/&&&input&type=&text&&id=&name&&placeholder=&Name&&&br/&&&input&type=&email&&id=&email&&placeholder=&Email&&&br/&&&button&id=&addButton&&Add&Data&/button&&&/p&&&&p&根据Key查询数据&br/&&&input&type=&text&&id=&key&&placeholder=&Key&&&br/&&&button&id=&getButton&&Get&Data&/button&&&/p&&&div&id=&status&&name=&status&&&/div&&&&p&获取所有数据&br/&&&button&id=&getAllButton&&Get&EveryOne&/button&&&/p&&&div&id=&status2&&name=&status2&&&/div&&&&p&根据索引:Name查询数据&br/&&&&&&&input&type=&text&&id=&name1&&placeholder=&Name&&&br/&&&&&&&button&id=&getByName&&Get&ByName&/button&&&/p&&&div&id=&status3&&name=&status3&&&/div&
将上面的代码复制到 indexed_db.html 中,用 Google Chrome 浏览器打开,就可以添加、查询数据。在 Chrome 的开发者工具中,能查看创建的 DB 、存储对象(可理解成表)以及表中添加的数据。
498)this.width=498;' onmousewheel = 'javascript:return big(this)' width="610" height="260" src="/wyfs02/M02/77/EC/wKioL1ZxLajD68kWAAPlDs_7lkY906.png" alt="" />
IndexedDB 有个非常强大的功能,就是 index(索引)。它可对 Value 对象中任何属性生成索引,然后可以基于索引进行 Value 对象的快速查询。
要生成索引或支持索引查询数据,需求在首次生成存储对象时,调用接口生成属性的索引。可以同时对对象的多个不同属性创建索引。如下面代码就对name 和 email 两个属性都生成了索引。
var&objectStore&=&thisDB.createObjectStore(&people&,{&autoIncrement:true&});&&objectStore.createIndex(&name&,&name&,&{unique:false});&objectStore.createIndex(&email&,&email&,&{unique:true});
生成索引后,就可以基于索引进行数据的查询。
function&getPeopleByNameIndex(e)&{&var&name&=&document.querySelector(&#name1&).&&var&transaction&=&db.transaction([&people&],&readonly&);&var&store&=&transaction.objectStore(&people&);&var&index&=&store.index(&name&);&&&var&request&=&index.get(name);&request.onsuccess&=&function(e)&{&&&&&var&result&=&e.target.&&&&&if(result)&{&&&&&&&&&var&s&=&&&p&&h2&Name&&+name+&&/h2&&p&&;&&&&&&&&&for(var&field&in&result)&{&&&&&&&&&&&&&s+=&field+&=&+result[field]+&&br/&&;&&&&&&&&&}&&&&&&&&&s+=&&/p&&;&&&&&}&else&{&&&&&&&&&document.querySelector(&#status3&).innerHTML&=&&&h2&No&match!&/h2&&;&&&&&}&&&}&}
分析:IndexedDB 是一种灵活且功能强大的数据存储机制,它集合了 Dom Storage 和 Web SQL Database
的优点,用于存储大块或复杂结构的数据,提供更大的存储空间,使用起来也比较简单。可以作为 Web SQL Database
的替代。不太适合静态文件的缓存。
以key-value 的方式存取对象,可以是任何类型值或对象,包括二进制。
可以对对象任何属性生成索引,方便查询。
较大的存储空间,默认推荐250MB(分 HOST),比 Dom Storage 的5MB 要大的多。
通过数据库的事务(tranction)机制进行数据操作,保证数据一致性。
异步的 API 调用,避免造成等待而影响体验。
Android 在4.4开始加入对 IndexedDB 的支持,只需打开允许 JS 执行的开关就好了。
function&getPeopleByNameIndex(e)&{&var&name&=&document.querySelector(&#name1&).&&var&transaction&=&db.transaction([&people&],&readonly&);&var&store&=&transaction.objectStore(&people&);&var&index&=&store.index(&name&);&&&var&request&=&index.get(name);&request.onsuccess&=&function(e)&{&&&&&var&result&=&e.target.&&&&&if(result)&{&&&&&&&&&var&s&=&&&p&&h2&Name&&+name+&&/h2&&p&&;&&&&&&&&&for(var&field&in&result)&{&&&&&&&&&&&&&s+=&field+&=&+result[field]+&&br/&&;&&&&&&&&&}&&&&&&&&&s+=&&/p&&;&&&&&}&else&{&&&&&&&&&document.querySelector(&#status3&).innerHTML&=&&&h2&No&match!&/h2&&;&&&&&}&&&}&}&
内容导航&第 1 页: &第 2 页: &第 3 页:
关于&&&&的更多文章
《让移动设计更简单:Sketch 3操作指南与实战详解》以Sketch 的
慎用向右滑动操作、慎用横屏展示效果、按钮原理页面底部、使用SVG格式做矢量图…… 以上提到的技巧全都出自今天这篇好文,简单小巧但实操性很强,作为设计师,也要尽量避开这些坑。
讲师: 25人学习过讲师: 42人学习过讲师: 12人学习过
TCP(Transmission Control Protocol 传输控制协议)
《深入解析SAS:数据处理、分析优化与商业应用》是国
现在“运维自动化”、“云计算”、“DevOps”很热,也
本书详细介绍了AJAX在Web开发上的应用。主要内容包括:ASP.NET AJAX技术概述、实现异步局部更新页面、UpdatePanel编程功能、Page
51CTO旗下网站}

我要回帖

更多关于 手机端 h5本地存储 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信