記錄9 交互式編程

到 目 前 為 止, 只 要 頁(yè) 面 一 加 載, 就 會(huì) 運(yùn) 行 頁(yè) 面 中 的JavaScript 代碼,只有包含了對(duì) alert 或 confirm 這樣的函數(shù)調(diào)用的時(shí)候,程序才會(huì)暫停。但是,我們并不是總希望頁(yè)面一加載就運(yùn)行所有的代碼,如果想要讓一些代碼延遲運(yùn)行或者用戶做了某些響應(yīng)動(dòng)作之后才運(yùn)行,該怎么辦呢?

用setTimeout函數(shù)延時(shí)代碼

這個(gè)函數(shù)接受兩個(gè)參數(shù):分別是一段時(shí)間之后要調(diào)用的函數(shù)以及所要等待的時(shí)間(毫秒)。
如下就是一個(gè)最簡(jiǎn)單的例子,頁(yè)面加載完成后3秒才彈出一個(gè)提示框

<body>
    <script type="text/javascript">
        var timeUp=function(){
            alert("Time's up!");
        };
        setTimeout(timeUp,3000);
    </script>
</body>

注意:
上面的例子仍然是頁(yè)面一加載就運(yùn)行所有的代碼。
調(diào) 用 setTimeout 的 返 回 值表示該方法當(dāng)前被調(diào)用的次數(shù),第一次調(diào)用返回值是1,第二次調(diào)用返回值是2,以此類推。
下面的效果是一加載頁(yè)面就執(zhí)行全部js代碼,先彈出提示框(顯示值為1),點(diǎn)擊“OK”后再?gòu)棾鎏崾究颍ㄖ禐?),第二個(gè)提示框點(diǎn)擊“OK”之后再過(guò)3秒之后彈出“Time's up!”,前面一個(gè)“Time's up!”點(diǎn)擊“OK”之后再過(guò)3秒彈出“Time's up!”。

首先,頁(yè)面所有代碼都是一加載完代碼就得到執(zhí)行,setTimeout方法也是里面得到執(zhí)行。(如果理解為3秒后才執(zhí)行該方法,那么就是3秒后執(zhí)行該方法然后接著等待3秒,總共得等6秒了);其次,我們只有點(diǎn)擊每個(gè)彈出框之后,后面的彈窗代碼才會(huì)開(kāi)始執(zhí)行(所以我們?cè)诘谝粋€(gè)彈窗不點(diǎn)擊“OK”,等待3秒后也不會(huì)出現(xiàn)"Time's up!"彈窗)

<body>
    <script type="text/javascript">
        var timeUp=function(){
            alert("Time's up!");
        };
        var result=setTimeout(timeUp,3000);
        var result2=setTimeout(timeUp,3000);
        var result3=setTimeout(timeUp,3000);
        alert(result);
        alert(result3)
    </script>
</body>

取消一個(gè)timeout

例如我們使用 setTimeout 函數(shù)創(chuàng)建了一個(gè)延遲函數(shù)調(diào)用之后,可能會(huì)發(fā)現(xiàn)實(shí)際上并不想要調(diào)用該函數(shù)。例如我們?cè)O(shè)置一個(gè)鬧鐘來(lái)提醒做作業(yè),但是作業(yè)已經(jīng)提前完成了,那就想要取消這個(gè)鬧鐘。要取消 timeout,在 setTimeout 返回的timeoutID 上調(diào)用 clearTimeout 函數(shù)。

如下效果就是在4秒后彈窗“Finish homework before alarm,eat dinner..."

<body>
    <script type="text/javascript">
        var homeworkAlarm = function(){
            alert("Begin to do homework now..");
        };
        var eatDinner = function(){
            alert("Finish homework before alarm,eat dinner...");
        };
        var timeoutId1 = setTimeout(homeworkAlarm,3000);
        var timeoutId2 = setTimeout(eatDinner,4000);
        clearTimeout(timeoutId1);
    </script>
</body>

使用setInterval多次調(diào)用代碼

setInterval 函數(shù)就像 setTimeout 函數(shù)一樣,只不過(guò)它是重復(fù)調(diào)用指定的函數(shù)。接受兩個(gè)參數(shù):分別是想要調(diào)用的函數(shù)和間隔的時(shí)間長(zhǎng)度。
像 setTimeout 返回 timeout ID 一樣,setInterval 會(huì)返回 interval ID,可以使用clearInterval 函數(shù)和這個(gè) interval ID 來(lái)告訴 JavaScript 停止執(zhí)行重復(fù)調(diào)用。

如下例子,標(biāo)題元素每 30 毫秒就會(huì)在屏幕上緩慢地移動(dòng) 1 個(gè)像素直到移動(dòng)了 200 個(gè)像素,然后回到起始點(diǎn),再次開(kāi)始移動(dòng),不斷重復(fù)該過(guò)程。
使用 offset 方法設(shè)置標(biāo)題距離屏幕左邊緣的距離。

<body>
    <h1 id="heading">Rails is going...</h1>
    <script type="text/javascript">
        var leftOffset = 0;
        var moveHeading = function(){
            $("#heading").offset({left: leftOffset});
            leftOffset++;
            if(leftOffset > 200){
                leftOffset = 0;
            }
        };
        setInterval(moveHeading,30);
    </script>
</body>

如果我們想要恢復(fù)原來(lái)位置之后就停止重復(fù)調(diào)用,可以使用如下代碼:

<body>
    <h1 id="heading">Rails is going...</h1>
    <script type="text/javascript">
        var leftOffset = 0;
        var moveHeading = function(){
            $("#heading").offset({left: leftOffset});
            leftOffset++;
            if(leftOffset > 200){
                leftOffset = 0;
                $("#heading").offset({left: leftOffset});
                clearInterval(id);
            }
        };
        var id=setInterval(moveHeading,30);
    </script>
</body>

對(duì)單擊做出響應(yīng)

當(dāng)調(diào)用這個(gè)函數(shù)時(shí),
click(clickHandler)的含義是“當(dāng)單擊 h1 元素時(shí),調(diào)用 clickHandler 函數(shù),并且將 event 對(duì)象傳遞給該函數(shù)”。在這個(gè)示例中,單擊處理程序從這個(gè)event 對(duì)象中獲取信息,并且在控制臺(tái)輸出單擊位置的 x 坐標(biāo)和 y 坐標(biāo)。

event 參數(shù)是包含單擊事件相關(guān)信息的一個(gè)對(duì)象,例如單擊的位置pageX,pageY和其他很多事件本身的信息。

<body>
    <h1>Learn</h1>
    <script type="text/javascript">
        var clickHandler=function(event){
            alert("Click!"+event.pageX+"---"+event.pageY)
        }
        var s=document.getElementsByTagName("h1");
        s[0].onclick=clickHandler;  //注意點(diǎn)擊事件關(guān)鍵字是onclick
    </script>
</body>
Paste_Image.png

上面的例子使用jQuery來(lái)寫(xiě)則是(注意點(diǎn)擊事件關(guān)鍵字是click):

<body>
    <h1>Learn</h1>
    <script type="text/javascript" src="jquery-3.1.1.js"></script>
    <script type="text/javascript">
        var clickHandler=function(event){
            alert("Click!"+event.pageX+"---"+event.pageY)
        }
        $("h1").click(clickHandler);
    </script>
</body>

鼠標(biāo)移動(dòng)事件

每次鼠標(biāo)移動(dòng)都會(huì)觸發(fā) mousemove 事件。
使用 $("html")選中這個(gè) html 元素,以便當(dāng)鼠標(biāo)在頁(yè)面上任何位置移動(dòng)時(shí)都會(huì)觸發(fā)這個(gè)處理程序。每次用戶移動(dòng)鼠標(biāo),都會(huì)調(diào)用傳遞到 mousemove 后面的括號(hào)中的函數(shù)。效果就是每次移動(dòng)鼠標(biāo),標(biāo)題將會(huì)移動(dòng)到該位置。

<body>
    <h1 id="heading">Rails is going...</h1>
    <script type="text/javascript">
        $("heading").mousemove(function (event){
            $("#heading").offset({
                left: event.pageX,
                top: event.pageY
            });
        });
    </script>
</body>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第1章 認(rèn)識(shí)JS JavaScript能做什么?1.增強(qiáng)頁(yè)面動(dòng)態(tài)效果(如:下拉菜單、圖片輪播、信息滾動(dòng)等)2.實(shí)現(xiàn)...
    mo默22閱讀 1,502評(píng)論 0 5
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,001評(píng)論 25 709
  • 一、JS前言 (1)認(rèn)識(shí)JS 也許你已經(jīng)了解HTML標(biāo)記(也稱為結(jié)構(gòu)),知道了CSS樣式(也稱為表示),會(huì)使用HT...
    凜0_0閱讀 2,915評(píng)論 0 8
  • 有形的物質(zhì)消費(fèi)和無(wú)形的消費(fèi),其實(shí)是兩種價(jià)值觀的不同,后著更看重長(zhǎng)期的發(fā)展,前著只是更多滿足目前的消費(fèi),過(guò)個(gè)20-3...
    007活在未來(lái)閱讀 721評(píng)論 0 0
  • “醉過(guò)才知酒濃 愛(ài)過(guò)才知情重:—— 你不能做我的詩(shī), 正如我不能做你的夢(mèng)” 這是胡適《嘗試集》里的一篇,《夢(mèng)與詩(shī)》...
    倪拗拗閱讀 12,872評(píng)論 1 8

友情鏈接更多精彩內(nèi)容