Skip to content

HTML5 ​

localStorage、sessionStorage、cookie ​

          Cookie       LocalStorage   SessionStorage

容量      4kb             10MB          5MB
兼容      HTML4/HTML5     HTML5         HTML5
访问限制  任意窗口         任意窗口       同一个标签页
过期时间  可以手动设置      不会过期      标签页关闭就会过期(会话存储)
存储位置  浏览器、服务器    浏览器        浏览器
请求      会发送到服务器    不会          不会

Cookie,每次请求的时候都会被发送到服务器上。

Cookie可以理解为一个个的小文件,用来保存用户的偏好信息。
比如访问外文网站时的偏好,下次访问网站时,不需要重复选择信息。
可以记录访问时间及访问访点击连接等等。可以记录用户偏好。
cookie选择保存的内容是和开发者有关系的。读取cookie也是存在限制的。
cookie发展到后期,不再存储一些信息,因为容量有限,转为保存唯一的ID。数据保存在服务器上。
cookie充当浏览器的标识符。通过ID获取访问用户,数据在第三方存储。

广告宣传,根据cookie保存对应信息,虽然可能当前网站不认识客户端。
比如在腾讯网站看到某个广告,广告来源的网站会保存一个cookie,下次访问别的网站时,也会查找数据进行展示。
根据偏好推动不同的广告信息。

cookie的设置方法

  document.cookie 读取页面所包含的cookie的内容

  新增name  document.cookie = "name=Tom";            


LocalStorage、SessionStorage

  chrome浏览器的appliaction里可以查看localStorage和SessionStorage的内容。
  键值对的方式。

  localStorage.setItem('name', 'yueluo');
  localStorage.getItem('name');

  如果设置相同的键名,会覆盖原有同名的键值。
  sessionStroage设置和读取方式和LocalStorage保持一致。

  localStorage.removeItem('name'); // 删除数据
  localStorage.clear(); // 删除所有数据

  LocalStorage存在同源策略的问题。

cookie增删改查、用户追踪 ​

HTTP协议无状态的。 stateless。

会话(session)和cookie。

浏览器起到类似用户代理的作用,向服务器请求资源。

cookie只有大约4kb的存储空间。和会话相关的信息,一般是放在服务器上的。

例如访问淘宝网相关的网站,每个用户看到的内容是不一样。

跟踪用户,收集用户喜好,根据喜好去展示想看的内容。


跟踪用户常见的几种形式:

  1. HTTP headers 

    请求头中包含一些内容。例如referer,反应当前请求的页面是从哪一个页面来的。

  2. 客户端IP地址

    IP地址可能是动态的,不稳定。

  3. 用户登录

  4. 胖url

    用户浏览器网站的时候,部分网站会生成特定版本的url。包含特殊字段,作为每一个用户的唯一标识。

  5. cookie的解决方案

    服务器发送给用户浏览器并保存在本地的数据。

cookie如何创建的?

  服务器响应请求时,在响应头里会增加Set-Cookie一项,cookie就会保存在浏览器中。
  之后每一次做请求时,在请求头部,就会携带cookie信息。

cookie包含的字段

  name:cookie名称
  value:cookie值
  domain:执行哪些主机可以接收用户信息
  path:主机下哪些路径可以接收用户信息
  Expires/Max-Age:指定过期时间

document.cookie = 'name=jack; max-age=5000';

var date = new Date(), day = date.getDay();
date.setDate(day + 10);
document.cookie = 'name=xiaoming; expires=' + date;

也可以设置expires或者max-age作为过期时间。
如果没有设置过期时间,重新启动浏览器就会清除掉cookie信息。格林威治时间。

可以通过设置过期时间为过去的时间,进行删除cookie操作。

cookie操作函数封装

  var manageCookies = {
    set: function (key, value, expTime) {
      document.cookie = key + '=' + value + ';max-age=' + expTime;
      return this;
    },
    delete: function (key) {
      return this.set(key, '', -1);
    },
    get: function (key, callback) {
      var cookiesArr = document.cookie.split('; ');
      for (var i = 0; i < cookiesArr.length; i++) {
        var cookieItem = cookiesArr[i],
            cookieItemArr = cookieItem.split('=');

        if (cookieItemArr[0] === key) {
          callback(cookieItemArr[1]);
          return this;
        }
      }
      callback(undefined);
      return this;  
    }
  }

history、worker ​

history

  history是window上的一个属性,保存了用户在当前浏览器访问的一些历史记录。
  history下面有很多方法,这些方法可以帮我们模拟浏览器前进和后退的操作。

  单页面应用,可以使用history对象来实现。

  window.history.legnth // 会话条目(entry)数量
  
  这些条目保存在history的栈中,作为状态。

  history.back()  // 回退操作 =》 浏览器下点击后退按钮
  history.forward(); // 前进操作 =》 浏览器点击前进按钮
  history.go()  // 接收的参数是数字、-1 就会回退一次、1 代表前进一次

  history.replaceState('key', null, 'test') 
  第一个参数作为状态对象的名称,可以是JSON对象或者字符串 (可以使用history.state获取设置的名称) 
  第二个参数一般用来设置当前页面的名字,大部分浏览器不支持。
  最后一个参数的作用,就是改变路由的地址,页面不会立即重新加载url,不会检查url是否存在,是相对地址。
  不会改变整体条目的数量。

  history.pushState() 
  参数和replaceState保持一致。
  会改变整体条目的数量。

  popstate事件

    通过popstate事件的触发,改变页面UI效果。

    每一个history里的状态都叫做一个个的条目,当前活跃的条目,叫做active history entry。

    在每一次活动的历史条目发生改变的时候,就会有一个popstate的事件派发(dispatch)给window对象。
    新增和替换条目不会触发popstate事件,只有在点击回退按钮时,才会触发popstate事件。

  hashchange事件

    可以使用hashchange事件来做单页面应用

worker

    worker 工人

    为什么出现worker?

      JS是一个单线程的。single thread。

      ajax 非阻塞,不是一个多线程

    web worker

      让应用在后台产生分离的脚本,开启一个新的进程。

      页面和worker之间通信

      postMessage,页面和workder之间发送信息

      onmessage,接收信息

    worker 缺陷

      documeng、window、parent

      不能进行任何的DOM操作,可以发送ajax请求。

      可以使用settimeout和setinterval等方法。

    一个worker可以委派其他worker进行工作。
    可以使用importScripts方法加载其他的worker。

    可以通过terminate()方法终止worker方法。

获取当前位置、设备速度、设备方向 ​

geolocation 地理位置

  window.navigator下的属性.

  getCurrentPosition 获取当前位置

    window.navigator.geolocation.getCurrentPosition(success, failure);

    function success (e) {
      console.log('获取当前位置成功', e);
    }

    function failure (e) {
      console.log('获取位置失败', e);
    }

    使用谷歌的API服务,谷歌地图查找。

  watchPosition 监控位置

    window.navigator.geolocation.watchPosition

  第三个参数是配置项,比如可以添加超时处理。精确度处理。
  {
    timeout: 500,
  }
  maximunAge:监控用户的过期时间,默认一直监控
  enableHighAccuracy:


设置速度  devicemotion

  var accDiff = 10,
      lastTime = 0,
      lastAtc = {
        x: 0,
        y: 0,
        z: 0
      };
  window.addEventListener('devicemotion', function (e) {
    var curTime = new Date().getTime(),
        curAtc =  {
          x: e.acceleration.x,
          y: e.acceleration.y,
          z: e.acceleration.z
        };

    if (curTime - lastTime > 1000) {
      if (Math.abs(curAtc.x - lastAtc.x) > accDiff ||
          Math.abs(curAtc.y - lastAtc.y) > accDiff || 
          Math.abs(curAtc.z - lastAtc.z) > accDiff) {
        console.log('你刚才摇了一下');
      }
    }
  });

设备方向  deviceorientation

  判断设备方向,做类似指南针的应用。

  alpha、beta、gamma

  window.addEventListener('deviceorientation', function (e) {
    console.log(e.alpha); // 设备沿着z轴的方向  0-360
    console.log(e.beta); // 设备沿着x轴的方向 -180-180
    console.log(e.gamma); // 设备沿着z轴的方向 -90-90
  })

  alpha 0的话 指向正北的方向

  webkitCompassHeading判断设备位置指向正北 ios特有 

touchstart、touchmove、touchend ​

移动端事件处理

  iphone浏览器 移动端不发达 全部都是PC端网站

  存在300ms的检测,是否缩放屏幕,判断点击第二次。
  click移动端存在问题 300ms延迟问题 

  pc端的dbclick(双击)存在失效问题

  移动端新增事件

  touch事件 触摸事件

  touchEvent

    touchstart:手指按下的时候出发
    touchmove:屏幕上滑动触发
    touchend:手指抬起的时候触发
    touchcancel:比如滑动屏幕,突然接电话

  事件属性

    touches:左右在当前文档上的所有的触点
    changedTouches:和当前事件相关的所有触点
    targetTouches:作用在当前元素上的触点

    一般都是多点触控时用的属性