iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0
Modern Web

30天每天寫網站系列 第 18

Day18-選取器應用_串接json檔

  • 分享至 

  • xImage
  •  

今天把昨天寫的選取器跟顯示東西做串接
首先先寫一個json,若會用firebase或App Script,也可以串接線上的
這邊做一個比較簡單的,是地區縣市分類
https://ithelp.ithome.com.tw/upload/images/20211003/20141991yfJhA1uVay.jpg
然後我們在昨天的選取器外面加一個div並設上id

<div id="show"></div>
<form>…</form>

然後進去JS,新增一個函式渲染新增json內容到畫面上
因為這邊只放文字上去,就不特別寫一個component了

function area() {
    $.get('area.json', function (response) {
        $.each(response, function (index, element) {
            for (i = 0; i < element.length; i++) {
                var area = element[i];
                $("#show").append(area + " ")
            }
        });
    }, 'json')
}

記得要在ready中使用他,然後就會顯示了
https://ithelp.ithome.com.tw/upload/images/20211003/2014199197GVomU0Sl.jpg
然後我們需要讓點擊input時會顯示有關的內容,需要在寫一個function讓點擊input時被呼叫
這邊的想法是,有一個陣列存取我們多選選到的內容,然後傳給剛剛寫的函式做選擇渲染
所以我們先在最外面(非任何函式內)新增一個陣列變數

var choosearea = new Array();

然後再寫一個函式

function choose(mychoose) {
    if (mychoose.checked) {
        choosearea.push(mychoose.id);
        if (mychoose.id == "CheckAll") {
            choosearea = []
        }
    }
    else {
        choosearea.splice(choosearea.indexOf(mychoose.id), 1)
    }
    area(choosearea)
}

如果選擇是"沒有任何多選(等於"全部"被選擇)"的話陣列會是空的,為了讓點擊"全部"時的陣列內容是一樣的,所以在"全部"被選擇時,直接讓陣列為空
這個函式作用是,若點擊的input是多選的,就把該input的ID新增或刪除至我們剛剛設好的陣列中,然後把它傳給我們剛剛寫好的area函式
這邊這個函示寫好後需要回到HTML分別加入各個input上,並要求點擊時要回傳input本身給函式,讓函式可以去抓取被點擊的是誰
這邊只放一個其他以此類推

<input type="radio" id="CheckAll" onclick="choose(this)" checked />

因為我們有傳參數給area函式,所以我們需要在area加上參數接收
然後運用index是否等於我們傳的內容來過濾新增的東西

function area(n) {
    $.get('area.json', function (response) {
        $.each(response, function (index, element) { 
            for (a = 0; a < n.length; a++) {
                if (index == n[a]) {
                    for (i = 0; i < element.length; i++) {
                        var area = element[i];
                        $("#show").append(area + " ")
                    }
                }
            } 
        });
    }, 'json')
}

然後我們這邊就能根據點擊的選項新增東西了
https://i.imgur.com/a2X2ewb.gif
恩因為內容是不斷新增,看不是很明顯,所以我們在area函式的第一行新增一個$("#show").empty(),讓函式開始渲染前先把show清空再新增
https://i.imgur.com/Ix9i2a3.gif
但這邊我們發現如果沒有任何多選(選擇是全部的話),沒有東西被顯示
因為此時陣列是空的,沒有東西可以顯示
所以我們要多設一個判別式,如果陣列為空,我們就顯示所有東西
寫法是去判別陣列長度,若長度為0則顯示全部,若不為0就根據陣列內容去顯示

function area(n) {
    $("#show").empty()
    $.get('area.json', function (response) {
        $.each(response, function (index, element) {
            if (n.length == 0) {
                for (i = 0; i < element.length; i++) {
                    var area = element[i];
                    $("#show").append(area + " ")
                }
            } else {
                for (a = 0; a < n.length; a++) {
                    if (index == n[a]) {
                        for (i = 0; i < element.length; i++) {
                            var area = element[i];
                            $("#show").append(area + " ")
                        }
                    }
                }
            }
        });
    }, 'json')
}

然後就完成選擇顯示啦!!
https://i.imgur.com/O8H4z4i.gif

然後多分享一個別人寫好的陣列remove()方法
我的寫法是先抓取到我們需要的東西在陣列的哪個位置
choosearea.indexOf(mychoose.id)

indexOf可以抓取使用的陣列中,指定內容在該陣列的位置(第幾項)

然後刪除指定陣列
choosearea.splice(choosearea.indexOf(mychoose.id), 1)

splice可以刪除使用的陣列中,指定位置(該項)的內容

若整個jquery會不斷用到刪除陣列內容的算式的話,可以考慮直接引入別人寫好的方法

Array.prototype.remove = function () {
    var what, a = arguments, L = a.length, ax;
    while (L && this.length) {
        what = a[--L];
        while ((ax = this.indexOf(what)) !== -1) {
            this.splice(ax, 1);
        }
    }
    return this;
}

然後choosearea.splice(choosearea.indexOf(mychoose.id), 1)就能直接用choosearea.remove(mychoose.id)替換掉了


上一篇
Day17-選取器_單選+多選
下一篇
Day19-Flex屬性_超簡單製作導覽列
系列文
30天每天寫網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言