1. 程式人生 > >【Javascript學習筆記】【js執行緒實戰— —實現隨機速度的打字機效果】

【Javascript學習筆記】【js執行緒實戰— —實現隨機速度的打字機效果】

目錄

隨機速度的打字機效果

效果

這裡寫圖片描述

程式碼

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);

有的人就會問到定時器setTimeoutsetinterval 的區別:
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()只取隨機數整數部分

實戰程式碼Download

快捷連結