999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

使用原生JavaScript實現Tab標簽切換的方法

2020-02-02 07:40:56李燕華
電子技術與軟件工程 2020年18期
關鍵詞:內容

李燕華

(北京市海淀區職工大學 北京市 100083)

Tab 標簽切換在網頁中常用在導航菜單、新聞分類、產品列表等欄目制作,應用十分廣泛。其實現的功能是:點擊不同的標簽名稱,顯示不同的欄目或內容列表。

1 Tab標簽切換的原理

Tab 標簽名稱和內容一一對應,所有標簽名稱樣式相同,平鋪顯示。各內容項大小、位置相同,任意時刻只有一項內容顯示在內容框中。頁面加載時第一個標簽名稱高亮顯示,第一項內容顯示在內容框中。點擊某一個標簽名稱,標簽名稱高亮顯示,其對應內容項顯示在內容框中[1]。如圖1、圖2所示。

2 HTML結構及CSS樣式設置

2.1 HTML結構

在html 結構中,分別設置一個存放Tab 標簽名稱的列表和一個存放具體內容的列表cont,內容列表cont 包含元素的個數和Tab標簽列表包含元素的個數相同、按照編號一一對應。本文案例采用4 個Tab 標簽進行切換,其html 結構部分代碼如下:

2.2 CSS樣式設置

Tab 標簽名稱樣式相同,并列平鋪,默認第一項標簽名稱高亮顯示;cont 列表中的元素大小和位置相同,只顯示第一項內容元素,其他內容元素隱藏。

圖1:頁面加載時

圖2:點擊標簽3

3 使用原生javaScript實現Tab標簽切換

Tab 標簽切換的邏輯很簡單,獲取Tab 標簽列表存放到數組變量list 中、內容列表存放到數組變量cont 中,然后為list 數組中的每個標簽元素添加點擊事件,點擊事件具體的任務有兩項操作:

(1)把當前點擊的標簽名稱高亮顯示,其他標簽名稱正常顯示;

(2)顯示當前點擊的標簽對應的內容元素,其他內容元素隱藏。

因為對所有Tab 標簽進行的操作相同,可以通過循環結構完成以上操作。對每個Tab 標簽添加的點擊事件,要檢測所有的標簽和內容元素,根據其編號和當前點擊的標簽編號是否相同進行樣式設置,所以點擊事件內部也需要一層循環結構。

3.1 常見錯誤分析

基于以上邏輯分析,有些程序員容易寫出以下Tab 標簽的交互代碼:

我們會發現以上代碼沒能實現Tab 標簽切換功能,通過打印循環控制變量i 的值會發現每次點擊Tab 標簽,i 的值都是4,原因點擊事件調用的函數訪問的是一個全局作用域的i,此時for 循環已經執行完畢,全局變量i=10;也就是說事件觸發之前外層循環已經執行完畢。

3.2 使用函數閉包實現Tab標簽切換

在ECMAScript 2015(ECMAScript 6)(后簡稱ES2015(ES6))之前,JavaScript 只有兩種作用域:全局變量與函數內的局部變量。在函數外聲明的變量作用域是全局的,全局變量在JavaScript 程序的任何地方都可以訪問。在函數內聲明的變量作用域是局部的(函數內),函數內使用 var 聲明的變量只能在函數內容訪問[2]。函數和對其周圍狀態(lexical environment,詞法環境)的引用捆綁在一起構成閉包(closure)。也就是說,閉包可以讓我們從內部函數訪問外部函數作用域。在 JavaScript 中,每當函數被創建,就會在函數生成時生成閉包[3]。此處我們需要使用使用JavaScript 函數閉包把外層循環控制變量i 的值“留住”,做法很簡單,就是讓數組中的每個函數有單獨的作用域,我們只要構造一個立即執行函數即可。[4]腳本中循環代碼如下:

通過把每個Tab 標簽的編號i 作為實參傳遞給匿名函數,閉包為每一個回調函數創建一個新的環境,把當前循環項的與事件回調相關聯起來,達到我們的預期目的。此處把循環控制變量i 的當前值與事件函數相關聯起來,點擊事件遍歷外層循環變量i,實現了Tab 標簽切換。

3.3 使用ES6 Let實現Tab標簽的切換

ES6 增加了塊級作用域的概念,ES6 新增加了兩個重要的JavaScript 關鍵字:let 和 const。其中let 聲明的變量只在 let 命令所在的代碼塊內有效,即let 聲明的變量只在 let 命令所在的代碼塊{}內有效,在{}之外不能訪問。閉包可以為每一個回調函數創建一個新的環境,把當前循環項的與事件回調相關聯起來,達到我們的預期目的。使用let 改進Tab 標簽切換的腳本代碼如下:

在外層循環中增加語句:let Tab=i,把外層循環控制變量i 的值賦給塊級變量Tab。代碼for 循環之后的{}是塊級作用域,每次循環函數引用的是其對應塊作用域的變量Tab。由于Tab 只能由循環體中的語句改變,這樣就把循環控制變量即每個標簽編號i 的值鎖住了,從而點擊事件能對每個標簽進行操作判斷和相應操作,實現了Tab 標簽切換。

4 總結

閉包是JavaScript 中一個比較難理解的概念,但是它允許將函數與其所操作的某些數據(環境)關聯起來。在 Web 中,我們所寫的 JavaScript 代碼大部分是基于事件的。定義某種行為,然后將其添加到用戶觸發的事件之上(比如點擊或者按鍵),即為響應事件而執行的函數,閉包幫我們解決了以上問題。但是閉包在處理速度和內存消耗方面對腳本性能具有負面影響。

ES6 引入塊級作用域之后解決了javaScript 變量作用域的限制問題。使用let 很容易實現for 循環和基于事件的javaScript 代碼等功能,也更方便我們書寫和理解代碼。不需要像閉包那樣為每個閉包創建一個資源棧區,節省了內存消耗,提高了處理速度。

隨著前端技術的發展,大多前端框架都封裝了Tab 標簽切換等常見頁面效果,但是作為前端開發技術員,需要掌握好javaScript技術,深入理解JavaScript 的交互處理邏輯,只有這樣才能創建一個好的前端架構,保證代碼的質量。

猜你喜歡
內容
內容回顧溫故知新
科學大眾(2022年11期)2022-06-21 09:20:52
內容回顧 溫故知新
科學大眾(2021年21期)2022-01-18 05:53:48
內容回顧溫故知新
科學大眾(2021年17期)2021-10-14 08:34:02
內容回顧溫故知新
科學大眾(2021年19期)2021-10-14 08:33:02
內容回顧 溫故知新
科學大眾(2021年9期)2021-07-16 07:02:52
內容回顧 溫故知新
科學大眾(2020年23期)2021-01-18 03:09:18
內容回顧 溫故知新
科學大眾(2020年17期)2020-10-27 02:49:04
引言的內容
引言的內容
主要內容
臺聲(2016年2期)2016-09-16 01:06:53
主站蜘蛛池模板: 99视频只有精品| 97成人在线视频| 在线日韩一区二区| 欧美自拍另类欧美综合图区| 亚洲AV一二三区无码AV蜜桃| 国产黄在线免费观看| A级全黄试看30分钟小视频| 亚洲不卡网| 爆乳熟妇一区二区三区| 国产v精品成人免费视频71pao | 欧美一级视频免费| 亚洲国模精品一区| 一本大道香蕉久中文在线播放| 亚洲大学生视频在线播放| 亚洲AV无码不卡无码| 日韩123欧美字幕| 国产第一福利影院| 亚洲欧美日韩综合二区三区| 亚洲无码久久久久| 欧美一区福利| 丰满的熟女一区二区三区l| 免费人成在线观看视频色| 亚洲AV无码久久精品色欲| 天天摸天天操免费播放小视频| 国产黄色免费看| a在线亚洲男人的天堂试看| 日韩无码视频网站| 精品国产香蕉在线播出| 国产av剧情无码精品色午夜| 国产成人亚洲综合A∨在线播放| 一级毛片免费播放视频| 在线观看91香蕉国产免费| 亚洲国产亚洲综合在线尤物| www亚洲天堂| 成人午夜免费观看| 国产中文一区a级毛片视频 | 欧美一级特黄aaaaaa在线看片| 麻豆精品视频在线原创| 中文字幕啪啪| 亚洲国产精品无码AV| 91精品综合| 亚洲最新地址| 国产草草影院18成年视频| 日韩av无码精品专区| 成人国产小视频| 国产三级韩国三级理| 真实国产乱子伦视频| 青青青视频免费一区二区| 亚洲人成日本在线观看| 亚洲精品午夜天堂网页| 欧美一区二区自偷自拍视频| 久久亚洲天堂| 多人乱p欧美在线观看| 夜夜操国产| 国产精品永久免费嫩草研究院| 自慰网址在线观看| 永久免费无码成人网站| 91精品国产麻豆国产自产在线 | 欧美专区在线观看| 色网站免费在线观看| 伊人激情综合网| 手机精品视频在线观看免费| 欧美在线精品怡红院| 亚洲av综合网| 99成人在线观看| 国产精品网址在线观看你懂的| 亚洲国产欧美国产综合久久 | 九色视频在线免费观看| 97国产在线播放| 亚州AV秘 一区二区三区| 99热这里只有精品国产99| 一级片一区| 国产黄网永久免费| 99久久国产精品无码| 午夜视频免费一区二区在线看| 秋霞一区二区三区| 又大又硬又爽免费视频| 国产在线欧美| 亚洲综合片| 毛片基地美国正在播放亚洲| 中文字幕亚洲无线码一区女同| 欧美综合中文字幕久久|