动画优化、客户端存储、历史记录、worker

一、requestAnimationFrame

1、requestAnimationFrame怎么用?

设置关键帧动画效果,注重关键帧执行的情况,用法与setTimeout一样

2、requestAnimationFrame与setTimeout的区别?  (执行时间,setTimeout是用户设置的时间 ,requestAnimationFrame看起来实现动画效果更流畅)

   <style>
       .demo{
          100px;
          height:100px;
          background:red;
          position:absolute;
          left:0;
       }
   </style>
</head>
    <div class ="demo"></div>
<body>
   <script>
      var demo = document.getElementsByClassName('demo')[0];
      function move () {
         demo.style.left = demo.offsetLeft + 150 + 'px';
         var timer = requestAnimationFrame(move);
         if(demo.offsetLeft > 800){
            cancelAnimationFrame(timer);
         }
      }
      move();
   </script>

requestAnimationFrame

1、页面刷新前执行一次

2、1000ms 60fps -> 16ms   (每16ms执行一次)

3、cancelAnimationFrame  (取消动画)

4、用法和 setTimeout类似  

5、兼容性  (不好)

requestAnimationFrame(f)

cancelAnimationFrame(id)

requestAnimationFrame兼容性

requestAnimationFrame (兼容性写法) (与setTimout写法相同,setTimout加上时间就与requestAnimationFrame一样,但没有requestAnimationFrame精准

         window.requestAnimFrame = (function () {
            return window.requestAnimationFrame ||
               window.webkitRequestAnimationFrame ||
               window.mozRequestAnimationFrame ||
               function (callback) {
                  window.setTimeout(callback, 1000 / 60);
               };
         })();

cancelAnimationFrame

      window.cancelAnimFrame = (function () {
         return window.cancelAnimationFrame ||
            window.webkitCancelAnimationFrame ||
            window.mozCancelAnimationFrame ||
            function (id) {
               window.clearTimeout(id);
            };
      })();

二、客户端存储

客户端存储方法

1.Storage: 不会传到服务器

2.Cookie:

(cookie数据会传到服务器,影响性能,且存储量小)

storage

1、localStroage   

2、sessionStroage

存储方式:

localStorage.name = 'aimee'

localStorage.info = JSON.stringify({name:'aimee,company: 'duyi’})  (localStroage隐式类型转换,转换成字符串,用JSON.stringify转换成json字符串)

读取方式:

localStrorage.name

JSON.parse(localStorage.info)    (转换成对象)

例如:

1、传数组

 

数组获取发现是字符串的形式(因为localStorage存储的值必须是字符串类型,如果不是,会调用toString方法转换)

2、传对象

解决此问题可将其转换为JSON字符串

再将JSON字符串的形式转换成对象

sessionStroage 与 localStorage 相同

二者区别:

1、存储有效期

localStorage->永久的,除非手动删除

sessionStorage->临时,窗口关闭就没有了

2、存储作用域

localStorage->文档源限制  (同域下)

sessionStorage->文档源限制+窗口 

api

1. setItem(name,val)   设置属性值     

 sessionStorage localStorage 相同

2. getItem(name)   获得属性值

3. removeItem(name)   移除属性

4. clear() 清除属性

 全部清空

2.cookie

存储信息到用户的设备上,数据量较小 4k

navigator.cookieEnabled

检测是否启用了cookie

cookie

1.设置cookie值:

document.cookie = “name=aimee”

(每次只能设置一个值,因为浏览器会认为后面的键值对是这个cookie的属性)

2.获得cookie值:

document.cookie

不建议出现分号,逗号,空格的奇怪的符号

encodeURIComponent()

decodeURIComponent()

Cookie封装函数

      function getCookie(name) {
         var name = name + "=";
         var ca = document.cookie.split(';');
         for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') c = c.substring(1);
            if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
         }
         return "";
      }

Cookie的存储周期

1.设置cookie存储期限

document.cookie = “name=scott;max-age=1000”;

单位 秒

2.expires 当前时间加上保存时间

var timestamp = (new Date()).getTime() + 10000;

var expires = new Date(timestamp).toGMTString();

document.cookie = “name=scott;expires=“+expires;

3.domain

4.path

cookie

1.删除cookie max-age=0

需要带上键值对

document.cookie = ‘name=scott;max-age=0’;

2.expires 设置为之前的时间

document.cookie = ‘name=scott;expires= …’;

Cookie和storage的区别

三、历史记录

History对象方法

1、history.back()

2、history.forward()

3、history.go(n)

HTML5中新增的方法

通过修改hash和hashchange事件来实现历史纪录管理

1、pushState

history.pushState(state, title, url); 添加一条历史记录

2、replaceState

history.replaceState(state, title, url); 替换当前的历史记录

参数:

state:一个与指定网址相关的状态对象,popstate事件触发时,该对象会传入回调函数中。如果不需要这个对象,此处可以填null。

title:新页面的标题,但是所有浏览器目前都忽略这个值,因此这里可以填null。

url:新的网址,必须与当前页面处在同一个域。浏览器的地址栏将显示这个网址。

History上新增的事件

1、popstate 事件     (单页面开发)

历史记录发生改变时触发

调用history.pushState()或者history.replaceState()不会触发popstate事件    

   <script>
       history.pushState({
          name:'abc',
          }, null, '#index');
       window.addEventListener('popstate',function(e){
          console.log(e);
       })
   </script>

 过滤

<body>
   <input type="text" id="searchWord">
   <input type="button" id="btn" value="提交">
   <div class="content"></div>
   <script>
      var data = [{
         name: '渡一'
      }, {
         name: '渡一教育'
      }, {
         name: 'html'
      }, {
         name: 'css'
      }, {
         name: 'js'
      }];
      var content = document.getElementsByClassName('content')[0];
      var inp = document.getElementById('searchWord');
      var btn = document.getElementById('btn');
      btn.onclick = function () {
         var showData = data.filter(function (item) {
            return item.name.indexOf(inp.value) > -1;
         });
         renderDom(showData);
         history.pushState({ value: inp.value }, null, '#' + inp.value);

      }
      var renderDom = function (data) {
         var str = '';
         for (var i = 0; i < data.length; i++) {
            str += '<div>' + data[i].name + '</div>';
         }
         content.innerHTML = str;
      }
      renderDom(data);
      window.addEventListener('popstate', function (e) {
         var value = e.state ? e.state.value : '';
         var showData = data.filter(function (item) {
            return item.name.indexOf(value) > -1;
         });
            inp.value = value;
            renderDom(showData);
         }, false)

   </script>

2、hashchange事件

当页面的hash值改变的时候触发,常用于构建单页面应用

 四、work

1、Worker是什么?

Worker是一种异步执行js的方式

Worker应用

var worker = new Worker('worker.js');

worker文件必须和主文件满足同源策略

worker和主线程之间的通信

1、postMessage(n)方法

2、message事件

结束worker

close() 在worker作用域中调用(worker.js)

terminate() 在worker对象上调用(主进程的worker对象上 worker.terminate)

其他特性

importScripts('./math1.js','./math2.js')

worker只是window的子集,只能实现部分功能,不能获取到window, document,所以这里不要引juery zepto。可以引入一些计算类的库。

postMessage跨域

原文地址:https://www.cnblogs.com/tianya-guoke/p/10393223.html