2021-11-24

數組方法應用案例

案例要求

target.png

目標:通過頂部的輸入框和按鈕來篩選后端傳送的數據并顯示在頁面上

案例分析

HTML部分

首先用一個大div盒子將所有的東西裝起來

盒子內部分為上下兩部分:篩選 + 結果展示,分別用兩個div盒子裝起來。

篩選部分包含一個input輸入框,和三個按鈕。按鈕用三個span標簽。

結果展示部分每一條信息用一個li標簽展示,li標簽內部包含一個img標簽和兩個p標簽

CSS部分

  1. 整體在頁面中顯示的位置和大小
  2. 篩選部分中輸入框大小、間距、按鈕顏色、被選中的狀態
  3. 結果展示圖片大小、位置、文字大小、顏色

JS部分

當通過HTML和CSS將靜態頁面的展示效果做好并滿足要求之后,開始JS部分

  1. 默認狀態下將顯示所有人員信息。通過foreach將數組數據遍歷并顯示在頁面showMessage
  2. 檢測input輸入的內容,與人員姓名進行比對filterArrByText,將符合要求的數據顯示在頁面showMessage。用到的數組方法filter
  3. 點擊按鈕,與人員性別進行比對filterArrBySex,將符合條件的人員信息在頁面顯示出來showMessage
  4. 符合條件下的信息顯示。
    • 先通過文本篩選并顯示,然后再次基礎山篩選性別
    • 先通過性別篩選,然后通過文本復合篩選

案例實踐

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="css/index.css">
</head>
<body>
    <!-- wrapper包含了所有內容,方便設置整體在頁面中的位置,和基本樣式 -->
    <div class="wrapper">
        <!-- 篩選部分 -->
        <div class="filterFunc">
            <input type="text" id="demo"></input>
            <span class="btn" sex='m'>Male</span>
            <span class="btn" sex='f'>Female</span>
            <span class="btn active" sex='a'>All</span>
        </div>
        <!-- sex為自定義屬性 -->
    
        <!-- 列表展示部分 -->
        <div class="friendList">
            <ul>
                <!-- 具體展示部分,在項目實施開始階段實施,便于配合CSS設置樣式,
                    以此判斷是否復合要求,在靜態頁面完成之后注釋掉 -->
                <!-- <li>
                    <img src="src/01.jfif" alt="">
                    <p class="name">15644gsgf</p>
                    <p class="des">15644gsgf</p>
                </li>
                <li>
                    <img src="src/02.jfif" alt="">
                    <p class="name">15644gsgf</p>
                    <p class="des">15644gsgf</p>
                </li>
                <li>
                    <img src="src/03.jfif" alt="">
                    <p class="name">15644gsgf</p>
                    <p class="des">15644gsgf</p>
                </li>
                <li>
                    <img src="src/04.jfif" alt="">
                    <p class="name">15644gsgf</p>
                    <p class="des">15644gsgf</p>
                </li>
                <li>
                    <img src="src/05.jfif" alt="">
                    <p class="name">15644gsgf</p>
                    <p class="des">15644gsgf</p>
                </li> -->
            </ul>
        </div>
    </div>
    <script src="js/index.js"></script>
</body>
</html>

CSS

/* reset style */
*{
    margin: 0;
    padding: 0;
    list-style: none;
}

/* filterFunc style*/
.wrapper{
    width: 400px;
    margin: 100px auto 0px;
    border: 1px solid #000;
    border-radius: 5px;
    padding: 10px;
    background-color: #f4f4f4;
}
.wrapper .filterFunc{
    margin-bottom: 10px;
}
.wrapper .filterFunc input{
    width: 220px;
    height: 15px;
    border-radius: 5px;
    padding:5px;
    outline: none;
}
.wrapper .filterFunc .btn{
    color: #4171f2;
    padding: 5px;
    cursor: pointer;
}
.wrapper .filterFunc .active{
    color: azure;
    background-color: #4171f2;
    border-radius: 5px;
}

/* friendList style */
.friendList ul li{
    border-bottom: 1px solid gray;
    position: relative;
    padding: 5px 0 5px 50px;
}
.friendList ul li img{
    width: 40px;
    height: 40px;
    position: absolute;
    left: 0;
    top: 5px;
}
.friendList ul li .des{
    font-size: 10px;
    color: gray;
    margin-top: 3px;
}

JS

var personArr = [
    { name: '張三', sex: 'm', age: 18,des: '別叫我張三',src:'src/00.jfif'},
    { name: '王二', sex: 'f', age: 22,des: '別叫我李四',src:'src/01.jfif'},
    { name: '李四', sex: 'm', age: 28,des: '別叫我王二',src:'src/02.jfif'},
    { name: '李四兒', sex: 'm', age: 28,des: '別叫我王二',src:'src/05.jfif'},
    { name: '麻子', sex: 'f', age: 46,des: '叫我大帥比',src:'src/03.jfif'},
    { name: '小麻子', sex: 'm', age: 16,des: '人家是小美女啦',src:'src/04.jfif'}
];
var oUl = document.getElementsByClassName('friendList')[0].getElementsByTagName('ul')[0];
var btnText = {
    text: '',
    sex: 'a'
}//存儲輸入的文本和按鈕的sex屬性值,便于進行符合篩選,默認text為空串,sex為a,即顯示全部

//向頁面添加信息
function showMessage(data){
    var htmlStr = '';
    data.forEach(function(ele,index,self){
        htmlStr +='<li><img src=' + ele.src + '><p class="name">' + ele.name + '</p><p class="des">' + ele.des + '</p></li>'
    })
    oUl.innerHTML = htmlStr;
}
showMessage(personArr);

//獲取輸入文本信息
var oInput = document.getElementsByTagName('input')[0];
function filterArrByText(data,text){//通過輸入的文本篩選,返回篩選后的數組
    // 如果text為空就不遍歷,提高性能
    if(!text){
        return data;
    }
    return data.filter(function(ele,index,self){
        return ele.name.indexOf(text) != -1;
    });
    // 通過indexOf方法判斷name中是否含有輸入的文本,這個方法比較low,
    // 只能判斷text是否為name非空子集
    // 后續可以寫一個方法,只要text中含有和name中相同的關鍵字就返回true
    //即取交集
}

    //綁定輸入事件
oInput.oninput = function(){
    //當用戶輸入信息時調用方法filterArrByText
    var filterArr = filterArrByText(personArr,this.value);
    btnText.text = this.value;//將輸入的文本更新至全局
    showMessage(filterArrBySex(filterArr,btnText.sex));
    //這里將得到的數組再根據sex篩選一次,將結果展示到頁面
}
// 獲取btn按鈕,綁定事件
var btnObj = document.getElementsByClassName('btn');
btnArr = [].slice.call(btnObj,0);//通過數組的slice方法將類數組轉化為數組
var lastActiveBtn = btnArr[btnArr.length - 1];//默認選中最后一個按鈕


//給每個按鈕綁定鼠標單擊事件
btnArr.forEach(function(ele,index){
    ele.onclick = function(){
        // console.log(ele)
        setActive(this);
        var sex = ele.getAttribute('sex');//獲取自定義屬性值
        btnText.sex = sex;//更新全局sex,便于符合篩選
        var filterArr = filterArrBySex(personArr,sex);
        showMessage(filterArrByText(filterArr,btnText.text));
    };
})
//設置按鈕選中樣式
function setActive(obj){
    obj.className = 'btn active';//單擊按鈕更改選中樣式
    lastActiveBtn.className = 'btn';//清除原有樣式
    lastActiveBtn = obj;//將選中按鈕設置為上一個選中按鈕,便于下一次清除樣式
}

// 通過btnSex篩選
function filterArrBySex(data,sex){
    if(sex == 'a'){
        return data;
    }
    return data.filter(function(ele,index){
        return ele.sex == sex;
    })
}

總結

通過前兩天對數組方法的學習,有了很大的收獲。在本次實例練習中,發現了幾個問題:

  1. 不知道如何獲取input標簽輸入的值
  2. 不知道如何將類數組對象轉化為數組(其實也并不清楚為什么獲得的是一個類數組對象)
  3. 如何獲取DOM元素,怎么得到各屬性的值,怎么更改屬性值(能不能更改屬性值 ),怎么添加屬性以及屬性值?DOM和BOM元素的操作這塊兒比較弱,還需要再學習學習。

堅持學習!加油!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容

  • 排序算法 sort()方法,用于對數組排序 注意:該排序方法,是根據數組中,每一個元素首字符的unicode編碼進...
    晚_f2a9閱讀 197評論 0 0
  • 前言 面試題中有一些一般性的問題,通常是會問到的。面試iOS應聘者時,切入點很重要,不同的切入點會導致不同的結果,...
    雙子末音閱讀 202評論 0 0
  • 對象,即一組數據的有規律,有屬性方法的集合,從構成來看有兩組構成方式:字面量,和New構造, let singer...
    青木樹海閱讀 248評論 0 0
  • 1、concat()方法,用于合并兩個或多個數組,返回一個全新的數組 2、copyWithin()方法,從數組的指...
    熱心市民馮先生_80c2閱讀 162評論 0 0
  • 五、多重循環 在二重循環中,外層循環變量變化一次,內層循環變量變化整個 代碼: <!DOCTYPE html> ...
    默默_01cf閱讀 216評論 0 0