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> 客户端存储</strong></span></p>
<p><span style="font-size: 18px"><strong> 历史记录</strong></span></p>
<p><span style="font-size: 18px"><strong> worker</strong></span></p>
<p><span style="font-size: 18px"><strong> file Reader<br></strong></span></p>
<p><span style="font-size: 18px"><strong> 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 requestAnimationFrame怎么使用?</strong></p>
<p><strong>铺垫:</strong></p>
<p> 先看一下,我们平时在JS中是怎么让一个元素产生动画效果的。</p>
<p>我们平时都是用定时器来设置多长时间后发生什么动画,或者位移</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">></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)"></</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 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)"> 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)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></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 ——》 60次,所以大约为16ms重绘一次 </p>
<p> 如果我们像上面执行的一样,每隔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)"><</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">></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)"></</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 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)"> 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)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817153919586-125248776.gif" alt=""></p>
<p><strong>1.2 <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)"></</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 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)"> 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)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></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)"></</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</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)">></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 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)"> 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)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817170103648-1314492461.png" alt=""></p>
<p><strong><strong>1.3 <strong>requestAnimationFrame的优势</strong></strong></strong></p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817171707788-801381162.png" alt=""></p>
<p> </p>
<p><span style="font-size: 18pt"><strong>二、客户端存储</strong></span></p>
<p><strong><span style="color: rgba(0, 0, 0, 1)">2.1 Storage: 不会传到服务器</span></strong></p>
<p>2.1.1 Storage 如何使用 掌握方法</p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817172616623-536310401.png" alt=""></p>
<p>存储对象:</p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817173820632-1638509156.png" alt=""></p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817173923432-2091054596.png" alt=""></p>
<p>取出对象:</p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817174057587-969315542.png" alt=""></p>
<p>储存数组:</p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817174246537-1844870152.png" alt=""></p>
<p> </p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817174310842-2001101886.png" alt=""></p>
<p> </p>
<p>取出数组:</p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817174432062-1121251424.png" alt=""></p>
<p>API localstorage sessionStorage 共同适用 </p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817175025232-2139983688.png" alt=""></p>
<p>设置,获得</p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817175118772-723494457.png" alt=""></p>
<p>移除属性(指定个别属性)</p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817180139217-1746508399.png" alt=""></p>
<p>清除所有已设置的属性</p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817180251174-931656747.png" alt=""></p>
<p>2.1.2 localstorage sessionStorage cookie区别</p>
<p> localstorage:</p>
<p> 存储信息到用户的设备上,一般为5MB</p>
<p> 永久存储,除非手动清除</p>
<p> 会存储到同域下</p>
<p>sessionStorage: </p>
<p> 存储信息到用户的设备上,一般为5MB</p>
<p> 临时存储,页面关闭就会清除</p>
<p> 不会存储到同域下</p>
<p>cookie:</p>
<p> 存储信息到用户的设备上,数据量较小 4k</p>
<p> navigator.cookieEnabled 检查是否启用了cookie</p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190817180738129-1719636647.png" alt=""> </p>
<p><span style="font-size: 18pt"><strong>三、历史记录</strong></span></p>
<p> BOM中的<span style="color: rgba(255, 0, 0, 1)"> <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 长度</p>
<p>通过调用这个方法就可以知道,当前历史记录里面有几条数据(几个网页)</p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818000044376-473806186.png" alt=""></p>
<p>3.1history.back() 回退</p>
<p> 当前位置在第三页(淘宝页面),回退一页就会跳转到第二页(百度页面)</p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818000619695-799591245.gif" alt=""></p>
<p>3.2 history.forward() 前进</p>
<p> 当前在红色小方块当前页,前进一页就会跳转至第二页(百度页面)</p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818000950669-114782783.gif" alt=""></p>
<p>3.3 history.go(n) 跳转至指定页</p>
<p>当前在红色小方块页面即为第0页,go(2)就会跳转至第三页(淘宝页面)</p>
<p> <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中新增的方法 </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> </p>
<p>1、pushState 添加一条历史记录</p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818005336834-1655924611.gif" alt=""></p>
<p> 2、replaceState 替换当前的历史记录</p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818005844305-1900649333.gif" alt=""></p>
<p> </p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818012453539-1079418580.png" alt=""></p>
<p><span style="font-size: 16px">1. 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"> 应用场景</span></p>
<p>多应用于搜索,后台管理系统,或者父子页面之间的切换(开发一个页面就够了)</p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190818030933941-1172544556.gif" alt=""></p>
<div class="cnblogs_code">
<pre><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
</style>
</head>
<body>
<input type="text" id="inp">
<button id="btn">搜索</button>
<ul id="wrapper"></ul>
<script>
<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 < data.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
str </span>+= "<li>" + data.name + "</li>"<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) > -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) > -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></script>
</body><br>
</html></pre>
</div>
<p> 2. hashchange </p>
<p>用于监听hash值的改变触发事件,就是链接 # 这个东西的改变而触发</p>
<p>跟popstate的用法大同小异,都差不多。用途也都是一样的。所以大家可以自己试试</p>
<p><span style="font-size: 18pt"><strong>四、worker (受同源策略限制,需要在服务器下运行)</strong></span></p>
<p><strong>4.1 了解worker </strong></p>
<p>worker字面意思是工人、雇佣员工的意思。</p>
<p> 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> 就是在执行代码前雇佣一名工人(一个JS文件),把数据交给他让他异步执行,执行完了给主人返回回来。</p>
<p>主人可以在执行完代码后,调用解雇工人的方法,就不能继续传数据,</p>
<p>工人可以在执行完代码后,调用辞职方法,就不能继续传数据。</p>
<p> </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> <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> </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> 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> Ajax轮询可以使用,每隔一段时间获取一下数据(用一个定时期每隔一段时间,向后端发送一次请求)</p>
<p><span style="font-size: 18pt"><strong>五、fileReader(上传文件,读取中的详细信息)</strong></span></p>
<p><strong> 5.1 fileReader的使用方法 </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> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190819180643156-425558412.png" alt=""></p>
<p><span style="font-size: 16px"> 按照不同项目的需求使用不同的方法,在这里我们就用这里面的readAsDataURL( )这个方法</span></p>
<p> 我们先来看怎么读取文件,我们需要先把文件发送至服务器,等他给我返回文件的URL地址,然后我拿着URL地址来渲染我的页面</p>
<p> <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> <style><span style="color: rgba(0, 0, 0, 1)">
.img{
height: 300px;
}
</span></style>
</head>
<body>
<input type="file">
<img src="" alt="" class="img">
<script>
<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></script></pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820093919976-1213048267.png" alt=""></p>
<div class="cnblogs_code">
<pre> <style><span style="color: rgba(0, 0, 0, 1)">
.img{
height: 300px;
}
</span></style>
</head>
<body>
<input type="file">
<img src="" alt="" class="img">
<script>
<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></script></pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820094652903-1928101237.png" alt=""></p>
<p><span style="font-size: 16px"> 在文件读取中我们可以知道两个值 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> <style><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></style>
</head>
<body>
<input type="file">
<img src="" alt="" class="img">
<div class="wrapper">
<div class="content"></div>
</div>
<span class="text"></span>
<script>
<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></script></pre>
</div>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820102235340-1423101187.gif" alt=""></p>
<p> 然后我们还可以添加终止读取,就是在文件上传的中途,停止上传</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> </p>
<p><img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820111340640-1307922850.png" alt=""></p>
<p> </p>
<p><strong>5.2 fileReader 可实现的功能</strong></p>
<p> 图片预览、异步向发送服务端发送请求</p>
<p><span style="font-size: 18pt"><strong>六、websocket(不受同源策略限制)</strong></span></p>
<p> websocket是一种网络协议,是在HTTP基础上做了一些优化的协议,与HTTP无直接关系。</p>
<p><strong>6.1 简单回忆HTTP协议</strong></p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820113844910-1703233581.png" alt=""></p>
<p><strong> 6.2为什么有HTTP还需要websocket呢?</strong></p>
<p>因为HTTP协议有一个缺陷:通信只能由客户端发起</p>
<p>服务器端不能实时的发送最新数据给客户端,</p>
<p>我想要最新的数据怎么办呢? 只能用Ajax轮询(开启一个定时器,每隔一段时间调用请求一次数据)</p>
<p>然而websocket呢只需要发送一次请求,只要服务器有最新数据就会自动给你发送过来,不用再次请求</p>
<p>比如现在做的是一个天气状况的项目,每当天气有变化就会自动更新最新天气状况了</p>
<p><strong> 6.3 websocket的特点</strong></p>
<p> <img src="https://img2018.cnblogs.com/blog/1646536/201908/1646536-20190820120807049-153097934.png" alt=""></p>
<p><strong>6.4 websocket事件 </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> <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> 6.6 websocket属性</strong></p>
<p> <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> 客户端与服务器都可以主动传送数据给对方;</p>
<p>不用频率创建TCP请求及销毁请求,减少网络带宽资源的占用,同时也节省服务器资源;</p>
<p> 可以只请求一次,就会自动更新返回</p><br><br>
来源:https://www.cnblogs.com/yangpeixian/p/11367193.html
頁:
[1]