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

yizhihongxing

要实现一个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日

相关文章

  • vue如何使用rem适配

    下面我来为你详细讲解一下vue如何使用rem适配的完整攻略。 什么是rem适配 当我们在不同尺寸的设备上访问同一个页面时,可能会出现布局和字体大小适配的问题。而rem适配就是为了解决这个问题而出现的一种解决方案。 rem(font-size of the root element)是相对于根元素(即html元素)字体大小的单位。为了实现页面的适配,我们需要将…

    css 2023年6月10日
    00
  • css样式important规则的正确使用方式

    下面是“CSS样式important规则的正确使用方式”的完整攻略: 正确使用important规则 仅在必要时使用important规则 在开发网站时,有时可能会遇到无法通过其他方式覆盖特定CSS样式的情况。这时候可以考虑使用important规则来强制使用该样式。但是,important规则应该只在必要时使用。如果在大量使用important规则,将变得…

    css 2023年6月9日
    00
  • vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)

    vue中v-cloak是一个Vue内置的指令,它可以在Vue实例渲染后,将标签中的v-cloak属性移除,以实现解决刷新或者加载出现闪烁问题,保证在Vue实例渲染之前不会显示出来。下面就来详细讲解一下v-cloak的使用方法。 一、v-cloak的基本使用 直接上代码: <!–模板代码–> <div v-cloak> <!-…

    css 2023年6月10日
    00
  • CSS教程:网页版面设计无效的10个原因

    下面是“CSS教程:网页版面设计无效的10个原因”的完整攻略: CSS教程:网页版面设计无效的10个原因 1. 语法错误 在CSS编写中,任何一个不正确的字符都可能导致整个CSS文件有效性失效。常见的语法错误包括拼写错误、忘记添加分号以及括号未成对等。所以,在编写CSS时,务必要仔细检查,以确保相应的语法正确。 示例: /* 错误示例 */ body { b…

    css 2023年6月10日
    00
  • HTML 隐藏滚动条和去除滚动条的方法

    下面是详细讲解“HTML隐藏滚动条和去除滚动条的方法”的完整攻略。 隐藏滚动条 HTML默认情况下会显示滚动条,如果我们想要隐藏滚动条,可以使用CSS样式来实现。 方法一:使用overflow属性 可以使用CSS中的overflow属性将滚动条隐藏起来,下面是示例代码: html { overflow: hidden; } 上面实例中,我们将页面HTML元素…

    css 2023年6月10日
    00
  • HTML+CSS+JS实现堆叠轮播效果的示例代码

    下面是HTML+CSS+JS实现堆叠轮播效果的完整攻略,包含了实现步骤以及示例说明。 一、实现步骤 1.编写HTML结构 首先,我们需要编写基本的HTML结构,包括容器以及需要轮播的子元素。具体代码如下: <div class="slider-container"> <div class="slider-ite…

    css 2023年6月10日
    00
  • css层滚动条

    1. 什么是CSS层滚动条? CSS层滚动条是CSS3新增的一种基于webkit内核的样式属性,网页开发者可以通过CSS样式来自定义滚动条的样式、宽度、颜色等,滚动条简单易用受到很多开发者的喜欢和青睐。 2. CSS层滚动条属性 CSS层滚动条主要涉及到以下三个属性: ::-webkit-scrollbar: 滚动条容器; ::-webkit-scrollb…

    css 2023年6月10日
    00
  • jquery 交替为表格添加样式的代码

    下面是详细讲解jQuery交替为表格添加样式的完整攻略。 问题描述 在网页制作中,我们常常需要在表格中隔行添加不同的背景色或边框样式,以方便用户阅读表格内容。在使用jQuery编写交互效果时,也需要用到类似的样式处理。 解决方案 jQuery提供了许多方便的选择器和方法,可以轻松实现对表格的样式修改。以下是基于jQuery的交替为表格添加样式的代码攻略: 方…

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