JS原生双栏穿梭选择框的实现示例

要实现一个JS原生的双栏穿梭选择框,我们需要做如下的步骤:

步骤一:准备HTML结构

首先,我们需要创建一个HTML结构,包含两个选择框和一些操作按钮。示例如下:

<div class="transfer-container">
  <div class="transfer-left">
    <h2>待选择项目</h2>
    <select multiple></select>
  </div>
  <div class="transfer-buttons">
    <button>&gt;</button>
    <button>&lt;</button>
  </div>
  <div class="transfer-right">
    <h2>已选择项目</h2>
    <select multiple></select>
  </div>
</div>

其中,.transfer-container是整个选择框的容器,.transfer-left.transfer-right分别是左侧和右侧的选择框容器,.transfer-buttons是操作按钮的容器,按钮可以控制选择框中选项的移动。

步骤二:填充选项

接下来,我们需要使用JavaScript动态地填充左侧的选择框。示例代码如下:

const leftSelect = document.querySelector('.transfer-left select');

const options = [
  { text: '选项一', value: '1' },
  { text: '选项二', value: '2' },
  { text: '选项三', value: '3' },
  { text: '选项四', value: '4' },
  { text: '选项五', value: '5' },
];

options.forEach(option => {
  const { text, value } = option;
  const optionElement = document.createElement('option');
  optionElement.text = text;
  optionElement.value = value;
  leftSelect.add(optionElement);
});

我们首先获取左侧选择框的DOM元素,然后定义一个包含选项内容的数组,最后使用forEach方法遍历数组中的每个选项,为左侧选择框创建对应的option元素,最终添加到左侧选择框中。

步骤三:实现选项移动

我们需要为“>”和“<”按钮添加事件处理函数,实现选项的移动。示例代码如下:

const buttons = document.querySelectorAll('.transfer-buttons button');
const leftSelect = document.querySelector('.transfer-left select');
const rightSelect = document.querySelector('.transfer-right select');

buttons[0].addEventListener('click', () => {
  const selectedOptions = Array.from(leftSelect.selectedOptions);
  selectedOptions.forEach(option => {
    const newOption = option.cloneNode(true);
    leftSelect.remove(option);
    rightSelect.add(newOption);
  });
});

buttons[1].addEventListener('click', () => {
  const selectedOptions = Array.from(rightSelect.selectedOptions);
  selectedOptions.forEach(option => {
    const newOption = option.cloneNode(true);
    rightSelect.remove(option);
    leftSelect.add(newOption);
  });
});

我们首先获取两个选择框的DOM元素,以及按钮的DOM元素。然后为按钮添加事件处理函数,分别处理“>”和“<”按钮的点击事件。

对于“>”按钮来说,我们首先获取左侧选择框中被选中的选项,然后对每个选项进行循环,创建一个新的option元素,并将其添加到右侧选择框中。最后,从左侧选择框中移除该选项。

对于“<”按钮来说,操作类似,“<”按钮的事件处理函数也是类似的。我们首先获取右侧选择框中被选中的选项,然后对每个选项进行循环,创建一个新的option元素,并将其添加到左侧选择框中。最后,从右侧选择框中移除该选项。

示例1

假设我们需要使用一个双栏选择框,用于选择多项技能,可以将选中的技能添加到右侧的选择框中,以便后续的操作。以下是示例代码:

HTML结构:

<div class="transfer-container">
  <div class="transfer-left">
    <h2>技能列表</h2>
    <select multiple></select>
  </div>
  <div class="transfer-buttons">
    <button>&gt;</button>
    <button>&lt;</button>
  </div>
  <div class="transfer-right">
    <h2>已选技能</h2>
    <select multiple></select>
  </div>
</div>

JavaScript代码:

const leftSelect = document.querySelector('.transfer-left select');
const rightSelect = document.querySelector('.transfer-right select');
const addButton = document.querySelector('.transfer-buttons button:nth-child(1)');
const removeButton = document.querySelector('.transfer-buttons button:nth-child(2)');

const skills = [
  { text: 'JavaScript', value: 'js' },
  { text: 'HTML', value: 'html' },
  { text: 'CSS', value: 'css' },
  { text: 'Vue.js', value: 'vue' },
  { text: 'React.js', value: 'react' },
];

skills.forEach(skill => {
  const { text, value } = skill;
  const optionElement = document.createElement('option');
  optionElement.text = text;
  optionElement.value = value;
  leftSelect.add(optionElement);
});

addButton.addEventListener('click', () => {
  const selectedOptions = Array.from(leftSelect.selectedOptions);
  selectedOptions.forEach(option => {
    const newOption = option.cloneNode(true);
    leftSelect.remove(option);
    rightSelect.add(newOption);
  });
});

removeButton.addEventListener('click', () => {
  const selectedOptions = Array.from(rightSelect.selectedOptions);
  selectedOptions.forEach(option => {
    const newOption = option.cloneNode(true);
    rightSelect.remove(option);
    leftSelect.add(newOption);
  });
});

以上代码会生成一个具有技能列表和“>”、“<”按钮的双栏选择框,用于选择多项技能。在点击“>”按钮后,选中的技能会被添加到右侧的选择框中;在点击“<”按钮后,会将选中的技能移回到左侧的选择框中。

示例2

假设我们需要使用一个双栏选择框,用于进行文章标签管理,可以将已有标签移动到右侧的选择框中,也可以添加新的标签。以下是示例代码:

HTML结构:

<div class="transfer-container">
  <div class="transfer-left">
    <h2>已有标签</h2>
    <select multiple></select>
  </div>
  <div class="transfer-buttons">
    <button>&gt;</button>
    <button>&lt;</button>
  </div>
  <div class="transfer-right">
    <h2>文章标签</h2>
    <div>
      <input type="text">
      <button>添加</button>
    </div>
    <select multiple></select>
  </div>
</div>

JavaScript代码:

const leftSelect = document.querySelector('.transfer-left select');
const rightSelect = document.querySelector('.transfer-right select');
const addButton = document.querySelector('.transfer-buttons button:nth-child(1)');
const removeButton = document.querySelector('.transfer-buttons button:nth-child(2)');
const addInput = document.querySelector('.transfer-right input');
const addTagButton = document.querySelector('.transfer-right button');

const tags = [
  { text: 'HTML', value: 'html' },
  { text: 'CSS', value: 'css' },
  { text: 'JavaScript', value: 'js' },
  { text: 'Vue.js', value: 'vue' },
  { text: 'React.js', value: 'react' },
];

tags.forEach(tag => {
  const { text, value } = tag;
  const optionElement = document.createElement('option');
  optionElement.text = text;
  optionElement.value = value;
  leftSelect.add(optionElement);
});

addButton.addEventListener('click', () => {
  const selectedOptions = Array.from(leftSelect.selectedOptions);
  selectedOptions.forEach(option => {
    const newOption = option.cloneNode(true);
    leftSelect.remove(option);
    rightSelect.add(newOption);
  });
});

removeButton.addEventListener('click', () => {
  const selectedOptions = Array.from(rightSelect.selectedOptions);
  selectedOptions.forEach(option => {
    const newOption = option.cloneNode(true);
    rightSelect.remove(option);
    leftSelect.add(newOption);
  });
});

addTagButton.addEventListener('click', () => {
  const tagName = addInput.value.trim();
  if (tagName) {
    const optionElement = document.createElement('option');
    optionElement.text = tagName;
    optionElement.value = tagName.toLowerCase().replace(/\s+/g, '-');
    rightSelect.add(optionElement);
    addInput.value = '';
  }
});

以上代码会生成一个具有文章标签列表和“>”、“<”按钮的双栏选择框,可以将标签添加到右侧的选择框中,或者移回到左侧的选择框中。同时还有一个输入框和一个“添加”按钮,可以用于添加新的标签。在点击“添加”按钮后,输入框中的文本会被添加到右侧的选择框中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS原生双栏穿梭选择框的实现示例 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 旋转任意角度 如何让div旋转一定的角度

    在 CSS 中,我们可以使用 transform 属性来旋转元素。下面是一个完整的攻略,包含了如何让 div 旋转一定的角度的过程和两个示例说明。 如何让 div 旋转一定的角度 1. 使用 transform 属性 我们可以使用 transform 属性来旋转 div 元素。下面是一个示例: .example { transform: rotate(45d…

    css 2023年5月18日
    00
  • 常用技巧margin负外边距的使用介绍

    下面是对常用技巧“margin负外边距”的使用介绍的详细攻略。 什么是负外边距 在CSS中,我们经常会用到外边距(margin)来控制元素之间的间距。而负外边距(negative margin)则是指一个元素向外扩展,覆盖在相邻元素上的效果,即将元素的外边距设置为负数值。 使用负外边距的技巧 1. 清除浮动 在布局中,经常会使用浮动来进行元素的排列。但是,如…

    css 2023年6月9日
    00
  • 影响jQuery使用的14个方面

    影响jQuery使用的14个方面 1. jQuery版本 使用不同版本的jQuery可能会有差异,在使用中需要注意版本兼容性,保证所使用的插件与版本适配。 2. 引入方式 正确的引入jQuery是保证jQuery可用的基础,需要遵循CDN、本地文件同时存在的规则,保证引用的jQuery文件能被正确加载。 3. 加载顺序 jQuery与其它库、框架的引入顺序会…

    css 2023年6月9日
    00
  • 原生js实现给指定元素的后面追加内容

    下面是详细讲解“原生JS实现给指定元素的后面追加内容”的完整攻略: 1. 获取指定元素参考 要想向指定的元素后面追加内容,首先需要获取到该元素的引用。在原生JS中,我们可以通过document.getElementById()或document.querySelector()方法来获取指定元素的引用。举个栗子: // 获取id为"myDiv&quo…

    css 2023年6月10日
    00
  • CSS实现body背景层高于块元素的方法

    将body的背景层设置为高于块元素,可以使用以下两种方法: 方法一:使用伪元素 伪元素可以在body前面添加一层覆盖层,从而实现body背景层高于其他块元素。 首先,需要在CSS中添加以下样式: body { position: relative; z-index: 1; /* 将body的层级设为1,确保该元素在页面中的层级最高 */ } body::be…

    css 2023年6月10日
    00
  • jQuery代码实现发展历程时间轴特效

    jQuery代码实现发展历程时间轴特效 简介 时间轴是一个常用的展示历史发展进程的方式,而jQuery是一个广受欢迎的JavaScript库,能够轻松实现各种页面特效。本文将详细介绍如何使用jQuery实现发展历程时间轴特效,包括主要的HTML结构、CSS样式和jQuery代码实现。 HTML结构 首先,我们需要组织出一个基本的HTML结构,用于展现时间轴的…

    css 2023年6月11日
    00
  • jQuery中outerHeight()方法用法实例

    jQuery中outerHeight()方法用法实例 概述 outerHeight()方法是jQuery中一个常用的方法,用于获取元素的大小,包括边框(border)、内边距(padding)、外边距(margin)和元素的高度(height)。 语法 outerHeight([includeMargin])其中,可选参数includeMargin是一个布尔…

    css 2023年6月11日
    00
  • CSS子元素跟父元素的高度一致的实现方法

    现在我将为您详细讲解“CSS子元素跟父元素的高度一致的实现方法”的完整攻略,并提供两条示例说明。 方法1:使用display:flex布局 使用flex布局可以很方便地实现子元素的高度与父元素一致。 具体步骤如下: 设置父元素的样式为 display:flex;。 设置子元素的样式为 flex:1;,使其自动填充父元素的空白处。 示例代码: <div …

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部