zoukankan      html  css  js  c++  java
  • 动画优化、客户端存储、历史记录、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跨域

  • 相关阅读:
    从零开始写STL—哈希表
    从零开始写STL-string类型
    从零开始写STL—模板元编程之any
    从零开始写STL—模板元编程之tuple
    c++ 实现 key-value缓存数据结构
    从零开始写STL
    从零开始写STL—functional
    从零开始写STL—set/map
    从零开始写STL-二叉搜索树
    洛谷 P4016 负载平衡问题
  • 原文地址:https://www.cnblogs.com/tianya-guoke/p/10393223.html
Copyright © 2011-2022 走看看