29_用js實(shí)現(xiàn)一個(gè)省市級(jí)聯(lián)效果

一岳掐、JavaScript 省市級(jí)聯(lián)效果

1饭耳、代碼

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>用js實(shí)現(xiàn)一個(gè)省市級(jí)聯(lián)效果</title>
</head>
<body>
    <select id="prov">
      <option value="none">請(qǐng)選擇省</option>
    </select>
    <select id="city" style="display:none"></select>
</body>
<script>
var provs={ 
  "江西省":["南昌市", "景德鎮(zhèn)", "九江", "鷹潭", "萍鄉(xiāng)", "新馀", "贛州", "吉安", "宜春", "撫州", "上饒"],
  "福建省":["福州", "廈門", "莆田", "三明", "泉州", "漳州", "南平", "龍巖", "寧德"],
  "河北省":["石家莊", "邯鄲", "邢臺(tái)", "保定", "張家口", "承德", "廊坊", "唐山", "秦皇島", "滄州", "衡水"]
};
function loadProv() {
  var prov = document.getElementById("prov");
  for (var key in provs) {
    var provName = key;
    var optProv = document.createElement("option");
    optProv.value = provName;
    optProv.innerText = provName;
    prov.appendChild(optProv);
  }
}
function provChange() {
  var prov = document.getElementById("prov");
  var city = document.getElementById("city");
  var provName = prov.value;
  
  if (provName == "none") {
    city.style.display = "none";
    return;
  }
  else {
    city.style.display = "";
  }
  var citys = provs[provName];
  
  for (var index = city.childNodes.length - 1; index >= 0; index--) {
    var child = city.childNodes[index];
    city.removeChild(child);
  }
    
  for (var index = 0; index < citys.length; index++) {
    var optCity = document.createElement("option");
    optCity.value = citys[index];
    optCity.innerText = citys[index];
    city.appendChild(optCity);
  }
}
window.onload=function(){
  loadProv();
  var prov = document.getElementById("prov");
  prov.onchange=function(){provChange()}
}
</script>
</html>

2串述、代碼注釋

(1)var provs={}寞肖,存儲(chǔ)省市的json結(jié)構(gòu)數(shù)據(jù)剖煌。

(2)function loadProv() {},此函數(shù)實(shí)現(xiàn)了初始化頁面加載數(shù)據(jù)的功能耕姊。

(3)var prov = document.getElementById("prov"),獲取存放省份的select下拉菜單茉兰。

(4)for (var key in provs)尤泽,遍歷json結(jié)構(gòu)數(shù)據(jù)规脸。

(5)var provName = key坯约,獲取省份的名稱莫鸭。

(6)var optProv = document.createElement("option")闹丐,創(chuàng)建一個(gè)option元素對(duì)象被因。

(7)optProv.value = provName卿拴,設(shè)置option元素的value屬性值梨与。

(8)optProv.innerText = provName堕花,設(shè)置option顯示的文本內(nèi)容粥鞋。

(9)prov.appendChild(optProv)缘挽,將option元素添加到select下拉菜單呻粹。

(10)function provChange() {}壕曼,作為onchange事件處理函數(shù)等浊。

(11)var prov = document.getElementById("prov"),獲取省份下拉菜單窝稿。

(12)var city = document.getElementById("city"),獲取城市下拉菜單凿掂。

(13)var provName = prov.value,獲取當(dāng)前選中的省份的value值纹蝴。

(14)if (provName == "none") {

city.style.display = "none";

return;

},如果值等于none塘安,說明選中的是第一項(xiàng),那么城市下拉菜單還是具有隱藏狀態(tài)兼犯,并跳出函數(shù)忍捡。

(15)else {

city.style.display = "";

},否則的話顯示出城市下拉菜單,默認(rèn)狀態(tài)它是隱藏的砸脊。

(16)var citys = provs[provName]具篇,獲取城市凌埂,citys是個(gè)數(shù)組驱显。

(17)for (var index = city.childNodes.length - 1; index >= 0; index--) {

var child = city.childNodes[index];

city.removeChild(child);

}瞳抓,遍歷城市下拉菜單下的option元素埃疫,然后刪除這些元素孩哑。

之所以清空就是為了防止當(dāng)再次加載的時(shí)候出現(xiàn)累加情況栓霜。

(18)for (var index = 0; index < citys.length; index++) {}横蜒,遍歷數(shù)組中的元素胳蛮,也就是城市愁铺。

(19)var optCity = document.createElement("option")鹰霍,創(chuàng)建option元素茵乱。

(20)optCity.value = citys[index]茂洒,設(shè)置option元素的value值瓶竭。

(21)optCity.innerText = citys[index]督勺,設(shè)置option元素的文本內(nèi)容斤贰。

(22)city.appendChild(optCity)智哀,將option元素添加select下拉菜單荧恍。

二瓷叫、js遞歸算法實(shí)現(xiàn)無限級(jí)樹形菜單

效果圖

image

數(shù)據(jù)類型一

1送巡、mysql表結(jié)構(gòu)形式數(shù)據(jù)

var data = [
    { id: 1, name: '廣東', pid: 0 },
    { id: 2, name: '廣州', pid: 1 },
    { id: 3, name: '天河', pid: 2 },
    { id: 4, name: '白云', pid: 2 },
    { id: 5, name: '廣西', pid: 0 },
    { id: 6, name: '玉林', pid: 5 },
    { id: 7, name: '北流', pid: 6 },
    { id: 8, name: '深圳', pid: 1 },
    { id: 9, name: '東莞', pid: 1 },
    { id: 10, name: '松山湖', pid: 9 },
]

2摹菠、js實(shí)現(xiàn)部分

var menu = '';
menuFn(0, data)
$("body").append(menu)

function menuFn(id, data) {
    if (data.length > 0) {
        for (var i = 0; i < data.length; i++) { //獲取省一級(jí)
            if (data[i].pid == id) {
                // console.log(data[i])
                menu += "<ul>"
                    menu += "<li>" + data[i].name
                    // menu += "<li>"+"id::" + data[i].id + ",name:"+ data[i].name + ",pid:"+ data[i].pid
                    menuFn(data[i].id, data)   //遞歸
                    menu += "</li>"
                menu += "</ul>"
            }
        }
        return menu;
    }
}

數(shù)據(jù)類型二

1骗爆、json結(jié)構(gòu)形式數(shù)據(jù)

var data = [
    {
        id: 1, name: "廣東", pid: 0,
        children: [
            {
                id: 2, name: "廣州", pid: 1,
                children: [
                    { id: 3, name: "天河", pid: 2 },
                    { id: 4, name: "白云", pid: 2 },
                ],
            },
            { id: 8, name: "深圳", pid: 1 },
            {
                id: 9, name: "東莞", pid: 1,
                children: [
                    { id: 10, name: "松山湖", pid: 9 },
                ]
            },
        ]
    },
    {
        id: 5, name: "廣西", pid: 0,
        children: [
            {
                id: 6, name: "玉林", pid: 5,
                children: [
                    { id: 7, name: "北流", pid: 6 },
                ]
            },
        ]
    },
];

2、js實(shí)現(xiàn)

var menu = '';
menuFn(0, data)
$("body").append(menu)

function menuFn(id, data) {
    if (data.length > 0) {
        for (var i = 0; i < data.length; i++) { //獲取省一級(jí)
            if (data[i].pid == id) {
                // console.log(data[i])
                menu += "<ul>"
                menu += "<li>" + data[i].name
                // menu += "<li>"+"id::" + data[i].id + ",name:"+ data[i].name + ",pid:"+ data[i].pid
                if (data[i].children) {
                    menuFn(data[i].id, data[i].children)   //遞歸
                }

                menu += "</li>"
                menu += "</ul>"
            }
        }
        return menu;
    }
}

兩者區(qū)別

數(shù)據(jù)表形式數(shù)據(jù)

menuFn(data[i].id, data)   //遞歸

json形式數(shù)據(jù)

if (data[i].children) {
    menuFn(data[i].id, data[i].children)   //遞歸
}

多級(jí)折疊菜單

效果圖

image

說明

this指向

function fn() {
   // console.log(this)  //span   em
}
$("#app").delegate("span", "click", fn)
$("#app").delegate("em", "click", fn)

兩者區(qū)別

$(this).parent().children("ul")[0]
$($(this).parent().children("ul")[0])
image

代碼

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<style>
    ul,
    li {
        list-style: none;
    }
 
    li {
        position: relative;
        line-height: 30px;
        padding-left: 20px
    }
 
    em {
        position: absolute;
        top: 7px;
        left: 0;
        width: 16px;
        height: 16px;
        background: url("jian.png") no-repeat;
        cursor: pointer;
        background-size: 16px 16px;
    }
    em.open{
        background: url("jia.png") no-repeat;
        background-size: 16px 16px;
    }
</style>
 
<body>
<div id="app"></div>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script>
    $(function () {
        var data = [
            {
                id: 1, name: "廣東", pid: 0,
                children: [
                    {
                        id: 2, name: "廣州", pid: 1,
                        children: [
                            { id: 3, name: "天河", pid: 2 },
                            { id: 4, name: "白云", pid: 2 },
                        ],
                    },
                    { id: 8, name: "深圳", pid: 1 },
                    {
                        id: 9, name: "東莞", pid: 1,
                        children: [
                            { id: 10, name: "松山湖", pid: 9 },
                        ]
                    },
                ]
            },
            {
                id: 5, name: "廣西", pid: 0,
                children: [
                    {
                        id: 6, name: "玉林", pid: 5,
                        children: [
                            { id: 7, name: "北流", pid: 6 },
                        ]
                    },
                ]
            },
        ];

        var menu = '';
        menuFn(0, data)
        $("#app").append(menu)

        function menuFn(id, data) {
            if (data.length > 0) {
                menu += "<ul>"
                for (var i = 0; i < data.length; i++) { //獲取省一級(jí)
                    if (data[i].pid == id) {
                        menu += "<li>"
                        if(data[i].children){
                            menu += '<em></em><span>' + data[i].name + "</span>"
                            menuFn(data[i].id, data[i].children)   //遞歸
                        }else{
                            menu += '<span>' + data[i].name + "</span>"
                        }
                        menu += "</li>"

                    }
                }
                menu += "</ul>"
                return menu;
            }
        }

        function fn() {
            var ull = $($(this).parent().children("ul")[0]);
            if (ull.length > 0) {
                ull.toggle();
                $(this).toggleClass("open")
            }
        }
        $("#app").delegate("span", "click", fn)
        $("#app").delegate("em", "click", fn)
    })
</script>
</body>

</html>

自定義修改樹狀數(shù)據(jù)

function formatTree(data) {
  const treeData = []
  data.forEach((list) => {
    const newData = {}
    newData.key = list.id
    newData.value = list.id
    newData.title = list.name
    newData.children = list.children ? formatTree(list.children) : [] 
    treeData.push(newData)
  })
  return treeData
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末煮寡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子幸撕,更是在濱河造成了極大的恐慌薇组,老刑警劉巖杈帐,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件体箕,死亡現(xiàn)場(chǎng)離奇詭異挑童,居然都是意外死亡累铅,警方通過查閱死者的電腦和手機(jī)站叼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門娃兽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尽楔,“玉大人投储,你說我怎么就攤上這事÷贶瘢” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵呕寝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我下梢,道長(zhǎng)客蹋,這世上最難降的妖魔是什么孽江? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任讶坯,我火速辦了婚禮岗屏,結(jié)果婚禮上辆琅,老公的妹妹穿的比我還像新娘这刷。我一直安慰自己婉烟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撞牢,像睡著了一般率碾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上所宰,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音仔粥,去河邊找鬼婴谱。 笑死躯泰,一個(gè)胖子當(dāng)著我的面吹牛谭羔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘟裸,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼诵竭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卵慰,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎裳朋,沒想到半個(gè)月后病线,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體再扭,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氧苍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年泛范,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了让虐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赡突,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出区赵,到底是詐尸還是另有隱情,我是刑警寧澤笼才,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布漱受,位于F島的核電站骡送,受9級(jí)特大地震影響昂羡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虐先,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一怨愤、第九天 我趴在偏房一處隱蔽的房頂上張望蛹批。 院中可真熱鬧撰洗,春花似錦、人聲如沸差导。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至埠对,卻和暖如春络断,著一層夾襖步出監(jiān)牢的瞬間项玛,已是汗流浹背貌笨。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锥惋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓开伏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親固灵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捅伤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容