JavaScript學(xué)習(xí)系列(二)--定時(shí)器

本節(jié)內(nèi)容

1.定時(shí)器的使用
2.數(shù)碼時(shí)鐘
3.延時(shí)提示框
4.無縫滾動(dòng)

一、定時(shí)器的使用

兩種定時(shí)器

-setInterval   間隔型
-setTimeout    延時(shí)型

兩者區(qū)別:前者是無限次的執(zhí)行 后者只執(zhí)行一次

setInterval(參數(shù)1,參數(shù)2)第一個(gè)參數(shù)需要穿進(jìn)去一個(gè)函數(shù),第二個(gè)函數(shù)設(shè)置時(shí)間
代碼示例--用兩個(gè)按鈕來控制定時(shí)器的使用

<script>
    window.onload = function () {
        var oBtn1 = document.getElementById('btn1');
        var oBtn2 = document.getElementById('btn2');
        var timer = null;
        oBtn1.onclick = function () {
            // 用timer變量存儲(chǔ)這個(gè)定時(shí)器  就可以在關(guān)閉的方法中進(jìn)行使用了
            timer = setInterval(function () {
                alert('a');
            },1000)
        }
        oBtn2.onclick = function () {
            clearInterval(timer)
        }
     }
</script>

<body>
<input id="btn1" type="button" value="開啟">
<input id="btn2" type="button" value="關(guān)閉">
</body>

如果需要停止定時(shí)器則對(duì)應(yīng)的方法是

停止定時(shí)器
- clearInterval
- clearTimeout  

二、數(shù)碼時(shí)鐘

下邊用Date對(duì)象和定時(shí)器做一個(gè)數(shù)碼時(shí)鐘,效果如下:

示例.png

整體的思路:

1.獲取系統(tǒng)時(shí)間
- Date對(duì)象
- getHours()、getMinutes()、getSeconds()
- 年 getFullYear()   月 getMonth()  日 getDate()  星期 getDay()

2.顯示系統(tǒng)時(shí)間
- 字符串連接
- 空位補(bǔ)零

3.通過更改圖片的src來達(dá)到動(dòng)態(tài)更換圖片的目的

核心代碼如下:

<script>
    
    // 寫一個(gè)將數(shù)字不成兩位的方法 空位補(bǔ)零
    function toDouble(n) {
        if(n<10) {
            return '0' + n;
        } else {
            return '' + n;
            // 使用一個(gè)空字符串的目的是讓返回結(jié)果保證是一個(gè)字符串
            // 也同時(shí)保證了即使是一個(gè)兩位數(shù)也不會(huì)出現(xiàn)相加的情況
        }
     }
    window.onload = function () {
        // 先獲取元素
        var aImg = document.getElementsByTagName('img');
        // var str = '132321'; 用這種6位數(shù)的字符串一一對(duì)應(yīng)
        function tick() {
            // Date()對(duì)象  獲取時(shí)間 首先創(chuàng)建一個(gè)對(duì)象
            var oDate = new Date();
            // 拼出一個(gè)向上邊的那種字符串
            var str = toDouble(oDate.getHours()) + toDouble(oDate.getMinutes()) + toDouble(oDate.getSeconds());
            for(var i=0; i < aImg.length; i++) {
                aImg[i].src = 'img/'+str[i]+'.jpeg';
            }
        }
        // 最后用一個(gè)定時(shí)器來讓這個(gè)匯總表動(dòng)起來
        setInterval(tick,1000)
        // 這時(shí)候會(huì)發(fā)現(xiàn)定時(shí)器會(huì)先出現(xiàn)初始的狀態(tài)  然后才會(huì)開始正常計(jì)時(shí),給人一種跳表的感覺,這是因?yàn)槎〞r(shí)器函數(shù)是在1秒之后才開始執(zhí)行
        // 下邊就來解決這種問題 將函數(shù)命名為tick 在onload函數(shù)中執(zhí)行一次就行了
        tick();
    }
</script>

<body>
![](img/0.jpeg)
![](img/1.jpeg)
<label>:</label>
![](img/4.jpeg)
![](img/5.jpeg)
<label>:</label>
![](img/2.jpeg)
![](img/5.jpeg)
</body>

注意1:這里為了兼容性問題在IE7中str[i]是無法執(zhí)行的因此考慮使用str.charAt[i]來代替str[i]這兩者本身都是一個(gè)含義。

注意2:在日期對(duì)象中獲取月份的時(shí)候,由于月份也是從0開始算,因此得到的月份會(huì)比實(shí)際的少一,因此在獲取月份的時(shí)候需要特殊注意

<script>
    var aDate = new Date();
    alert(aDate.getMonth()+1);
</script>

三、延時(shí)提示框

需求:div1和div2,鼠標(biāo)移入某個(gè)div上,div2不隱藏,移出div1和div2后,div2隱藏

<script>
    window.onload = function () {
    // 當(dāng)鼠標(biāo)移入的時(shí)候 顯示div2 移出時(shí)延時(shí)消失
        var oDiv1 = document.getElementById('div1');
        var oDiv2 = document.getElementById('div2');
        var timer = null;
        /*
        oDiv1.onmouseover = function () {
            clearTimeout(timer);
            oDiv2.style.display = 'block';
        };
        
        oDiv1.onmouseout = function () {
            // 延時(shí)消失
            timer = setTimeout(function () {
                oDiv2.style.display = 'none';
            },500)
        };
        
        // 我們希望鼠標(biāo)停在div2上的時(shí)候 div2能保持出現(xiàn) 那么就需要在div2上清除定時(shí)器
        oDiv2.onmouseover = function () {
            clearTimeout(timer);
        };
        // 下邊我們?nèi)允窍M?dāng)鼠標(biāo)從div2移除的時(shí)候消失 這時(shí)候還需要添加下邊的方法
        oDiv2.onmouseout = function () {
            // 這時(shí)候我們?nèi)园l(fā)現(xiàn)一個(gè)問題 當(dāng)鼠標(biāo)快速移出div2的時(shí)候會(huì)閃一下 因?yàn)榘凑障逻叺拇a的話,鼠標(biāo)一離開div2,div2立即消失
            // 要解決這個(gè)小問題  我們也給div2加一個(gè)定時(shí)器
            timer = setTimeout(function () {
                oDiv2.style.display = 'none';
            },500);
            // 這時(shí)移到div1上后 div2還是會(huì)消失 原因還是這個(gè)定時(shí)器,因此在移入div1的時(shí)候先進(jìn)行移除定時(shí)器操作
        }
        */
        // 最后通過比對(duì)上邊的代碼 進(jìn)行重復(fù)代碼合并和簡(jiǎn)化
        oDiv1.onmouseover = oDiv2.onmousemove = function () {
            clearTimeout(timer);
            oDiv2.style.display = 'block';
        };
        
        oDiv1.onmouseout = oDiv2.onmouseout = function () {
            timer = setTimeout(function () {
                oDiv2.style.display = 'none';
            },500)
        };
   }
 </script>

四、無縫滾動(dòng)

1.offsetLeft的作用
2.用定時(shí)器讓物體連續(xù)移動(dòng)
3.效果原理-讓ul一直向左移動(dòng),復(fù)制li
4.innerHTML和+= 修改ul的width
5.滾動(dòng)過界后,重設(shè)位置,判斷過界

核心代碼如下

<style>
    * {margin: 0; padding: 0;}
    #div1{width: 1420px;  height:215px;  margin:100px auto;position: relative;background: red;overflow: hidden;}
    #div1 ul{position: absolute;left: 0;top: 0;}
    #div1 ul li {  float: left; width: 355px;height: 215px;list-style: none;}
</style>
<script>
    window.onload = function () {
        var oDiv = document.getElementById('div1');
        var oUl = oDiv.getElementsByTagName('ul')[0];
        var aLi = oUl.getElementsByTagName('li');
        var speed = -2;

        oUl.innerHTML = oUl.innerHTML+oUl.innerHTML;
        oUl.style.width=aLi[0].offsetWidth*aLi.length+'px';
        
        function move() {
            if(oUl.offsetLeft<-oUl.offsetWidth/2){
                oUl.style.left = '0';
            }
            if(oUl.offsetLeft>0){
                oUl.style.left = -oUl.offsetWidth/2+'px';
            }
            oUl.style.left = oUl.offsetLeft+speed+'px';
        }
        var timer = setInterval(move,30);
        // 鼠標(biāo)移入定時(shí)器停止
        oDiv.onmouseover = function () {
            clearInterval(timer);
        };
        oDiv.onmouseout = function () {
            timer = setInterval(move,30);
        };
            
        document.getElementsByTagName('a')[0].onclick = function () {
            speed = -2;
        };
        document.getElementsByTagName('a')[1].onclick = function () {
            speed = 2;
        }
    }
</script>

<body>
<a href="javascript:;">向左走</a>
<a href="javascript:;">向右走</a>
<div id="div1">
    <ul>
        <li>![](img2/1.png)</li>
        <li>![](img2/2.png)</li>
        <li>![](img2/3.png)</li>
        <li>![](img2/4.png)</li>
    </ul>
</div>
</body>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • jQuery基礎(chǔ) 什么是JQ?一個(gè)優(yōu)秀的JS庫,大型開發(fā)必備JQ的好處?一簡(jiǎn)化JS的復(fù)雜操作二不再需要關(guān)心兼容性三...
    幺七閱讀 956評(píng)論 0 2
  • 尼瑪!!!! 第二次保存了無法更新,簡(jiǎn)直浪費(fèi)感情!!!今天把blue視頻1-10課的練習(xí)重做了一遍,雖然能脫稿,但...
    fancypy閱讀 401評(píng)論 0 0
  • 姓名:周崇杰 學(xué)號(hào):16040120059 專業(yè):機(jī)械設(shè)計(jì)制造及其自動(dòng)化 轉(zhuǎn)載自:http://blog.csd...
    CJbaby閱讀 1,087評(píng)論 0 0
  • 一個(gè)計(jì)數(shù)器通常是由一組觸發(fā)器構(gòu)成,該組觸發(fā)器按照預(yù)先給定的順序改變其狀態(tài),如果所有觸發(fā)器的狀態(tài)改變是在同一時(shí)鐘脈沖...
    錦穗閱讀 13,790評(píng)論 0 6
  • 今天把家里所有的玻璃擦拭了一遍,非常的用力,擦了三四遍還是有很多頑漬擦不干凈,累的筋疲力盡,不由得很沮喪的坐下來休...
    美玉石閱讀 218評(píng)論 0 0