假装不动 發表於 2019-8-20 14:34:00

HTML5——新增的API

<p><span style="font-size: 18pt; color: rgba(255, 0, 0, 1)"><strong>本文的API有:可点击到达</strong></span></p>
<p><span style="font-size: 18pt">  <span style="font-size: 18px"><strong>requestAnimationFrame</strong></span></span></p>
<p><span style="font-size: 18px"><strong>  &nbsp; 客户端存储</strong></span></p>
<p><span style="font-size: 18px"><strong>  &nbsp; 历史记录</strong></span></p>
<p><span style="font-size: 18px"><strong>  &nbsp; worker</strong></span></p>
<p><span style="font-size: 18px"><strong>  &nbsp; file Reader<br></strong></span></p>
<p><span style="font-size: 18px"><strong>&nbsp;&nbsp;  websocoket</strong></span></p>
<p><span style="font-size: 18pt"><strong>一、<span style="color: rgba(0, 0, 0, 1)">requestAnimationFrame </span></strong><span style="color: rgba(0, 0, 0, 1); font-size: 18px">(请求动画关键帧)</span></span></p>
<p><strong>1.1&nbsp;&nbsp;requestAnimationFrame怎么使用?</strong></p>
<p><strong>铺垫:</strong></p>
<p>&nbsp; 先看一下,我们平时在JS中是怎么让一个元素产生动画效果的。</p>
<p>我们平时都是用定时器来设置多长时间后发生什么动画,或者位移</p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(128, 0, 0, 1)">
    .demo</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">{</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
      width</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> 100px</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
      height</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">100px</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
      background-color</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> red</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
      position</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">absolute</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
      left</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> 0</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span>
    <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">}</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="demo"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">var</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> dom </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> document.getElementsByClassName(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">demo</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">)[</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">0</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">];
    items </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> setInterval(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">function</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">(e){
      dom.style.left </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> dom.offsetLeft </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">50</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">px</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;
      </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">if</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">(dom.offsetLeft </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">==</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">500</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">){
            clearInterval(items);
      }
    },1</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">0</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817150709069-301427093.gif" alt=""></p>
<p>我们可以看到,用JS定时器就可以实现动画效果</p>
<p>但是,JS定时器会有一个缺点</p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817150929083-529017505.png" alt=""></p>
<p>浏览器的重绘是每1s&nbsp; ——》 60次,所以大约为16ms重绘一次&nbsp;</p>
<p>&nbsp;如果我们像上面执行的一样,每隔10ms就增加 left50px 。页面就会造成关键帧丢失</p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817151536080-1056467434.png" alt=""></p>
<p><strong>requestAnimationFrame:(优化后)</strong></p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(128, 0, 0, 1)">
      .demo </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">{</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
            width</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> 100px</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
            height</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> 100px</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
            background-color</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> red</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
            position</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> absolute</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
            left</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> 0</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span>
      <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">}</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="demo"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">var</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> dom </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> document.getElementsByClassName(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">demo</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">)[</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">0</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">];
      </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">function</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> move() {
            dom.style.left </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> dom.offsetLeft </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">50</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">px</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;
            </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">var</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> items </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> requestAnimationFrame(move);
            </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">if</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">(dom.offsetLeft </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">==</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">500</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">){
                cancelAnimationFrame(items);
            }
      }
      move();
    </span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817153919586-125248776.gif" alt=""></p>
<p><strong>1.2&nbsp;&nbsp;<strong>requestAnimationFrame与setTImeout的区别?</strong></strong></p>
<p>setTimeout 是以 n 毫秒后执行回调函数,回调函数中可以递归 调用 setTimeout 来实现动画。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">      .demo {
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
            left: 0;
      }
    </span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="demo"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">var</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> dom </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> document.getElementsByClassName(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">demo</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">)[</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">0</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">];
      </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">function</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> move() {
            </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">var</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> items </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> setTimeout(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">function</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> () {
                dom.style.left </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> dom.offsetLeft </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">50</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">px</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;
                </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">if</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> (dom.offsetLeft </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">==</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">500</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">) {
                  clearTimeout(items);
                } </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">else</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {
                  move();
                }
            }, </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">10</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">)
      }
      move();
    </span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817165752544-1359424338.png" alt=""></p>
<p>使用 requestAnimationFrame 执行动画,最大优势是能保证回调函数在屏幕每一次刷 新间隔中只被执行一次,这样就不会引起丢帧,动画也就不会卡顿。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">      .demo {
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
            left: 0;
      }
    </span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">="demo"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">var</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> dom </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> document.getElementsByClassName(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">demo</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">)[</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">0</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">];
      </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">function</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> move() {
            </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">var</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> items </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> requestAnimationFrame(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">function</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> () {
                dom.style.left </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> dom.offsetLeft </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">50</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">+</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">px</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;
                </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">if</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> (dom.offsetLeft </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">==</span> <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">500</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">) {
                  cancelAnimationFrame(items);
                } </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">else</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {
                  move();
                }
            })
      }
      move();
    </span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817170103648-1314492461.png" alt=""></p>
<p><strong><strong>1.3&nbsp;&nbsp;<strong>requestAnimationFrame的优势</strong></strong></strong></p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817171707788-801381162.png" alt=""></p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><strong>二、客户端存储</strong></span></p>
<p><strong><span style="color: rgba(0, 0, 0, 1)">2.1&nbsp; Storage: 不会传到服务器</span></strong></p>
<p>2.1.1 Storage 如何使用&nbsp; 掌握方法</p>
<p>&nbsp; &nbsp;&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817172616623-536310401.png" alt=""></p>
<p>存储对象:</p>
<p>&nbsp; &nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817173820632-1638509156.png" alt=""></p>
<p>&nbsp; &nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817173923432-2091054596.png" alt=""></p>
<p>取出对象:</p>
<p>&nbsp;&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817174057587-969315542.png" alt=""></p>
<p>储存数组:</p>
<p>&nbsp; &nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817174246537-1844870152.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817174310842-2001101886.png" alt=""></p>
<p>&nbsp;</p>
<p>取出数组:</p>
<p>&nbsp; &nbsp;&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817174432062-1121251424.png" alt=""></p>
<p>API&nbsp; &nbsp;&nbsp;localstorage sessionStorage&nbsp; 共同适用&nbsp;&nbsp;</p>
<p>&nbsp; &nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817175025232-2139983688.png" alt=""></p>
<p>设置,获得</p>
<p>&nbsp; &nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817175118772-723494457.png" alt=""></p>
<p>移除属性(指定个别属性)</p>
<p>&nbsp; &nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817180139217-1746508399.png" alt=""></p>
<p>清除所有已设置的属性</p>
<p>&nbsp; &nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817180251174-931656747.png" alt=""></p>
<p>2.1.2&nbsp; localstorage sessionStorage cookie区别</p>
<p>&nbsp;localstorage:</p>
<p>  存储信息到用户的设备上,一般为5MB</p>
<p>  永久存储,除非手动清除</p>
<p>  会存储到同域下</p>
<p>sessionStorage:&nbsp;&nbsp;</p>
<p>  存储信息到用户的设备上,一般为5MB</p>
<p>  临时存储,页面关闭就会清除</p>
<p>  不会存储到同域下</p>
<p>cookie:</p>
<p>  存储信息到用户的设备上,数据量较小&nbsp; 4k</p>
<p>  navigator.cookieEnabled&nbsp; 检查是否启用了cookie</p>
<p>&nbsp; &nbsp;&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817180738129-1719636647.png" alt="">&nbsp;</p>
<p><span style="font-size: 18pt"><strong>三、历史记录</strong></span></p>
<p>&nbsp;BOM中的<span style="color: rgba(255, 0, 0, 1)">&nbsp;<span style="font-size: 18px">History对象方法</span></span></p>
<p><span style="font-size: 16px">现在已知我有三个标签页(从红色小方块开始)</span></p>
<p><span style="font-size: 18px"><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817235344800-1089257726.gif" alt=""></span></p>
<p>3.1history.length&nbsp; &nbsp;长度</p>
<p>通过调用这个方法就可以知道,当前历史记录里面有几条数据(几个网页)</p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818000044376-473806186.png" alt=""></p>
<p>3.1history.back()&nbsp; &nbsp;回退</p>
<p>&nbsp;当前位置在第三页(淘宝页面),回退一页就会跳转到第二页(百度页面)</p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818000619695-799591245.gif" alt=""></p>
<p>3.2 history.forward()&nbsp; &nbsp;前进</p>
<p>&nbsp;当前在红色小方块当前页,前进一页就会跳转至第二页(百度页面)</p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818000950669-114782783.gif" alt=""></p>
<p>3.3 history.go(n)&nbsp; &nbsp; &nbsp;跳转至指定页</p>
<p>当前在红色小方块页面即为第0页,go(2)就会跳转至第三页(淘宝页面)</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818001234168-559801875.gif" alt=""></p>
<p>当前在淘宝页面即为第三页,go(-2)就会跳转至第一页(红色方块页面)</p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818001517457-533681861.gif" alt=""></p>
<p><span style="font-size: 18px; color: rgba(255, 0, 0, 1)">HTML5中新增的方法&nbsp; &nbsp;</span><span style="font-size: 18px"><span style="font-size: 16px">此方法受同源策略限制,需要在服务器下操作</span></span></p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818003159470-622486887.png" alt=""></p>
<p>&nbsp;</p>
<p>1、pushState&nbsp; &nbsp;添加一条历史记录</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818005336834-1655924611.gif" alt=""></p>
<p>&nbsp;2、replaceState&nbsp; &nbsp;替换当前的历史记录</p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818005844305-1900649333.gif" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818012453539-1079418580.png" alt=""></p>
<p><span style="font-size: 16px">1.&nbsp; popstate 监听页面历史记录一旦发生改变时触发</span></p>
<div class="cnblogs_code">
<pre>      history.pushState(<span style="color: rgba(0, 0, 255, 1)">null</span>, <span style="color: rgba(0, 0, 255, 1)">null</span>, '#a');
<span style="color: rgba(0, 0, 0, 1)">      window.addEventListener(</span>'popstate', <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){<span style="color: rgba(51, 153, 102, 1)">//监听 popstate事件 有没有发生改变</span>
            console.log(</span>"历史记录发生改变,我触发了"<span style="color: rgba(0, 0, 0, 1)">);
      }, </span><span style="color: rgba(0, 0, 255, 1)">false</span>)</pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818013619754-584754301.gif" alt=""></p>
<p><span style="color: rgba(255, 0, 0, 1); font-size: 18px">&nbsp;应用场景</span></p>
<p>多应用于搜索,后台管理系统,或者父子页面之间的切换(开发一个页面就够了)</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818030933941-1172544556.gif" alt=""></p>
<div class="cnblogs_code">
<pre>&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;

&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;meta http-equiv="X-UA-Compatible" content="ie=edge"&gt;
    &lt;title&gt;Document&lt;/title&gt;
    &lt;style&gt;

    &lt;/style&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;input type="text" id="inp"&gt;
    &lt;button id="btn"&gt;搜索&lt;/button&gt;
    &lt;ul id="wrapper"&gt;&lt;/ul&gt;
    &lt;script&gt;
      <span style="color: rgba(0, 0, 255, 1)">var</span> wrapper = document.getElementById('wrapper'<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> inp = document.getElementById('inp'<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> btn = document.getElementById('btn'<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> data =<span style="color: rgba(0, 0, 0, 1)"> [{
            name: </span>'科比'<span style="color: rgba(0, 0, 0, 1)">
      }, {
            name: </span>'杜兰特'<span style="color: rgba(0, 0, 0, 1)">
      }, {
            name: </span>'库里'<span style="color: rgba(0, 0, 0, 1)">
      }, {
            name: </span>'哈登'<span style="color: rgba(0, 0, 0, 1)">
      }, {
            name: </span>'詹姆斯'<span style="color: rgba(0, 0, 0, 1)">
      }, {
            name: </span>'字母哥'<span style="color: rgba(0, 0, 0, 1)">
      }, {
            name: </span>'杜兰特'<span style="color: rgba(0, 0, 0, 1)">
      }, {
            name: </span>'科比'<span style="color: rgba(0, 0, 0, 1)">
      }, {
            name: </span>'科比'<span style="color: rgba(0, 0, 0, 1)">
      }];
      </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> radeDom(data) {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> str = " "<span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> i = 0; i &lt; data.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
                str </span>+= "&lt;li&gt;" + data.name + "&lt;/li&gt;"<span style="color: rgba(0, 0, 0, 1)">;
            }
            wrapper.innerHTML </span>=<span style="color: rgba(0, 0, 0, 1)"> str;
      }
      radeDom(data);

      btn.onclick </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> key =<span style="color: rgba(0, 0, 0, 1)"> inp.value;
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> dataList = data.filter(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (item, index) {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> item.name.indexOf(key) &gt; -1<span style="color: rgba(0, 0, 0, 1)">;
            })
            radeDom(dataList);
            history.pushState({   </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">点击后添加历史记录,key为当前的key</span>
<span style="color: rgba(0, 0, 0, 1)">                key: key
            }, </span><span style="color: rgba(0, 0, 255, 1)">null</span>, '#a'<span style="color: rgba(0, 0, 0, 1)">);
      }
      
      window.addEventListener(</span>'popstate', <span style="color: rgba(0, 0, 255, 1)">function</span> (e) {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">当历史记录事件改变时</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> key = e.state ? e.state.key : '';         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断当前页的key是否等于当前页的key</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> dataList = data.filter(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> (item, index) {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> item.name.indexOf(key) &gt; -1<span style="color: rgba(0, 0, 0, 1)">;
            });
            inp.value </span>= key;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">让输入框的value等于当前页的key</span>
<span style="color: rgba(0, 0, 0, 1)">            radeDom(dataList);
      }, </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">)
    </span>&lt;/script&gt;
&lt;/body&gt;<br>
&lt;/html&gt;</pre>
</div>
<p>&nbsp;2.&nbsp; hashchange&nbsp;</p>
<p>用于监听hash值的改变触发事件,就是链接 # 这个东西的改变而触发</p>
<p>跟popstate的用法大同小异,都差不多。用途也都是一样的。所以大家可以自己试试</p>
<p><span style="font-size: 18pt"><strong>四、worker&nbsp; (受同源策略限制,需要在服务器下运行)</strong></span></p>
<p><strong>4.1 了解worker&nbsp;</strong></p>
<p>worker字面意思是工人、雇佣员工的意思。</p>
<p>&nbsp;worker是一种异步执行JS的方式。</p>
<p><strong>4.2 worker应用</strong></p>
<div class="cnblogs_code">
<pre>   <span style="color: rgba(0, 0, 255, 1)">var</span> worker = <span style="color: rgba(0, 0, 255, 1)">new</span> worker('worker.js'<span style="color: rgba(0, 0, 0, 1)">);   
   </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> worker文件必须和主文件满足同源策略    </span></pre>
</div>
<p>&nbsp;就是在执行代码前雇佣一名工人(一个JS文件),把数据交给他让他异步执行,执行完了给主人返回回来。</p>
<p>主人可以在执行完代码后,调用解雇工人的方法,就不能继续传数据,</p>
<p>工人可以在执行完代码后,调用辞职方法,就不能继续传数据。</p>
<p>&nbsp;</p>
<p><strong>传输数据</strong></p>
<div><strong>postMessage 、onmessage</strong></div>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818142605809-176660362.png" alt=""></p>
<p><strong>返回数据</strong></p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818142902375-164047268.png" alt=""></p>
<p><strong>4.3 结束worlker</strong></p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818143101803-729580703.png" alt=""></p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818143557413-2065524568.png" alt=""></p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818145655780-1363508855.png" alt=""></p>
<p>&nbsp;</p>
<p><strong>4.4woker的缺点</strong></p>
<p><span style="font-size: 15px">(1)同源限制</span></p>
<p><span style="font-size: 15px">分配给 Worker 线程运行的脚本文件,必须与主线程的脚本文件同源。</span></p>
<p><span style="font-size: 15px">(2)DOM 限制</span></p>
<p><span style="font-size: 15px">Worker 线程所在的全局对象,与主线程不一样,无法读取主线程所在网页的 DOM 对象,也无法使用<code>document</code>、<code>window</code>、<code>parent</code>这些对象。但是,Worker 线程可以<code>navigator</code>对象和<code>location</code>对象。</span></p>
<p><span style="font-size: 15px">(3)通信联系</span></p>
<p><span style="font-size: 15px">Worker 线程和主线程不在同一个上下文环境,它们不能直接通信,必须通过消息完成。</span></p>
<p><span style="font-size: 15px">(4)脚本限制</span></p>
<p><span style="font-size: 15px">Worker 线程不能执行<code>alert()</code>方法和<code>confirm()</code>方法,但可以使用 XMLHttpRequest 对象发出 AJAX 请求。</span></p>
<p><span style="font-size: 15px">(5)文件限制</span></p>
<p><span style="font-size: 15px">Worker 线程无法读取本地文件,即不能打开本机的文件系统(<code>file://</code>),它所加载的脚本,必须来自网络。</span></p>
<p><strong>&nbsp;4.5 其他特性</strong></p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818150122507-824905241.png" alt=""></p>
<p><strong>4.6主要应用场景</strong></p>
<p>&nbsp;Ajax轮询可以使用,每隔一段时间获取一下数据(用一个定时期每隔一段时间,向后端发送一次请求)</p>
<p><span style="font-size: 18pt"><strong>五、fileReader(上传文件,读取中的详细信息)</strong></span></p>
<p><strong>&nbsp;5.1 fileReader的使用方法&nbsp;</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> reader = <span style="color: rgba(0, 0, 255, 1)">new</span> FileReader();</pre>
</div>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190819180643156-425558412.png" alt=""></p>
<p><span style="font-size: 16px">&nbsp; 按照不同项目的需求使用不同的方法,在这里我们就用这里面的readAsDataURL( )这个方法</span></p>
<p>&nbsp; 我们先来看怎么读取文件,我们需要先把文件发送至服务器,等他给我返回文件的URL地址,然后我拿着URL地址来渲染我的页面</p>
<p>&nbsp;&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820091331529-295113174.png" alt=""></p>
<p><span style="font-size: 16px">既然我们可以接收到返回的地址,那我们就可以把图片渲染到页面了</span></p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190819180718939-2058892849.png" alt=""></p>
<div class="cnblogs_code">
<pre>    &lt;style&gt;<span style="color: rgba(0, 0, 0, 1)">
    .img{
      height: 300px;
    }
    </span>&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;input type="file"&gt;
    &lt;img src="" alt="" class="img"&gt;
    &lt;script&gt;
    <span style="color: rgba(0, 0, 255, 1)">var</span> reader = <span style="color: rgba(0, 0, 255, 1)">new</span> FileReader();   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建FileReader(读文件对象)</span>
    <span style="color: rgba(0, 0, 255, 1)">var</span> inp = document.getElementsByTagName('input');
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> img = document.getElementsByClassName('img');
    inp.onchange </span>= <span style="color: rgba(0, 0, 255, 1)">function</span>(){       <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">onchange是当用户改变input输入框内容时执行一段JS代码时触发</span>
      console.log(inp.files);      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">flies 是你上传什么文件,他就会给你返回一个文件信息的伪数组</span>
      reader.readAsDataURL(inp.files);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">读取文件,伪数组中的第0项</span>
<span style="color: rgba(0, 0, 0, 1)">    }
    reader.onloadstart </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'读取开始时触发'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    reader.onprogress </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'读取中'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    reader.onloadend </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'读取完成'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    reader.onload </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'文件读取成功'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    reader.onabort </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'中断时触发'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    reader.onerror </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'出错时触发'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    </span>&lt;/script&gt;</pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820093919976-1213048267.png" alt=""></p>
<div class="cnblogs_code">
<pre>    &lt;style&gt;<span style="color: rgba(0, 0, 0, 1)">
    .img{
      height: 300px;
    }

    </span>&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;input type="file"&gt;
    &lt;img src="" alt="" class="img"&gt;
    &lt;script&gt;
    <span style="color: rgba(0, 0, 255, 1)">var</span> reader = <span style="color: rgba(0, 0, 255, 1)">new</span> FileReader();   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建FileReader(读文件对象)</span>
    <span style="color: rgba(0, 0, 255, 1)">var</span> inp = document.getElementsByTagName('input');
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> img = document.getElementsByClassName('img');
    inp.onchange </span>= <span style="color: rgba(0, 0, 255, 1)">function</span>(){       <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">onchange是当用户改变input输入框内容时执行一段JS代码时触发</span>
      console.log(inp.files);      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">flies 是你上传什么文件,他就会给你返回一个文件信息的伪数组</span>
      reader.readAsDataURL(inp.files);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">读取文件,伪数组中的第0项</span>
<span style="color: rgba(0, 0, 0, 1)">    }
    reader.onloadstart </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'读取开始时触发'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    reader.onprogress </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'读取中'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    reader.onloadend </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'读取完成'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    reader.onload </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'文件读取成功'<span style="color: rgba(0, 0, 0, 1)">, e);
      img.src </span>=<span style="color: rgba(0, 0, 0, 1)"> e.target.result;
    }
    reader.onabort </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'中断时触发'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    reader.onerror </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'出错时触发'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    </span>&lt;/script&gt;</pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820094652903-1928101237.png" alt=""></p>
<p><span style="font-size: 16px">&nbsp; 在文件读取中我们可以知道两个值&nbsp; loaded、total</span></p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820095917782-99247134.png" alt=""></p>
<p>已知这两个值,我们就可以实现加载进度条了</p>
<div class="cnblogs_code">
<pre>    &lt;style&gt;<span style="color: rgba(0, 0, 0, 1)">
    .img{
      height: 300px;
    }
    .wrapper{
      width: 300px;
      height: 30px;
      border: 1px solid black;
    }
    .wrapper .content{
      width: </span>0<span style="color: rgba(0, 0, 0, 1)">;
      height: 30px;
      background</span>-<span style="color: rgba(0, 0, 0, 1)">color:blue;
      overflow: hidden;
    }

    </span>&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;input type="file"&gt;
    &lt;img src="" alt="" class="img"&gt;
    &lt;div class="wrapper"&gt;
      &lt;div class="content"&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;span class="text"&gt;&lt;/span&gt;
    &lt;script&gt;
    <span style="color: rgba(0, 0, 255, 1)">var</span> reader = <span style="color: rgba(0, 0, 255, 1)">new</span> FileReader();   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建FileReader(读文件对象)</span>
    <span style="color: rgba(0, 0, 255, 1)">var</span> inp = document.getElementsByTagName('input');
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> img = document.getElementsByClassName('img');
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> con = document.getElementsByClassName('content');
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> text = document.querySelector('.text'<span style="color: rgba(0, 0, 0, 1)">);
    inp.onchange </span>= <span style="color: rgba(0, 0, 255, 1)">function</span>(){       <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">onchange是当用户改变input输入框内容时执行一段JS代码时触发</span>
      console.log(inp.files);      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">flies 是你上传什么文件,他就会给你返回一个文件信息的伪数组</span>
      reader.readAsDataURL(inp.files);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">读取文件,伪数组中的第0项</span>
<span style="color: rgba(0, 0, 0, 1)">    }
    reader.onloadstart </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'读取开始时触发'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    reader.onprogress </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log('读取中', e。loaded / e.total * 100%);</span>
      <span style="color: rgba(0, 0, 255, 1)">var</span> precent = e.loaded / e.total * 100;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">当前读取的值除以文件总大小,乘以100%。在读取中会不断触发</span>
      <span style="color: rgba(0, 0, 255, 1)">var</span> width = Math.round(300 * precent / 100); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进度条长度300乘以前面得到的值,除以100%,四舍五入取整</span>
      con.style.width = width + 'px'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">把值赋给宽度</span>
      text.innerHTML = Math.round(precent) + '%'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">把读取中的值取整把数字赋给文字进度条</span>
<span style="color: rgba(0, 0, 0, 1)">    }
    reader.onloadend </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'读取完成'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    reader.onload </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'文件读取成功'<span style="color: rgba(0, 0, 0, 1)">, e);
      img.src </span>=<span style="color: rgba(0, 0, 0, 1)"> e.target.result;
    }
    reader.onabort </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'中断时触发'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    reader.onerror </span>= <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(e){
      console.log(</span>'出错时触发'<span style="color: rgba(0, 0, 0, 1)">, e);
    }
    </span>&lt;/script&gt;</pre>
</div>
<p>&nbsp; &nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820102235340-1423101187.gif" alt=""></p>
<p>&nbsp;然后我们还可以添加终止读取,就是在文件上传的中途,停止上传</p>
<p>只需要添加一个按钮,和一个点击事件</p>
<div class="cnblogs_code">
<pre>      btn.onclick = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
            reader.abort();
            console.log(</span>'终止'<span style="color: rgba(0, 0, 0, 1)">);
      }</span></pre>
</div>
<p>&nbsp;</p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820111340640-1307922850.png" alt=""></p>
<p>&nbsp;</p>
<p><strong>5.2 fileReader 可实现的功能</strong></p>
<p>&nbsp;图片预览、异步向发送服务端发送请求</p>
<p><span style="font-size: 18pt"><strong>六、websocket(不受同源策略限制)</strong></span></p>
<p>&nbsp;websocket是一种网络协议,是在HTTP基础上做了一些优化的协议,与HTTP无直接关系。</p>
<p><strong>6.1&nbsp; 简单回忆HTTP协议</strong></p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820113844910-1703233581.png" alt=""></p>
<p><strong>&nbsp;6.2为什么有HTTP还需要websocket呢?</strong></p>
<p>因为HTTP协议有一个缺陷:通信只能由客户端发起</p>
<p>服务器端不能实时的发送最新数据给客户端,</p>
<p>我想要最新的数据怎么办呢? 只能用Ajax轮询(开启一个定时器,每隔一段时间调用请求一次数据)</p>
<p>然而websocket呢只需要发送一次请求,只要服务器有最新数据就会自动给你发送过来,不用再次请求</p>
<p>比如现在做的是一个天气状况的项目,每当天气有变化就会自动更新最新天气状况了</p>
<p><strong>&nbsp;6.3 websocket的特点</strong></p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820120807049-153097934.png" alt=""></p>
<p><strong>6.4 websocket事件&nbsp;</strong></p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820133357393-1966404409.png" alt=""></p>
<p><strong>6.5 创建websocket</strong></p>
<pre>ws://echo.websocket.org/    是用来测试的地址</pre>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">var</span> socket = <span style="color: rgba(0, 0, 255, 1)">new</span> WebSocket('ws://echo.websocket.org/');</pre>
</div>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820133700462-688738168.png" alt=""></p>
<p>调用e.data就可以打印出来数据了</p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820133938234-531643673.png" alt=""></p>
<p>我们再来看看close这个方法</p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820135258542-347268170.png" alt=""></p>
<p><strong>&nbsp;6.6 websocket属性</strong></p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820135808761-940422042.png" alt=""></p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820143257431-61818153.png" alt=""></p>
<p><strong>6.7 websocket的优点</strong></p>
<p>&nbsp;客户端与服务器都可以主动传送数据给对方;</p>
<p>不用频率创建TCP请求及销毁请求,减少网络带宽资源的占用,同时也节省服务器资源;</p>
<p>&nbsp;可以只请求一次,就会自动更新返回</p><br><br>
来源:https://www.cnblogs.com/yangpeixian/p/11367193.html
頁: [1]
查看完整版本: HTML5——新增的API