当前位置:首页 > JavaScript

js 实现级联

2026-04-06 08:11:38JavaScript

级联实现方法

在JavaScript中实现级联功能通常涉及动态更新下拉菜单选项,基于前一个下拉菜单的选择。以下是常见的实现方式:

基于事件监听的方法

为父级下拉菜单添加change事件监听器,当值变化时动态更新子级下拉菜单内容:

document.getElementById('parentSelect').addEventListener('change', function() {
  const childSelect = document.getElementById('childSelect');
  childSelect.innerHTML = '';

  const selectedValue = this.value;
  if (selectedValue) {
    const options = getChildOptions(selectedValue);
    options.forEach(option => {
      childSelect.add(new Option(option.text, option.value));
    });
  }
});

function getChildOptions(parentValue) {
  // 这里可以是静态数据或AJAX请求
  const data = {
    'province1': [
      {value: 'city1', text: '城市1'},
      {value: 'city2', text: '城市2'}
    ],
    'province2': [
      {value: 'city3', text: '城市3'},
      {value: 'city4', text: '城市4'}
    ]
  };
  return data[parentValue] || [];
}

使用数据存储

对于复杂级联,可以预先加载所有数据到前端:

const cascadeData = {
  'country': {
    'CN': '中国',
    'US': '美国'
  },
  'province': {
    'CN': [
      {value: 'BJ', text: '北京'},
      {value: 'SH', text: '上海'}
    ],
    'US': [
      {value: 'NY', text: '纽约'},
      {value: 'CA', text: '加州'}
    ]
  }
};

function updateCascade(triggerElement, targetElementId, dataKey) {
  const selectedValue = triggerElement.value;
  const targetElement = document.getElementById(targetElementId);
  targetElement.innerHTML = '<option value="">请选择</option>';

  if (selectedValue && cascadeData[dataKey][selectedValue]) {
    cascadeData[dataKey][selectedValue].forEach(item => {
      targetElement.add(new Option(item.text, item.value));
    });
  }
}

AJAX动态加载

对于大数据量或实时性要求高的场景,可采用异步加载:

document.getElementById('parentSelect').addEventListener('change', function() {
  const childSelect = document.getElementById('childSelect');
  childSelect.disabled = true;
  childSelect.innerHTML = '<option value="">加载中...</option>';

  fetch(`/api/child-options?parent=${this.value}`)
    .then(response => response.json())
    .then(data => {
      childSelect.innerHTML = '';
      data.forEach(item => {
        childSelect.add(new Option(item.name, item.id));
      });
      childSelect.disabled = false;
    });
});

多层级联封装

封装可复用的级联组件:

js 实现级联

class CascadeSelect {
  constructor(config) {
    this.parent = document.getElementById(config.parentId);
    this.child = document.getElementById(config.childId);
    this.dataSource = config.dataSource;
    this.init();
  }

  init() {
    this.parent.addEventListener('change', () => this.updateChild());
    this.updateChild();
  }

  updateChild() {
    const selectedValue = this.parent.value;
    this.child.innerHTML = '';

    if (selectedValue) {
      const options = typeof this.dataSource === 'function' 
        ? this.dataSource(selectedValue) 
        : this.dataSource[selectedValue];

      options.forEach(opt => {
        this.child.add(new Option(opt.text, opt.value));
      });
    }
  }
}

// 使用示例
new CascadeSelect({
  parentId: 'country',
  childId: 'city',
  dataSource: {
    'CN': [{value: 'BJ', text: '北京'}],
    'US': [{value: 'NY', text: '纽约'}]
  }
});

注意事项

  1. 初始状态应禁用子级选择框,直到父级有选择
  2. 考虑添加加载状态提示,特别是异步加载时
  3. 对于多层级联,需要递归或循环处理各级关系
  4. 移动端需考虑触摸事件兼容性
  5. 大型数据集建议采用虚拟滚动或分页加载

以上方法可根据具体需求组合使用,静态数据适合选项较少的情况,动态加载适合数据量大或需要实时更新的场景。

标签: 级联js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…