成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JS面向?qū)ο缶幊虒?shí)現(xiàn)的Tab選項(xiàng)卡案例詳解

瀏覽:184日期:2024-05-22 15:27:56

本文實(shí)例講述了JS面向?qū)ο缶幊虒?shí)現(xiàn)的Tab選項(xiàng)卡。分享給大家供大家參考,具體如下:

Tab選項(xiàng)卡案例

JS面向?qū)ο缶幊虒?shí)現(xiàn)的Tab選項(xiàng)卡案例詳解

下面是一個(gè)簡(jiǎn)單面向過(guò)程的Tab選項(xiàng)卡。

<!DOCTYPE html><html><head> <style> #tabBox input { background: #F6F3F3; border: 1px solid #FF0000; } #tabBox .active { background: #E9D4D4; } #tabBox div { width:300px; height:250px; display:none; padding: 10px; background: #E9D4D4; border: 1px solid #FF0000; } </style> <meta charset='utf-8' /> <title>選項(xiàng)卡</title> <script> window.onload=function(){ var tabBox = document.getElementById(’tabBox’); var tabBtn = tabBox.getElementsByTagName(’input’); var tabDiv = tabBox.getElementsByTagName(’div’); for(var i=0;i<tabBtn.length;i++){tabBtn[i].index = i;tabBtn[i].onclick = function (){ for(var j=0;j<tabBtn.length;j++){ tabBtn[j].className=’’; tabDiv[j].style.display=’none’; } this.className=’active’; tabDiv[this.index].style.display=’block’;}; } }; </script></head> <body> <div id='tabBox'> <input type='button' value='主頁(yè)' /> <input type='button' value='說(shuō)說(shuō)' /> <input type='button' value='日志' /> <div style='display:block;'>這是主頁(yè)內(nèi)容</div> <div>這是說(shuō)說(shuō)內(nèi)容</div> <div>這是日志內(nèi)容</div> </div></body></html>

下面來(lái)慢慢改成面向?qū)ο蟮男问健?/p>

1.首先將嵌套的函數(shù)拿到window.onload外面,不能有函數(shù)嵌套,可以有全局變量。如下:所有的改寫最終效果都不變。

<script> //將在嵌套函數(shù)里的變量提取到全局中 var tabBtn = null; var tabDiv = null;window.onload = function(){ var tabBox = document.getElementById(’tabBox’); tabBtn = tabBox.getElementsByTagName(’input’); tabDiv = tabBox.getElementsByTagName(’div’); for(var i=0;i<tabBtn.length;i++){tabBtn[i].index = i;//此處調(diào)用函數(shù)即可tabBtn[i].onclick = clickBtn; } };//將嵌套函數(shù)提取到全局中 function clickBtn(){ for(var j=0;j<tabBtn.length;j++){tabBtn[j].className=’’;tabDiv[j].style.display=’none’; } this.className=’active’; tabDiv[this.index].style.display=’block’; }; </script>

2.將全局的變量變?yōu)閷?duì)象的屬性,全局的函數(shù)變?yōu)閷?duì)象的方法;將window.onload里的代碼提取到一個(gè)構(gòu)造函數(shù)里面,在window.onload里創(chuàng)建對(duì)象即可;(下面的代碼執(zhí)行起來(lái)是有問(wèn)題的)。

這里必須注意:在構(gòu)造函數(shù)Tab里的this跟之前this所代表的是不同的(此處是通過(guò)new來(lái)創(chuàng)建對(duì)象的);在上面的示例中,this指的是調(diào)用者;在構(gòu)造函數(shù)里,this指向的是var tab = new Tab() ,即tab這個(gè)對(duì)象,注意是對(duì)象。

說(shuō)一下這段代碼的問(wèn)題:我們?cè)赥ab的原型上添加clickBtn方法后,clickBtn方法里的this本應(yīng)該是指向var tab = new Tab()的,但是我們?cè)?this.tabBtn[i].onclick = this.clickBtn; 將clickBtn添加給了this.tabBtn[i],即input按鈕,clickBtn的所屬由Tab對(duì)象變成了input按鈕。

clickBtn的所屬變成input按鈕后,那么clickBtn里的this指向按鈕,那再來(lái)看clickBtn里的代碼,this.tabBtn、this.tabDiv,input按鈕里有這兩個(gè)屬性嗎?沒(méi)有,所以會(huì)出錯(cuò)!

JS面向?qū)ο缶幊虒?shí)現(xiàn)的Tab選項(xiàng)卡案例詳解JS面向?qū)ο缶幊虒?shí)現(xiàn)的Tab選項(xiàng)卡案例詳解

<script> window.onload = function(){ var tab = new Tab('tabBox'); } /** * 將之前window.onload里的代碼提到一個(gè)構(gòu)造函數(shù)里 * [可以將這個(gè)Tab構(gòu)造函數(shù)想象成一個(gè)Tab類] * @param {Object} id:選項(xiàng)卡id以參數(shù)的形式傳入 */ function Tab(id){ var tabBox = document.getElementById(id); //將之前的全局變量變?yōu)閷?duì)象的屬性 this.tabBtn = tabBox.getElementsByTagName(’input’); this.tabDiv = tabBox.getElementsByTagName(’div’); for(var i=0;i<this.tabBtn.length;i++){this.tabBtn[i].index = i;//此處這種方式調(diào)用函數(shù),已經(jīng)將clickBtn的所屬變成this.tabBtn[i]this.tabBtn[i].onclick = this.clickBtn; } }; //將之前的全局函數(shù)添加到構(gòu)造函數(shù)的原型里,作為對(duì)象的一個(gè)方法 Tab.prototype.clickBtn = function(){ alert(this); //HTMLInputElement for(var j=0;j<this.tabBtn.length;j++){this.tabBtn[j].className=’’;this.tabDiv[j].style.display=’none’; } this.className=’active’; this.tabDiv[this.index].style.display=’block’; }; </script>

3.將clickBtn的調(diào)用放在一個(gè)函數(shù)里,這樣就不會(huì)改變clickBtn的所屬了。alert(this);此時(shí)彈出的是一個(gè)Object,說(shuō)明clickBtn的所屬關(guān)系沒(méi)變,還是Tab對(duì)象。但是還有另一個(gè)問(wèn)題,此時(shí)clickBtn里的this指向tab對(duì)象,那么this.className、this.index,此處的this指的是tab對(duì)象,那么對(duì)象中有這兩個(gè)屬性嗎?沒(méi)有,還會(huì)出錯(cuò)!所以第4步繼續(xù)改造。

JS面向?qū)ο缶幊虒?shí)現(xiàn)的Tab選項(xiàng)卡案例詳解

window.onload = function(){ var tab = new Tab('tabBox'); } /** * 選項(xiàng)卡 * @param {Object} id:選項(xiàng)卡id */ function Tab(id){ var tabBox = document.getElementById(id); this.tabBtn = tabBox.getElementsByTagName(’input’); this.tabDiv = tabBox.getElementsByTagName(’div’); for(var i=0;i<this.tabBtn.length;i++){this.tabBtn[i].index = i;//將this保存成一個(gè)變量,就可以在下面代碼中調(diào)用對(duì)象的方法了var _this = this;//此處這種方式調(diào)用函數(shù),就不會(huì)改變clickBtn方法的所屬關(guān)系this.tabBtn[i].onclick = function(){ //注意此處不能直接使用this,this指向this.tabBtn[i] _this.clickBtn();}; } }; //點(diǎn)擊選項(xiàng)卡按鈕 Tab.prototype.clickBtn = function(){ alert(this); //Object for(var j=0;j<this.tabBtn.length;j++){this.tabBtn[j].className=’’;this.tabDiv[j].style.display=’none’; } this.className=’active’; this.tabDiv[this.index].style.display=’block’; };

4. 以參數(shù)的形式將點(diǎn)擊的按鈕傳入clickBtn中

window.onload = function(){ var tab = new Tab('tabBox'); } /** * 選項(xiàng)卡 * @param {Object} id:選項(xiàng)卡id */ function Tab(id){ var tabBox = document.getElementById(id); this.tabBtn = tabBox.getElementsByTagName(’input’); this.tabDiv = tabBox.getElementsByTagName(’div’); for(var i=0;i<this.tabBtn.length;i++){this.tabBtn[i].index = i;var _this = this;this.tabBtn[i].onclick = function(){ //注意參數(shù)this代表的是this.tabBtn[i],即input按鈕 _this.clickBtn(this);}; } }; //將點(diǎn)擊的按鈕以參數(shù)的形式傳入 Tab.prototype.clickBtn = function(btn){ for(var j=0;j<this.tabBtn.length;j++){this.tabBtn[j].className=’’;this.tabDiv[j].style.display=’none’; } btn.className=’active’; this.tabDiv[btn.index].style.display=’block’; };

5.最終版 —— 將代碼提取到一個(gè)單獨(dú)的js文件中,在用的時(shí)候引入即可。一般花大時(shí)間去寫一個(gè)面向?qū)ο蟮某绦颍褪菫榱四軌驈?fù)用,以及方便的使用。

Tab.js

/** * 選項(xiàng)卡 * @param {Object} id 選項(xiàng)卡id */function Tab(id){ var tabBox = document.getElementById(id); this.tabBtn = tabBox.getElementsByTagName(’input’); this.tabDiv = tabBox.getElementsByTagName(’div’); for(var i=0;i<this.tabBtn.length;i++){ this.tabBtn[i].index = i; var _this = this; this.tabBtn[i].onclick = function(){ _this.clickBtn(this); }; }};/** * 為Tab原型添加點(diǎn)擊選項(xiàng)卡方法 * @param {Object} btn 點(diǎn)擊的按鈕 */Tab.prototype.clickBtn = function(btn){ for(var j=0;j<this.tabBtn.length;j++){ this.tabBtn[j].className=’’; this.tabDiv[j].style.display=’none’; } btn.className=’active’; this.tabDiv[btn.index].style.display=’block’;};

使用:tab.html 可以看到使用的時(shí)候,就可以很簡(jiǎn)單的創(chuàng)建兩個(gè)選項(xiàng)卡出來(lái)了。

<!DOCTYPE html><html><head> <style> .tab input { background: #F6F3F3; border: 1px solid #FF0000; } .tab .active { background: #E9D4D4; } .tab div { width:300px; height:250px; display:none; padding: 10px; background: #E9D4D4; border: 1px solid #FF0000; } </style> <meta charset='utf-8' /> <title>選項(xiàng)卡</title> <!-- 引入tab.js --> <script type='text/javascript' src='http://www.piao2010.com/js/tab.js' ></script> <script> window.onload = function(){ var tab1 = new Tab('tabBox1'); var tab2 = new Tab('tabBox2'); } </script></head> <body> <div id='tabBox1'> <input type='button' value='主頁(yè)' /> <input type='button' value='說(shuō)說(shuō)' /> <input type='button' value='日志' /> <div style='display:block;'>這是主頁(yè)內(nèi)容</div> <div>這是說(shuō)說(shuō)內(nèi)容</div> <div>這是日志內(nèi)容</div> </div> <br /> <div id='tabBox2'> <input type='button' value='技術(shù)' /> <input type='button' value='工具' /> <input type='button' value='網(wǎng)站' /> <div style='display:block;'>Js、Vue</div> <div>VSCode</div> <div>CSDN</div> </div></body></html>

JS面向?qū)ο缶幊虒?shí)現(xiàn)的Tab選項(xiàng)卡案例詳解

再來(lái)簡(jiǎn)單總結(jié)一下JS面向?qū)ο笾械膖his,this一般會(huì)在兩種情況下出問(wèn)題,一是使用定時(shí)器、二是事件,從上面的例子中也可以看出來(lái)。注意下面的說(shuō)法是在構(gòu)造函數(shù)里哦,其它情況下,this指向的是調(diào)用者。

可以看到效果沒(méi)有將姓名顯示出來(lái),其實(shí)看到這里原因應(yīng)該很清楚了,就是第14行代碼中this.name,此處的this指向誰(shuí)?指向window,因?yàn)閟etInterval是屬于window的。

<!DOCTYPE html><html> <meta charset='UTF-8' /> <head> <script> function Person(name){this.name = name;//定時(shí)器setInterval(this.showName, 3000); } Person.prototype.showName = function(){alert(this); //windowalert('姓名:'+this.name); } var p1 = new Person('jiangzhou'); </script> </head></html>

解決辦法:上面例子中已經(jīng)列出來(lái)了,就是用一個(gè)function將要執(zhí)行的代碼包起來(lái),使其所屬關(guān)系不會(huì)發(fā)生變化,注意function里調(diào)用方法時(shí)使用的是外部變量’_this’。事件的處理在上面的例子中已經(jīng)說(shuō)明了。

function Person(name){ this.name = name; var _this = this; setInterval(function(){ this.showName(); }, 3000);}Person.prototype.showName = function(){ alert(this); //[Object Object] alert('姓名:'+this.name); //姓名:jianghzou} var p1 = new Person('jiangzhou');

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

標(biāo)簽: JavaScript
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
5566中文字幕一区二区电影 | 欧美一卡2卡3卡4卡| 日本亚洲欧美天堂免费| 夜久久久久久| 国产人成亚洲第一网站在线播放 | 国产一区二区成人久久免费影院| 日本电影亚洲天堂一区| 日韩综合小视频| 麻豆成人精品| 亚洲超碰精品一区二区| 国产精品视频| 亚洲国产视频网站| 国产偷久久久精品专区| 一区二区三区中文字幕在线观看| 亚洲精美视频| 亚洲精品国产一区二区精华液| 一本色道婷婷久久欧美| 亚洲一区在线观看免费观看电影高清| 亚洲区第一页| 一区二区久久久久久| 亚洲一区自拍| 天堂一区二区在线免费观看| 一本久道久久综合中文字幕| 日本成人在线看| 欧美日韩一区精品| 国产麻豆精品95视频| 欧美电视剧在线看免费| 国产99精品国产| 精品国产91九色蝌蚪| 色综合欧美在线视频区| 国产欧美一区二区在线| 伊人久久大香线蕉综合热线| 樱桃视频在线观看一区| 久久精品一本| 老司机精品视频在线| 91精品福利在线一区二区三区 | 日韩欧美国产一二三区| av毛片久久久久**hd| 久久免费国产精品| 一区在线视频观看| 亚洲va中文字幕| 欧美日韩中文另类| 欧美电影免费观看高清完整版在| 色综合久久88色综合天天6| 黄色av一区| 亚洲欧洲99久久| 欧美日韩国产经典色站一区二区三区| 欧美一卡二卡在线| 亚洲免费观看高清完整| 欧美不卡在线| 国产精品短视频| 日韩午夜黄色| 午夜亚洲激情| 欧美人xxxx| 日韩欧美一二三四区| 一区二区三区视频在线播放| 久久精品国产免费| 国产欧美精品日韩区二区麻豆天美| 精品视频免费看| 国产精品jizz在线观看美国| 久久91精品国产91久久小草| 国产福利91精品一区二区三区| 亚洲尤物视频在线| 亚洲五月六月丁香激情| 91网站黄www| 久久久综合激的五月天| 欧美日韩国产免费观看 | 亚洲第一会所有码转帖| 欧美久久久影院| 国产精品v欧美精品v日本精品动漫| 亚洲国产精品一区二区www在线| 欧美年轻男男videosbes| 欧美日韩精品| 三级欧美韩日大片在线看| 日韩一级黄色大片| 亚洲伦伦在线| 韩国欧美国产一区| 国产精品大尺度| 欧美年轻男男videosbes| 欧美日韩精品免费观看| 午夜成人在线视频| 精品福利一二区| 裸体丰满少妇做受久久99精品| 国产91精品露脸国语对白| 樱桃视频在线观看一区| 日韩三区在线观看| 亚洲综合日本| 99久久久国产精品免费蜜臀| 五月开心婷婷久久| 国产日本一区二区| 欧美体内she精高潮| 狠狠入ady亚洲精品| 精品一区二区三区免费| 国产精品夫妻自拍| 在线成人免费视频| 91久久久久| 成人手机在线视频| 亚洲成人免费电影| 久久精品人人做人人爽人人| 欧美在线视频日韩| 亚洲激情精品| 成人不卡免费av| 日韩影院精彩在线| 国产精品麻豆欧美日韩ww| 91麻豆精品国产91久久久| 亚洲一区区二区| 99re这里只有精品视频首页| 日本成人在线电影网| 自拍偷拍国产亚洲| 精品国产3级a| 欧美亚日韩国产aⅴ精品中极品| 精品96久久久久久中文字幕无| 国产又黄又大久久| 亚洲成av人综合在线观看| 欧美激情一区在线观看| 91精品国产一区二区三区香蕉| 亚洲一区三区视频在线观看| 欧美在线播放一区| 韩国精品久久久| 亚洲第一会所有码转帖| 国产精品美女久久久久久久| 欧美一级黄色片| 在线观看www91| 亚洲一区免费| 影音先锋亚洲电影| 成人性生交大片免费看中文| 免费人成网站在线观看欧美高清| 一区二区三区欧美久久| 国产精品无圣光一区二区| 日韩视频永久免费| 欧美亚洲综合另类| 免费视频一区| 亚洲人成久久| 欧美日韩一区二区国产| av一区二区三区在线| 紧缚奴在线一区二区三区| 三级久久三级久久| 亚洲精品videosex极品| 国产精品无码永久免费888| 亚洲精品一区二区三区精华液 | 中文字幕在线不卡| 久久久久久亚洲综合| 日韩午夜三级在线| 欧美图区在线视频| 蜜桃久久av| 国产欧美日韩伦理| 亚洲第一区色| 黄色成人精品网站| 欧美日韩国产探花| 欧美精品入口| 欧美xxx在线观看| 不卡电影一区二区三区| 国产91精品一区二区麻豆网站| 激情综合色综合久久| 免费观看30秒视频久久| 三级久久三级久久| 丝袜美腿亚洲色图| 亚洲成人激情综合网| 樱花草国产18久久久久| 亚洲六月丁香色婷婷综合久久| 亚洲欧洲日产国码二区| 中文欧美字幕免费| 国产精品美女一区二区三区 | 夜色激情一区二区| 亚洲女性喷水在线观看一区| 国产精品网站在线观看| 国产精品午夜电影| 国产精品免费看片| 成人免费小视频| 亚洲女同ⅹxx女同tv| 亚洲精选视频在线| 亚洲综合一二三区| 亚洲高清视频在线| 午夜久久久影院| 日产精品久久久久久久性色| 日本一道高清亚洲日美韩| 日本大胆欧美人术艺术动态| 奇米亚洲午夜久久精品| 精品一区二区三区的国产在线播放| 久久激情五月激情| 精品一区二区免费看| 国产精品一区二区久久精品爱涩| 国产成人日日夜夜| 成人激情文学综合网| 色综合天天性综合| 欧美性色综合| 亚洲人成免费| 久久福利精品| 欧美伊人精品成人久久综合97| 欧美日韩亚洲综合一区二区三区| 在线电影院国产精品| 日韩美女视频一区二区在线观看| 精品久久久影院| 国产色婷婷亚洲99精品小说| 国产精品久久久久久户外露出 | 国产a区久久久| 97se狠狠狠综合亚洲狠狠| 欧美网站在线| 亚洲伊人网站| 欧美亚洲综合网|