avalon.js 多级下拉框实现

学习avalon.js的时候,有一个多级下拉框的例子,地址 戳这里 代码实现了联动,

但是逻辑上面理解有点难度,获取选择的值 和 页面初始化 功能存在问题。

在写地图编辑的时候,也用到了多级下拉框,特地整理下例子,其中主要实现的难点就是初始化数组的值。

var data = [
    {"id": 0, "name": "1公司", "grade": -1, "parentid": "-1"},
    {"id": 1, "name": "广东公司", "grade": 0, "parentid": "0"},
    {"id": 2012300001, "name": "广州1分公司", "grade": 1, "parentid": 1},
    {"id": 200000000, "name": "广州分公司", "grade": 1, "parentid": 1},
    {"id": 4050, "name": "天河分公司", "grade": 2, "parentid": 200000000},
    {"id": 999182, "name": "工业园营销服务中心", "grade": 3, "parentid": 4050},
    {"id": 4174, "name": "南沙分公司", "grade": 2, "parentid": 200000000},
    {"id": 10121, "name": "南沙营销服务中心", "grade": 3, "parentid": 4174},
];
var MAIN_KEY;
var keyTree = {};
var keyMap = {};
for (var i = 0, len = data.length; i < len; i++) {
    var obj = data[i];
    var pId = obj.parentid;
    keyMap[obj.id] = obj;
    if (obj.parentid == -1) {
        MAIN_KEY = obj.id;
    } else {
        keyTree[pId] = keyTree[pId] || [];
        keyTree[pId].push(obj.id);
    }
}

var  noop =  function () {};
window.vmMultiSelect = avalon.define({
    $id: "multiSelect",
    areaShap: [MAIN_KEY, ""], //数据形式,一开始为根结点id,不显示下拉框, 最后一个为可选择下拉框,则为‘‘,当前选中值,则为最后不为‘‘的值
    selectchange: function(val, m) { //数据形变化时
        var index = m.args[0].$index;
        if (vmMultiSelect.isInitSelect(index) === false) return;
        var areas = vmMultiSelect.areaShap;
        for (var i = areas.length - 1, end = index; i > end; i--) {
            areas.removeAt(i);//清楚子孙
        }
        if (keyTree[val]) {
            areas.push("");//有儿子,则push""
        }
    },
    isInitSelect: noop,
    initSelect: function (val) {
        vmMultiSelect.areaShap = [0, "1", "200000000", "4050", ""];
        var len = vmMultiSelect.areaShap.length - 1;
        vmMultiSelect.isInitSelect = function (index) {
            console.log(index, len)
            if (index < len) {
                return false;//不响应selectchange
            } else {
                vmMultiSelect.isInitSelect = noop;//恢复响应selectchange
                return false;
            }
        }
    }
});
//vmMultiSelect.initSelect([0, "1", "200000000", "4050", ""]); 通过直接设置数据,初始化select(也可以再写个函数,自己组织成对应数据形式)

在线事例代码,戳这里

时间: 2024-12-19 08:16:40

avalon.js 多级下拉框实现的相关文章

用JS让下拉框改变网页背景颜色

<HTML> <HEAD> <TITLE>石家庄渣浆泵配件</TITLE> </HEAD> <SCRIPT> <!-- function bgChange(selObj) { newColor = selObj.options[selObj.selectedIndex].text; document.bgColor = newColor; selObj.selectedIndex = -1; } //--> </SC

Js获取下拉框选定项的值和文本

Js获取下拉框的值和文本网上提供了2种方法:但有些人很不负责任,他们根本没考虑到浏览器之间的差异导致的错误,导致很多新手琢磨了半天找不出错误! 下面我总结下Firefox和IE下获取下拉框选定项的值和文本: 1. IE和Firefox都支持的方法: 获取文本 var obj=document.getElementById('select_template'); var text=obj.options[obj.selectedIndex].text;//获取文本 var obj=document

js设置下拉框选中后change事件无效解决

下拉框部分代码: <select id="bigType"> <option value="">请选择</option> <option value="1">xiamen</option> <option value="2">beijing</option> </select> <select id="smallTy

快速解决js开发下拉框中blur与click冲突

在开发中我们会经常遇到blur和click冲突的情况.下面叙述了开发中常遇到的"下拉框"的问题,并提供了两种解决方案. 一.blur和click事件简述 blur事件:当元素失去焦点时触发blur事件:其为表单事件,blur和focus事件不会冒泡,其他表单事件都可以.click事件:当点击元素时触发click事件:所有元素都有此事件,会产生冒泡. 示例1:blur事件为表单事件 1 2 3 4 5 6 7 8 9 10 11 12 13 <input type="te

基于bootstrap-multiselect.js的下拉框联动

背景:当option特别多时,一般的下拉框选择起来就有点力不从心了,所以使用multiselect是个很好的选择,可以通过输入文字来选择选项很方便,但是有一个需要下拉框联动,网上找了半天才找到解决方法,在此分享一下 1.先引入 <script src="~/Assets/js/bootstrap-multiselect.min.js"></script> <link href="~/Assets/css/bootstrap-multiselect

js选中下拉框的默认选项

//这是修改时选中 $("#type").find("option[value='"+factory+"']").attr("selected",true); 以上代码为初始化页面的时候默认选中下拉框的某一项.

jquery把给定的json自动生成多级下拉框

<!DOCTYPE html><html><head><meta charset="UTF-8"><link href="public/bootstrap.css" rel="stylesheet"><link rel="icon" href=public/siyecao.png><script src="public/jquery-1.1

MVC+knocKout.js 实现下拉框级联

数据库:部门表和员工表 在控制器里面的操作: 1 public ActionResult Index3() 2 { 3 ViewBag.departments = new SelectList(getDepartments(),"d_id","d_name");//部门数据 4 return View(); 5 } 6 7 private List<department> getDepartments() 8 { 9 List<department

Js获取下拉框的值和文本select

$("#camera").change(function () {        var obj = this;        $("#camera_Name").val($("#camera option:selected").text());         $("#camera_Naming").val($(obj).val());      }); $("#teams option:selected"