JavaScript基礎(chǔ)知識到高級應(yīng)用(二)_第1頁
JavaScript基礎(chǔ)知識到高級應(yīng)用(二)_第2頁
JavaScript基礎(chǔ)知識到高級應(yīng)用(二)_第3頁
JavaScript基礎(chǔ)知識到高級應(yīng)用(二)_第4頁
JavaScript基礎(chǔ)知識到高級應(yīng)用(二)_第5頁
已閱讀5頁,還剩107頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

JavaScript基礎(chǔ)知識到高級應(yīng)用

Scsnbxjyjhf

JavaScript的資料很多,但從未從頭到尾學(xué)完過。偶遇blue老師的被榮為“最經(jīng)典的

JavaScrip視頻教程”后,愛不釋眼,筆記過程中奇想何不筆錄下來,故有此教程。教程中夾

有個人的理解,由于水平有限,請以blue老師的講解為準。

第五課定時器

一、定時器的作用

1、兩種定時器

定時器有兩種,我們先看第一,種setlnterval():

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標題文檔

<script>

functionshow()

(

alert('a');

}

setlnterval(show,1000);

</script>

</head>

<body>

</body>

</html>

setlnterval()有兩個參數(shù),第一個參數(shù)是一個函數(shù)名,第二個參數(shù)是一個數(shù)字,其單位默

認是毫秒,setlnterval(show,1000)則表示按照指定的周期1000毫秒來調(diào)用指定的函數(shù)show,

而且這個方法會不停地調(diào)用函數(shù),直到clearlnterval()被調(diào)用或窗口被關(guān)閉。

這樣以來,上例運行時會每隔1秒顯示一個提示窗(因提示窗的阻斷,不是自動地不

斷顯示提示窗,而是你單擊確定按鈕后的1秒內(nèi)顯示下一個提示窗)。

setlnterval。這是第一種定時,稱為間隔型。

第二種是延時型:setTimeout(),它仍是那兩個參數(shù),運行情況是等待第二個參數(shù)所指

定的時間過去后才去執(zhí)行第一個參數(shù)所指定的函數(shù),不過只執(zhí)行一次便結(jié)束。

setlnterval。與setTimeout()就是這兩種定時器,一個是無限循環(huán)的,一個是只執(zhí)行,一次,

這是它們的最大區(qū)別。

特別是無限循環(huán)的定時器,如果我們某個時候不需要了,該怎么關(guān)閉呢?

2、定時器的開啟與關(guān)閉

與setlnterval()、setTimeout。兩個定時器的開啟相對應(yīng)的關(guān)閉是clearlnterval()

clearTimeout()o

實際上,setlnterval。開啟的同時,會返回一個ID值,這個ID值可用作clearlnterval()

方法的參數(shù)。setTimeout。也是如此。

下面我們來看看怎樣利用這個ID值來關(guān)閉指定的定時器。

<!DOCTYPEHTML>

<html>

<head>

<metacharset=Hutf-8">

無標題文檔

<script>

window.onload=function()

varoBtnl=document.getElementByld('btnl,);

varoBtn2=document.getElementByld('btn2');

vartimer=null;

oBtnl.onclick=function()

(

timer=setlnterval(function(){

alert('a');

),1000);

);

oBtn2.onclick=function()

(

clearlnterval(timer);

);

);

</script>

</head>

<body>

<inputid="btnlHtype="button”value=“開啟”/〉

<inputid="btn2"type="button"value="^ffl"/>

</body>

</html>

程序運行后,當我們單擊“開啟”按鈕后,該按鈕的。nclick事件被激活,執(zhí)行其中的

事件代碼,這次我們就不像前例那樣只是開啟了,而是在開啟的同時把它返回的ID值存放

在變量timer中。定時器激活后,會每隔1秒彈出一個窗口,且會無限循環(huán)下去。

當我們單擊“關(guān)閉”后,該按鈕的onclick事件被激活,執(zhí)行其中的事件代碼,

clearlnterval(timer);這句就會把由參數(shù)timer指定的定時器清除掉,也就是關(guān)閉。

二、Date對象及其方法

Date對象用于處理日期和時間。

創(chuàng)建Date對象的語法:

varmyDate=newDate()

Date對象會自動把當前日期和時間保存為其初始值。

new關(guān)鍵字我們在學(xué)習(xí)數(shù)組時曾接觸過,它是創(chuàng)建對象的關(guān)鍵字,待以后我們學(xué)習(xí)到面

向?qū)ο髸r會詳細講解,此處大家只需知道現(xiàn)在是用它來創(chuàng)建了一個Date對象即可。

Date對象有許多的方法,在這節(jié)里我們主要使用它的:

getHours():返回Date對象的小時(0~23)。

getMinutes()返回Date對象的分鐘(0~59)。

getSeconds()返回Date對象的秒數(shù)(0~59)。

getFullYear()從Date對象以四位數(shù)字返回年份。

getMonth()從Date對象返回月份(0~11)。

getDate()從Date對象返回一個月中的某一天(1~31)

getDay()從Date對象返回一周中的某一天(0~6)。

三、數(shù)碼時鐘

我們先看其效果圖:

超酷時鐘

2016年03月11日

16:24:04星期五

超酷時鐘

2016年03月11日

16:24:18星期五

運行時會取出當前日期、星期、時間顯示出來,且時鐘是活的,其時、分、秒數(shù)會隨著

時間的流逝而變化,且界面炫麗。界面酷逼,實際上是圖片的功勞,比如日期、日期的數(shù)字

就是由象下列那些圖片拼起來的

1png2.png3.pn<

4PR5.png6.png7.png

我們先新建一個文件夾img,把所要用到的圖片放入其中,以備程序使用:

img\

?O.png

6l.png

Q2.png

3?png

償4.png

05.png

66.png

Q7.png

④8.png

9.png

時間是由時、分、秒三部分組成,如12:12:12,而在這個例子里,我們是用對應(yīng)的數(shù)字

圖片來展示時間的,所以要使用六張圖片,先設(shè)計出頁面:

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標題文檔</title>

</head>

<body>

<imgsrc="img/O.png"/>

<imgsrc="img/O.png"/>

<imgsrc="img/O.pngH/>

<imgsrc="img/O.png,'/>

<imgsrc="img/O.png"/>

<imgsrc="img/O.png"/>

</body>

</html>

為了使效果明顯,我們再給body加上樣式

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標題文檔</title>

</head>

<bodystyle=Hbackground:black;color:white;font-size:50px;">

<imgsrc="img/O.png"/>

<imgsrc="img/O.png"/>

<imgsrc="img/O.png"/>

<imgsrc="img/O.png"/>

<imgsrc="img/O.png"/>

<imgsrc="img/O.png"/>

</body>

</html>

下面要做的就是用JS來把這些數(shù)字圖片所展現(xiàn)的時間換成當前時間。

首先拿到那六個圖片元素:varalmg=document.getElementsByTagName('img');

然后把這六個元素的圖片換成對應(yīng)的時間數(shù)字圖片。這是程序的關(guān)鍵6

假設(shè)當前時間是13:23:21,那么頁面中的第一個img元素,其src屬性就應(yīng)該修改為

img/l.png,第二個修改為img/3.png,第三個修改為img/2.png,依次類推。

img元素已經(jīng)在almg這個數(shù)組里了,那么我們使用for循環(huán)把它們?nèi)〕鰜矸謩e進行設(shè)置

即可完成了:

for(vari=O;i<almg.length;i++){

almg[i].srcHmg/,+圖片號Ypng。

)

關(guān)鍵在于這個圖片編號怎么去確定呢?怎樣讓程序知道,i=0時即第一張圖片名是1,i=l

時即第二張圖片名是3,……o而且這個時間數(shù)字在不同的時候,其值又是不同的。

我們做這樣的一個設(shè)想,假設(shè)有一個東西,它與img數(shù)組一樣大,但它里面是按時分秒

的順序存放這些時間數(shù)字,那么我們就可根據(jù)img的循環(huán)變量i去依次取出這些數(shù)字號不就

可以了嗎。

說到這里,我們也許會想到數(shù)組,而實際上字符串也有此功效的,如字符串siabcde"

其s⑼就是a,s⑴就是b,s⑵就是c,……

那么我們就用字符串varstr='132321’來表示當前時間,almg[i].src='img/4圖片號+'.png'

這句就可寫成almg[i].src='img/'+str[i]+1pngm其完整代碼如下:

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標題文檔

<script>

window.onload=function()

{

varalmg=document.getElementsByTagName(,img');

varstr=U32321';

for(vari=O;i<almg.length;i++)

(

almg[i].seimg/'+str[i]+'.png';

}

);

</script>

</head>

<bodystyle="background:black;color:white;font-size:50px;">

<imgsrc="img/O.png"/>

<imgsrc="img/O.png"/>

<imgsrc="img/O.png“/>

<imgsrc="img/O.png"/>

<imgsrc="img/O.png"/>

<imgsrc="img/O.png"/>

</body>

</html>

運行效果如下圖:

這個當前時間是我們指定的,是死的。下面我們要改進的是讓程序自己去獲得當前時間,

然后把它拼接成字符串,代替我們手寫的那個字符串。

我們new出一個Date來:varoDate二newDate。;根據(jù)前面我們所講的Date的知識,這

個oDate對象會自動把當前日期和時間保存為其初始值,也就是此時的oDate里什么都有了,

既有時間,還有日期。

那么我們使用Date對象的獲取時、分、秒的方法,把時、分、秒獲取出來并用字符串

連接符+拼接成一個字符串不就0K了嗎:

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標題文檔</title>

<script>

window.onload=function()

(

varalmg=document.getElementsByTagName('img');

varoDate=newDate();

varstr=oDate.getHours()+oDate.getMinutes()+oDate.getSeconds();

//alert(str);

for(vari=O;i<almg.length;i++)

(

almg[i].src='img/'+str[i]+'.png';

)

);

</script>

</head>

<bodystyle="background:black;color:white;font-size:50px;">

<imgsrc="img/O.png"/>

<imgsrc="img/O.png"/>

<imgsrc="img/O.png"/>

<imgsrc=Himg/O.png"/>

<imgsrc="img/O.png"/>

<imgsrc="img/O.png"/>

</body>

</html>

然而程序不管是在什么瀏覽器中運行都是一個錯誤:

我們將程序中注釋掉的〃alert(str);這句打開,將發(fā)現(xiàn):

這個字符串是108(你的調(diào)試時間不同這個值將不同),查看系統(tǒng)時間,將發(fā)現(xiàn)它是把

20:41:47中的時、分、秒以數(shù)字相加起來的20+41+47=108,原來getHours。、getMinutes。、

getSeconds。返回的結(jié)果是數(shù)字型的,所以此處的+便不是字符串的拼接,而是真正的加了。

這非常好辦,varstr="+oDate.getHours()+oDate.getMinutes()+oDate.getSeconds();用一空

字符串去與它們相加,自然就是字符串相加了?

經(jīng)過這一改進,運行起來,哈哈,對頭了。

嘿嘿,咋會出現(xiàn)錯誤呢:

我們不斷刷新,程序就會不斷加載,當秒數(shù)小于10,即不是兩位數(shù)時,就會出現(xiàn)上示

錯誤。如果當前時間是21:01:36時,它的錯誤還很離譜:

還有更離譜的錯誤,如果我們把系統(tǒng)時間修改成09:03:01后及時確定,隨即運行我們

的程序:

原來,當這些時、分、秒不是兩位數(shù)時,轉(zhuǎn)成的字符串后其中的時分秒位的數(shù)就會錯位,

而且因為少了數(shù)值位,沒有圖片對應(yīng),還會出現(xiàn)缺少圖片時的占位X圖。

這說明,在連接成字符串之前,我們須對時、分、秒做一判斷,如果不是兩位數(shù)字,就

給它補0,因時、分、秒都要這樣做,所以我們把它封裝成一個函數(shù)toDou,如下:

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

<title>無標題文檔</title>

<script>

functiontoDou(n)

if(n<10)

(

return'O'+n;

}

else

(

return"+n;

)

)

window.onload=function()

(

varalmg=document.getElementsByTagName('img');

varoDate=newDate();

varstr=toDou(oDate.getHours())+toDou(oDate.getMinutes())+toDou(oDate.getSeconds());

//alert(str);

for(vari=O;i<almg.length;i++)

(

almg[i].seimg/'+str[i]+'.png';

)

);

</script>

</head>

<bodystyle="background:black;color:white;font-size:50px;">

<imgsrc="img/O.pngn/>

<imgsrc="img/O.png"/>

<imgsrc=Himg/O.pngn/>

<imgsrc=Mimg/O.png"/>

<imgsrc="img/O.png"/>

<imgsrc="img/O.png"/>

</body>

</html>

好了,這下一切都正常了,但是,它卻是一個死鐘,它不會走起來,實時顯示時間。

要讓它走起來,就要每秒顯示一次,更新里面的時間數(shù)字,這時定時器就派上用場了。

我們把上面那段創(chuàng)建Date對象、獲取時間數(shù)、連接成字符串、設(shè)置時間圖片的代碼放

在一個函數(shù)里,然后讓定時器每隔1秒調(diào)用一次,這個鐘就活了:

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標題文檔

<script>

functiontoDou(n)

(

if(n<10)

(

return*0'+n;

)

else

(

return"+n;

)

)

window.onload=function()

varalmg=document.getElementsByTagName('img');

functiontick(){

varoDate=newDate();

varstr=toDou(oDate.getHours())+toDou(oDate.getMinutes())+toDou(oDate.getSeconds());

for(vari=O;i<almg.length;i++)

(

almg[i].src='img/'+str.[i]+'.png';

)

)

//tick();

setlnterval(tick,1000);

);

</script>

</head>

<bodystyle="background:black;color:white;font-size:50px;">

<imgsrc="img/0.png"/>

<imgsrc="img/0.png"/>

<imgsrc="img/O.png"/>

<imgsrc="img/0.png"/>

<imgsrc="img/0.png"/>

<imgsrc="img/O.png"/>

</body>

</html>

但還有一個不夠完美的現(xiàn)象,就是每次開始運行時,或者刷新時,其最初界面還是頁面

上的00:00:00圖片,要待1秒后才會變成現(xiàn)在的時間:

C二file:/〃E:/教學(xué)智能社Blue(石川R三]

00:00:00

這是因為setlnterval(tick,1000);這個定時器有個特點,它在開啟時不是立即開啟,而是

要等待1秒后才會開啟。根據(jù)這上特點,我們可以在定時器開啟前,手工讓定時器要執(zhí)行的

那個函數(shù)先執(zhí)行一下即可解決這個問題(把上面代碼中的〃tick();注釋符去掉即可)。

終于大功告成!。

不急,還沒完。

還有什么呀?

兼容性啦!

如果我們在IE7下運行,將會出錯的:

其原因是,對于一個字符串如s=,abc-在IE7這些低版本瀏覽器中,不支持像數(shù)組那樣

的方式s[0]、s[l],s[2]來取用其中的單個字符,所以會出錯。其兼容性的做法是使用字符串

的charAt方法,如要取用a,用s.charAt(O);如果取用c,用s.charAt⑵,所以,我們只需將

程序中的almg[i].src='img,+str」i]+'.png';這句中的str.川改成str.charAt。]即可解決這個問題了。

這個時鐘還缺日期顯示部分,這個就請大家自行完成。在這里我們說說Date獲取年、

月、日、星期的那幾個函數(shù)。

getFullYear()從Date對象以四位數(shù)字返回年份。

從對象返回月份

getMonth()Date(0~11)0

getDatef)從Date對象返回一個月中的某一天(1~31)

getDay()從Date對象返回一周中的某一天(0~6)。

getFulYear()與getDate()這兩個出來的結(jié)果與我們的生活實際是一致的,大家直接使用即

可。

getMonth。返回的月份是0~11,也就說它的月份始終比我們?nèi)祟惖脑路菪∫粋€月,因它

從0開始數(shù)月份的,所以我們要它的月份上加一才是我們的月份,即在程序中要使用

getMonth()+l來表示月份。

getDay()返回的是0~6,其中的0表示的是星期天,因國外的一周開始是星期天,這與

我們中國人一周的開始是星期一的習(xí)慣不同。

四、推遲隱藏

什么是推遲隱藏,請看下例

HFOCSKJOOB

HF

.L?***.

?

黜:聯(lián)至人討誕建

3444天&36天

南部教育人事工作群

陳至5?:好的

一?1應(yīng)

四川民辦教育數(shù)據(jù)平臺昨天

竟林:各位四長.老師:成都有無o

何建吾昨天

發(fā)送了TS口抖就.

臉證消息昨天

乍人生由請加入群國都縣水

極塞學(xué)院VIP專屬③群昨天

張若極等reactnative爆慢什么

南部縣民辦教青3-10

下用::須陶昵期

在QQ界面上,我們的鼠標指向自己的頭像與個性簽名處,在左邊就會出現(xiàn)一個資料信

息框,如上圖所示。鼠標移到這個資料框中時,QQ界面立即折疊回去,只有鼠標處的資料

框還在,如下圖所示:

此時鼠標移開這個資料框時,它不會立即消失,要稍等片刻才會消失。我們稱這種為推

遲隱藏。

下面我們來做一個類似的效果。

首先布局:

<(DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標題文檔</title>

<style>

div{float:left;margin:10px;}

#divl{width:50px;height:50px;background:red;}

#div2{width:250px;height:180px;background:#CCC;}

</style>

</head>

<body>

<divid="divl"x/div>

<divid="div2"x/div>

</body>

顯示,所以還需在#div2中增加一個為none的顯示樣式:#div2{width:250px;height:18Opx;

background:#CCC;display:none;}

下邊我們用JS來完成第一步:獲取那兩個Div元素,然后給Divl加上鼠標移入移出事

件,移入時顯示div2,移出時隱藏div2:

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8H>

無標題文檔

<style>

div{float:left;margin:10px;}

#divl{width:50px;height:50px;background:red;}

#div2{width:250px;height:180px;background:#CCC;display:none;}

</style>

<script>

window.onload=function()

(

varoDivl=document.getElementByld('divl');

varoDiv2=document.getElementByld('div2');

oDivl.onmouseover=function()

(

oDiv2.style.display='block';

};

oDivl.onmouseout=function()

(

oDiv2.style.display='none';

);

);

</script>

</head>

<body>

<divid="divl"x/div>

<divid="div2"x/div>

</body>

</html>

做好了divl,下步就應(yīng)做div2的了,當鼠標移入到div2時,div2顯示°“移入div2,div2

顯示"這樣的話不是廢話嗎?要移入到div2,不是先要有div2存在才能移入嗎,既然已經(jīng)

顯示出來了,又何必再讓它顯示呢。況且,在我們這個程序里,因margirvlOpx,div2與divl

相距一旦鼠標移出立即消失,所以無論如何我們都無辦法把鼠標移入

20px,divl,div2div2o

在上邊的程序里,我們是無辦法將鼠標移入div2里去的。如果我們使用推遲隱藏技術(shù),

當鼠標移出divl隱藏div2時,讓div2的隱藏推遲一下,我們則能把鼠標移入div2了。

延時型setTimeout。定時器就能幫我們完成這樣的事情。setTimeout。有兩個參數(shù),運行

情況是等待第二個參數(shù)所指定的時間過去后才去執(zhí)行第一個參數(shù)所指定的函數(shù),如下列形式:

setTimeout(function(){....},1000)

下面我們的做法是,在上例代碼中的divl的鼠標移出事件里開一個定時器,并將隱藏

div2的oDiv2.style.display4none';這句代碼放在這個定時器里的那個匿名函數(shù)中就可達到推

遲隱藏div2的目的了:

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標題文檔

<style>

div{floatleft;margin:10px;}

#divl{width:50px;height:50px;background:red;}

#div2{width:250px;height:180px;background:#CCC;display:none;}

</style>

<script>

window.onload=function()

(

varoDivl=document.getElementByld(,divl');

varoDiv2=document.getElementByld('div2');

oDivl.onmouseover=function()

(

oDiv2.style.display='block,;

);

oDivl.onmouseout=function()

setTimeout(function(){oDiv2.style.display='none';}/1000);

);

</script>

</head>

<body>

<divid="divl"x/div>

<divid="div2"x/div>

</body>

</html>

現(xiàn)在鼠標就能移入到div2身上去了。但是,好景不長,過1秒后,div2同樣會消失。

因那個定時器等待1秒后會執(zhí)行那個函數(shù)里的代碼,將div2隱藏掉。

當鼠標移出divl后,div2是該隱藏的,但如果移出的鼠標在div2的身上,此時我們就

不再需要隱藏div2了,那就趕緊告訴定時器,我在div2身上,請不要執(zhí)行你的定時執(zhí)行功

能了,即關(guān)閉那個定時器即可。也就是說,我們在div2的鼠標移入事件里調(diào)用clearTimeoutO

方法關(guān)閉那個定時器,這樣div2就不會被隱藏了。但此時隱藏功能被去掉了,那么當鼠標

移出div2時,div2也不會隱藏,所以我們還需給div2加上鼠標移出事件,在這個事件里來

隱藏div2:

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標題文檔

<style>

div{floatdeft;margin:10px;}

#divl{width:50px;height:5Opx;background:red;}

#div2{width:250px;height:180px;background:#CCC;displaymone;}

</style>

<script>

window.onload=function()

(

varoDivl=document.getElementByld('divl,);

varoDiv2=document.getElementByld(,div2');

vartimer=null;

oDivl.onmouseover=function()

(

oDiv2.style.display='block';

);

oDivl.onmouseout=function()

(

timer=setTimeout(function(){oDiv2.style.display='none';}/500);

);

oDiv2,onmouseover=function()

(

clearTimeout(timer);

};

oDiv2.onmouseout=function()

(

oDiv2.style.display='none';

);

);

</script>

</head>

<body>

<divid="divl"x/div>

<divid=,'div2,,x/div>

</body>

</html>

在這里,大家可不要忘記了定時器開啟與關(guān)閉的特點,定時器開啟的同時,會返回一個

ID值,這個ID值可用作定時器關(guān)閉方法的參數(shù)。所以,我們增加了一個timer變量來存放

這個ID值,以便關(guān)閉時使用。

到此,此程序就基本上完成了,剩下的是一些需要完善的小不足。

第一個不足,當鼠標由div2移回到divl時,div2總會閃一下。如果我們鼠標移動慢一

點將會發(fā)現(xiàn),當鼠標移出div2處于兩者之間時,div2隱藏,而接下來鼠標很快又進入divl,

div2又顯示出來,所以會閃一下。

為讓其不閃,我們還是使用同樣的方法,讓div2推遲隱臧。在上例代碼中的div2的鼠

標移出事件里開一個定時器,并將隱藏div2的oDiv2.style.display='none,;這句代碼放在這個

定時器里的那個匿名函數(shù)中就可達到推遲隱藏div2的目的了:

<?DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標題文檔</title>

<style>

div{float:left;margin:10px;}

#divl{width:50px;height:50px;background:red;}

#div2{width:250px;height:180px;background:#CCC;display:none;}

</style>

<script>

window.onload=function()

(

varoDivl=document.getElementByld(,divl');

varoDiv2=document.getElementByld('div2');

vartimer=null;

oDivl.onmouseover=function()

(

oDiv2.style.display='block,;

);

oDivl.onmouseout=function()

(

timer=setTimeout(function(){oDiv2.style.display='none';}/500);

);

oDiv2,onmouseover=function()

clearTimeout(timer);

);

oDiv2.onmouseout=function()

(

setTimeout(function(){oDiv2.style.display='none';}/1000);

);

);

</script>

</head>

<body>

<divid="divl"x/div>

<divid="div2"x/div>

</body>

</html>

這雖然不閃了,但又帶來了一個新問題,即使鼠標在divl身上,div2過一會兒總會隱

藏的。也許我們會犯疑惑了,當鼠標移入到divl上時,其oDivl.onmouseover=function()

{oDiv2.style.display='block,;};不是已經(jīng)把div2設(shè)置為顯示了啊,咱還會隱藏呢?

上邊的分析也是正確的,確實divl的鼠標移入事件也被執(zhí)行了的,并設(shè)置了div2的顯

示屬性為顯示。但我們不能忽視div2上的定時器,它是等待1秒后把div2的顯示屬性設(shè)置

為不顯示的,也就是說它是后執(zhí)行的,所以div2總會隱藏。

解決的辦法還是一樣,當鼠標在divl身上時,就關(guān)閉div2上的定時器。如下:

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf"8">

〈title〉無標題文檔

<style>

div{float:left;margin:10px;}

#divl{width:50px;height:50px;background:red;}

#div2{width:250px;height:180px;background:#CCC;display:none;}

</style>

<script>

window.onload=function()

(

varoDivl=document.getElementByld('divl');

varoDiv2=document.getElementByld('div2');

vartimer=null;

oDivl.onmouseover=function()

(

clearTimeout(timer);

oDiv2.style.display='block';

);

oDivl.onmouseout=function()

(

timer=setTimeout(function(){oDiv2.style.display='none';}/500);

};

oDiv2,onmouseover=function()

(

clearTimeout(timer);

};

oDiv2.onmouseout=function()

(

timer=setTimeout(function(){oDiv2.style.display='none';}/1000);

);

);

</script>

</head>

<body>

<divid="divl"x/div>

<divid=Hdiv2"x/div>

</body>

</html>

也許細心的你又會出現(xiàn)一個疑慮,同一個變量timer,一會兒引用的是divl上的定時器,

一會兒引用的是div2上的定時器,會不會出現(xiàn)混亂情況,不該關(guān)閉的被關(guān)閉了,該關(guān)閉的

卻沒有關(guān)閉呢。

既然怕亂,何不使用兩個變量來分別代表這兩個定時器呢:

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

<title>無標題文檔

<style>

div{floatdeft;margin:10px;}

#divl{width:50px;height:50px;background:red;}

#div2{width:250px;height:180px;background:#CCC;display:none;}

</style>

<script>

window.onload=function()

{

varoDivl=document.getElementByld(,divl');

varoDiv2=document.getElementByld('div2,);

vartimerl=null;

vartimer2=null;

oDivl.onmouseover=function()

(

clearTimeout(timer2);

oDiv2.style.display='block,;

);

oDivl.onmouseout=function()

,

timerl=setTimeout(function(){oDiv2.style.display='none;}/100);

);

oDiv2.onmouseover=function()

(

clearTimeout(timerl);

);

oDiv2.onmouseout=function()

(

timer2=setTimeout(function(){oDiv2.style.display='none';},1000);

);

};

</script>

</head>

<body>

<divid="divl"x/div>

<divid=',div2"x/div>

</body>

</html>

這下兩個定時器也區(qū)別開來了,似乎邏輯上也很明確了,下面我們來全面分析一下代碼,

看一看是否存在bug。

這個程序的復(fù)雜性主要表現(xiàn)在divl與div2之間的事件以及定時器的開啟與關(guān)閉的交錯

上,我們應(yīng)以事件發(fā)生的幾種可能性為線索來進行分析,才不至于混雜一團。

鼠標移動不外乎三種情況:在divl與div2間來回移動、在divl與空白間移動、在div2

與空白間移動。

(為了敘述的方便,我們把鼠標移入divl記為:Tdivl,移出記為divlf,定時器開啟

記為:true,未開啟或被清除記為:false,div2處于顯示狀態(tài)記為:block,處于隱藏狀態(tài)記

為:none,~>none表示將要變成none或者說1秒后變成none)

第一種鼠標在divl與div2間來回移動:

timerltimer2div2

區(qū)域事件初值初值初值

falsefalsenone

玲divlclearTimeout(timer2);oDiv2.style.display=,block';falseblock

divl〉timerl=setTimeout(function(){oDiv2.style.display='none';},100)true->none

->div2clearTimeout(timerl)falseblock

div29timer2=setTimeout(function(){oDiv2.style.display='none';}z1000)true->none

TdivlclearTimeout(timer2);oDiv2.style.display=,block';falseblock

從上表可看出,進入divl時div2便顯示,出divl時開啟定時器1,但進入div2時便關(guān)

閉定時器1,所以div2還是處于顯示狀態(tài)。出div2時開啟定時器2,但進入divl時便關(guān)閉

定時器2,div2還是顯示。所以上列代碼在這種情況下無錯誤。

同時我們可看出,在這種情況下,timerl與timer2不會處于同時開啟狀態(tài),即當一個

開啟時,另一個是關(guān)閉的,而且一個定時器開啟時;下一步的關(guān)閉操作中所關(guān)閉的定時器就

是那個開啟的定時器。那么我們可以這樣理解,這兩個定時器,在同一時刻只有其中一個是

活動的,所以我們可以用同一個變量來存放當前定時器,而不會出現(xiàn)我們所擔(dān)心的發(fā)生混亂

的情況出現(xiàn),而且代碼還簡潔了一些。這說明,使用兩個變量來存放這兩個定時器,在這種

情況下是多余的。

第二種鼠標在divl與空白間移動:

timerltimer2div2

區(qū)域事件初值初值初值

falsefalsenone

今divlclearTimeout(timer2);oDiv2.style.display='block,;falseblock

divltimerl=setTimeout(function(){oDiv2.style.display='none';}/100)trueTnone

Block

->divlclearTimeout(timer2);oDiv2.style.display='block';false

none

divl今timerl=setTimeout(function(){oDiv2.style.display='none';},100)truenone

這就有問題了,體現(xiàn)在前三步中,第一步,進入divl,顯示出div2;第二步,出divl,

開定時器1;第三步,再進divl,進入后會顯示div2,但定時器1未關(guān)閉,1秒后還會隱藏

div2,就會出現(xiàn)鼠標在divl上,應(yīng)該顯示的div2卻莫明其妙地隱藏了。為解決這個問題,

我們還須在進入divl的事件中增加關(guān)閉定時器1的動作。那么對經(jīng)這樣改進后的程序的執(zhí)

行狀況再進行分析的情況如下:

timerltimer2div2

區(qū)域事件初值初值初值

falsefalsenone

clearTimeout(timerl);clearTimeout(timer2);

玲divlfalsefalseblock

oDiv2.style.display='block,;

divl〉timerl=setTimeout(function(){oDiv2.style.display='none';},100)true->none

clearTimeout(timerl);clearTimeout(timer2);

fdivlfalsefalseblock

oDiv2.style.display=,block';

divl玲t(yī)imerl=setTimeout(function(){oDiv2.style.display=,none,;},100)truefnone

clearTimeout(timerl);clearTimeout(timer2);

—divlfalsefalseblock

oDiv2.style.display='block,;

經(jīng)此改進后,鼠標在divl與空白間移動這種情況下變正常了。同時還可看出定時器

timerl與timer2可以用一個變量來存放它們。

但改了后,對原告已經(jīng)正常的第一種情況又如何呢,還須針對此情況再分析:

timerltimer2div2

區(qū)域事件初值初值初值

falsefalsenone

clearTimeout(timerl);clearTimeout(timer2);

玲divlfalsefalseblock

oDiv2.style.display='block';

,玲

divl->timerl=setTimeout(function(){oDiv2.style.display='none;}/100)truenone

今div2clearTimeout(timerl)falseblock

div2->timer2=setTimeout(function(){oDiv2.style.display='none';}z1000)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論