【Javascript學習筆記】【js執行緒實戰— —實現隨機速度的打字機效果】
阿新 • • 發佈:2019-01-27
目錄
隨機速度的打字機效果
效果
程式碼
html部分
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>typeWriter</title>
<style type="text/css">
h2,h5,#tooltipMsg,p{
white-space: nowrap;
}
td{
border : 1px solid #ccc;
height: 50px;
text-align: center;
font-size: 10pt;
padding: 2px;
}
</style>
</head>
<body>
<h2>實現打字機效果</h2>
<p id="typeWriterEffect"></p>
<p id="typeWriterEffect2"></p >
<script type="text/javascript" src="typeWriter.js"></script>
</body>
</html>
js部分
window.onload=function(){
var twArr = [],//打字的資料庫佇列
twing = false,//用於判斷打字機的執行緒是否開啟
twID = [],//打字機執行緒ID
twTime = 10,//用於定時呼叫的時間
obj1 = document.getElementById("typeWriterEffect" ),
obj2 = document.getElementById("typeWriterEffect2"),
twEffect = function(e,str){//新增顯示的元素
twArr.push({
"context":e,//目標元素上下文
"str":str,//顯示的元素
"lening":0,//擷取的進度
"maxL":str.length//最大的進度
})
},
closeTw = function(){//關閉定時呼叫
clearTimeout(twID);//關閉執行緒
twing = true;
},
twUi = function(){//定時呼叫
var i = 0,
L = twArr.length,
eing = null;
for (var i = 0; i < L; i++) {
eing = twArr[i]//效果同時載入多物件陣列
eing.lening++;
if (eing.lening>eing.maxL) {//不設定關閉執行緒則打字效果迴圈
eing.lening = 0;
}
eing.context.innerHTML = eing.str.substring(0,eing.lening)+"_";
}
var num = Math.floor(Math.random()*50+1);//1-50個隨機數
console.log(num);
twID = setTimeout(twUi,num*twTime);//開啟執行緒
if(twID==eing.maxL){//到達最後關閉執行緒
closeTw();
}
},
//開啟定時呼叫,引數為設定定時呼叫的時間
startTw = function (twTime) {
if (!twing) {//如果沒有開啟才開啟
twTime = twTime;
twUi();//開始定時呼叫
}
};
//設定內容物件陣列
twEffect(obj1,"這就是打字機效果,打字速度隨機哦!!!!!");
//開始呼叫執行緒
startTw(twTime);
}
引用到的知識點
執行緒
js的單執行緒(single threaded)和非同步(asynchronous)的,但是並不互相矛盾,js的宿主環境(比如瀏覽器,Node)是多執行緒的,宿主環境通過某種方式使得js具備了非同步的屬性。
setTimeout(function(){
console.log(time is out);
},50);
有的人就會問到定時器setTimeout
和setinterval
的區別:
setTimeout(表延時時間)在執行時,是在載入後延遲指定時間後只去執行一次表示式,
而setInterval(表互動時間)則不一樣,它從載入後,每隔指定的時間就執行一次表示式
利用定時器觸發執行緒
(缺點:耦合度高)
function f1(callback){
setTimeout(function(){
// f1 的程式碼
callback();
},0);
}
f1(f2);
利用事件觸發執行緒
(缺點:可以通過繫結不同的事件,實現不同的回撥函式,如果應用這種方法過多,不利於閱讀程式)
$f1.on('custom',f2); //這裡繫結事件以jQuery寫法為例
function f1(){
setTimeout(function(){
// f1的程式碼
$f1.trigger('custom');
},0);
}
隨機數
Math.random()
取0-1隨機數
同理拓展例子:
Math.random()*10取0-10隨機數(包括一大堆小數點)
Math.random()*10+1取1-10隨機數
Math.random()*10+2取2-10隨機數
Math.random()*899+100取100-999隨機數
其中常用:Math.floor()
只取隨機數整數部分