案件重現(xiàn)
今天有位然之OA 系統(tǒng)的定制開發(fā)用戶咨詢了個(gè)問題,他想在新加的功能模塊的操作面板中,實(shí)現(xiàn)用戶點(diǎn)擊刪除按鈕時(shí)提示友好提醒,如下:
![](http://blog.cnezsoft.com/file-read-4118.png)
問題很簡(jiǎn)單,雖然他自己最終達(dá)到目的效果了,但不知道起初問題出在哪里碌更。通過交流了解,他開始是這么做的颈娜,大致問題代碼如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script> window.onload=function () { function confirmdelete() { return window.confirm("你確定要?jiǎng)h除嗎?"); } } </script> </head> <body> </body> <?php echo "<a onclick='confirmdelete()'>刪除</a>"; ?>
結(jié)果未能達(dá)到目的隙弛,點(diǎn)擊刪除按鈕沒有效果悔雹,然后這位朋友將window.onload刪除后,再試了一下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script> function confirmdelete() { return window.confirm("你確定要?jiǎng)h除嗎猬错?"); } </script> </head> <body> </body> <?php echo "<a onclick='return confirmdelete()'>刪除</a>"; ?>
結(jié)果成功了洞豁,點(diǎn)擊刪除按鈕成功觸發(fā)事件盐固,彈出提示框。于是這位朋友就懷疑是不是window.onload將JS代碼在頁(yè)面全部加載完畢后再執(zhí)行就無(wú)效了丈挟,是不是代碼執(zhí)行順序的問題刁卜。
事實(shí)真的是這樣么?
![](http://blog.cnezsoft.com/file-read-4119.jpg)
當(dāng)然不是曙咽。相信很多朋友已經(jīng)發(fā)現(xiàn)了真正的問題所在——作用域蛔趴。
這位朋友起初將confirmdelete函數(shù)寫成了onload事件的一個(gè)內(nèi)函數(shù),那么confirmdelete就是一個(gè)閉包例朱,而刪除事件觸發(fā)后孝情,它是在全局作用域中查找調(diào)用函數(shù),由于全局上是找不到這個(gè)函數(shù)洒嗤,所以無(wú)效箫荡。
所以這里我們可以將閉包改為全局變量即可,在JS函數(shù)中渔隶,聲明變量時(shí)不用var關(guān)鍵字羔挡,則它就是全局變量。代碼如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script> window.onload=function () { confirmdelete = function() { return window.confirm("你確定要?jiǎng)h除嗎间唉?"); } } </script> </head> <body> <?php echo "<a onclick='confirmdelete()'>刪除</a>"; ?> </body>
這樣也是同樣有效的绞灼。最后只好建議這位朋友在深入了解下JS的變量作用域和閉包等概念。
總結(jié):
有時(shí)困擾大牛的不是前面寬闊難以跨越的激流河道终吼,而是身上甩不掉的蒼蠅蚊蟲镀赌。鉆完牛角尖后氯哮,回過頭來發(fā)現(xiàn)問題原來如此簡(jiǎn)單际跪。是否日復(fù)一日地寫業(yè)務(wù)代碼寫的麻木了?是否發(fā)現(xiàn)天天刷怪升級(jí)喉钢,但技能點(diǎn)卻總提不上去姆打?不妨返璞歸真,溫故而知新肠虽。最近自己也深有感觸幔戏,越來越感受到最可怕的事情莫過于今天過的和昨天沒有不同。所以居安思危税课,每天都要改變闲延,每天都要有提升進(jìn)步痊剖。
![](http://blog.cnezsoft.com/1PZ2t6Hm43pKFF.gif)