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ù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

Scsnbxjyjhf

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

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

有個(gè)人的理解,由于水平有限,請以blue老師的講解為準(zhǔn)。

第五課定時(shí)器

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

1、兩種定時(shí)器

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

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標(biāo)題文檔

<script>

functionshow()

(

alert('a');

}

setlnterval(show,1000);

</script>

</head>

<body>

</body>

</html>

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

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

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

這樣以來,上例運(yùn)行時(shí)會每隔1秒顯示一個(gè)提示窗(因提示窗的阻斷,不是自動地不

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

setlnterval。這是第一種定時(shí),稱為間隔型。

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

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

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

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

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

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

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

clearTimeout()o

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

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

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

<!DOCTYPEHTML>

<html>

<head>

<metacharset=Hutf-8">

無標(biāo)題文檔

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

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

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

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

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

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

二、Date對象及其方法

Date對象用于處理日期和時(shí)間。

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

varmyDate=newDate()

Date對象會自動把當(dāng)前日期和時(shí)間保存為其初始值。

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

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

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

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

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

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

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

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

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

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

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

我們先看其效果圖:

超酷時(shí)鐘

2016年03月11日

16:24:04星期五

超酷時(shí)鐘

2016年03月11日

16:24:18星期五

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

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

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

1png2.png3.pn<

4PR5.png6.png7.png

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

img\

?O.png

6l.png

Q2.png

3?png

償4.png

05.png

66.png

Q7.png

④8.png

9.png

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

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

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標(biāo)題文檔</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">

無標(biāo)題文檔</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)的時(shí)間換成當(dāng)前時(shí)間。

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

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

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

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

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

即可完成了:

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

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

)

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

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

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

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

可以了嗎。

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

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

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

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

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標(biāo)題文檔

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

運(yùn)行效果如下圖:

這個(gè)當(dāng)前時(shí)間是我們指定的,是死的。下面我們要改進(jìn)的是讓程序自己去獲得當(dāng)前時(shí)間,

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

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

個(gè)oDate對象會自動把當(dāng)前日期和時(shí)間保存為其初始值,也就是此時(shí)的oDate里什么都有了,

既有時(shí)間,還有日期。

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

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

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標(biāo)題文檔</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>

然而程序不管是在什么瀏覽器中運(yùn)行都是一個(gè)錯(cuò)誤:

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

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

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

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

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

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

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

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

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

錯(cuò)誤。如果當(dāng)前時(shí)間是21:01:36時(shí),它的錯(cuò)誤還很離譜:

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

的程序:

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

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

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

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

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

<title>無標(biāo)題文檔</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>

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

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

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

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

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標(biāo)題文檔

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

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

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

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

00:00:00

這是因?yàn)閟etlnterval(tick,1000);這個(gè)定時(shí)器有個(gè)特點(diǎn),它在開啟時(shí)不是立即開啟,而是

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

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

終于大功告成!。

不急,還沒完。

還有什么呀?

兼容性啦!

如果我們在IE7下運(yùn)行,將會出錯(cuò)的:

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

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

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

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

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

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

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

從對象返回月份

getMonth()Date(0~11)0

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

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

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

可。

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

從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界面上,我們的鼠標(biāo)指向自己的頭像與個(gè)性簽名處,在左邊就會出現(xiàn)一個(gè)資料信

息框,如上圖所示。鼠標(biāo)移到這個(gè)資料框中時(shí),QQ界面立即折疊回去,只有鼠標(biāo)處的資料

框還在,如下圖所示:

此時(shí)鼠標(biāo)移開這個(gè)資料框時(shí),它不會立即消失,要稍等片刻才會消失。我們稱這種為推

遲隱藏。

下面我們來做一個(gè)類似的效果。

首先布局:

<(DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標(biāo)題文檔</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中增加一個(gè)為none的顯示樣式:#div2{width:250px;height:18Opx;

background:#CCC;display:none;}

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

件,移入時(shí)顯示div2,移出時(shí)隱藏div2:

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8H>

無標(biāo)題文檔

<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的了,當(dāng)鼠標(biāo)移入到div2時(shí),div2顯示°“移入div2,div2

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

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

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

20px,divl,div2div2o

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

當(dāng)鼠標(biāo)移出divl隱藏div2時(shí),讓div2的隱藏推遲一下,我們則能把鼠標(biāo)移入div2了。

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

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

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

下面我們的做法是,在上例代碼中的divl的鼠標(biāo)移出事件里開一個(gè)定時(shí)器,并將隱藏

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

遲隱藏div2的目的了:

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標(biāo)題文檔

<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)在鼠標(biāo)就能移入到div2身上去了。但是,好景不長,過1秒后,div2同樣會消失。

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

當(dāng)鼠標(biāo)移出divl后,div2是該隱藏的,但如果移出的鼠標(biāo)在div2的身上,此時(shí)我們就

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

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

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

移出div2時(shí),div2也不會隱藏,所以我們還需給div2加上鼠標(biāo)移出事件,在這個(gè)事件里來

隱藏div2:

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標(biāo)題文檔

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

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

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

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

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

第一個(gè)不足,當(dāng)鼠標(biāo)由div2移回到divl時(shí),div2總會閃一下。如果我們鼠標(biāo)移動慢一

點(diǎn)將會發(fā)現(xiàn),當(dāng)鼠標(biāo)移出div2處于兩者之間時(shí),div2隱藏,而接下來鼠標(biāo)很快又進(jìn)入divl,

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

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

標(biāo)移出事件里開一個(gè)定時(shí)器,并將隱藏div2的oDiv2.style.display='none,;這句代碼放在這個(gè)

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

<?DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

無標(biāo)題文檔</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>

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

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

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

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

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

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

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

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf"8">

〈title〉無標(biāo)題文檔

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

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

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

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

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

<!DOCTYPEHTML>

<html>

<head>

<metacharset="utf-8">

<title>無標(biāo)題文檔

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

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

看一看是否存在bug。

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

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

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

與空白間移動。

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

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

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

第一種鼠標(biāo)在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

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

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

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

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

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

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

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

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

情況下是多余的。

第二種鼠標(biāo)在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)在前三步中,第一步,進(jìn)入divl,顯示出div2;第二步,出divl,

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

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

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

行狀況再進(jìn)行分析的情況如下:

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)此改進(jìn)后,鼠標(biāo)在divl與空白間移動這種情況下變正常了。同時(shí)還可看出定時(shí)器

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

但改了后,對原告已經(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論