首页 > 其他分享 ><select>中<option>的互斥

<select>中<option>的互斥

时间:2023-02-15 17:23:43浏览次数:52  
标签:选项 独占 选择 互斥 选中 数组 newSel

背景:我需要将单选和多选功能组合到一个控件中。具体来说,我有很多选项<option>。第一个选项是相互排斥的。因此,如果我选择第一个独占选项,则需要取消选中所有其他选项。如果选择了其他一个,则必须取消选中第一个(如果选中)。其他选项应互不影响。

<select id="myGroup" data-native-menu="false" multiple="multiple">
    <option value="">请选择</option>
    <option value="-1" selected="selected">I am alone</option>
    <option value="1">I am not alone 1</option>
    <option value="2">I am not alone 2</option>
    <option value="3">I am not alone 3</option>
</select>

select的选择值发生改变时,$("#myGroup").val()会返回所有被选中的值,而不是你点击的值。
如果用户选择选项3,则$("#myGroup").val()变为[-1,3]。我怎样才能知道那是刚刚被选中的‘3’ ?

可以保留一个选定选项的数组,然后在选择一个新选项时对这些数组进行比较。

// 全局变量:
// 要在 MultiSelect 下拉列表中实现独占选项,
// 我们需要跟踪当前选择(这里是一个全局变量)
// 并将此数组与 change() 事件中的最新选择数组进行比较。
var currSel = $('#myGroup').val();

$('#myGroup').on('change', function() {
    var newSel = $(this).val();
    // 从 currSel 中获取差异
    // Diff 方法详见: https://www.cnblogs.com/strongerPian/p/17123597.html
    var diff = newSel.filter(x => !currSel.includes(x));
    // 如果刚刚选择了独占选项,则删除所有其他选项
    if (diff.length) {
        if (diff[0] === '-1') { // '-1'是独占选项
           // 如果独占选项刚刚被选中(“-1”),则 在修改后的选择数组中 取消选择所有其他选项
           newSel = ['-1'];
        } else {
           // 如果非独占选项刚被选中,确保独占选项不在修改后的选择数组中 
           newSel = newSel.filter(el => el !== '-1');
        }
        // 将下拉列表设置为修改后的新选择数组
        $('#myGroup').val(newSel);
    }
    // 将最新的选择数组克隆到当前选择数组中
    currSel = [...newSel];
}


参考:SO

标签:选项,独占,选择,互斥,选中,数组,newSel
From: https://www.cnblogs.com/strongerPian/p/17123746.html

相关文章

  • 进程同步和进程互斥
    进程同步和进程互斥1、什么是进程同步2、什么是进程互斥知识回顾......
  • 【转】go Mutex (互斥锁)和RWMutex(读写锁)
    golang中sync包实现了两种锁Mutex(互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能.typeMutexfunc(m*Mutex)Lock(......
  • 互斥锁和读写锁
    锁用来控制多线程访问共享资源的工具。互斥锁:线程之间互斥,一个线程获取到锁,另一个线程要获取锁时,发现锁已经被其他线程获取,则不可获取锁。读写锁:将读写操作进行拆分,针对......
  • 信号量和互斥量
    Semaphore信号量信号量的取得和释放由不同线程进行可以是0/1,也可以是整型实现有序访问资源,有排队队列Mutex互斥量加锁和解锁必须是同一线程0/1不限制多线程的访问......
  • 读写锁与互斥锁
    读写锁与互斥锁Go语言标准库sync提供了两种锁,互斥锁sync.Mutex和读写锁sync.RWMutex。1.区别1.1互斥锁(sync.Mutex)互斥即不可同时运行。即使用了互斥锁的两......
  • 线程互斥(及其它copy自网络)
    原文链接:笔记VC_xd_ladan的博客-CSDN博客 滚动条信息结构LPSCROLLBARINFO编译报错找不到时,在stdafx.h最前面加上#defineWINVER0x500=============================......
  • 互斥锁简单介绍
    可重入锁意思是object.lock()获取锁后,可以再次使用object.lock()获取锁,如果发生了死锁就不是可重入锁公平锁就是排队买票,不公平锁就是插队买票锁实现的基本原理1.需要一......
  • 操作系统——进程同步互斥分析
    如何实现进程同步假设有两个代码块S1,S2顺序进行(先S1后S2),在在S1和S2之间设个信号量S,则先V后P分析:信号量初始设置为0,先V让它变为1才能在P那里不阻塞进行,如果先P让信号量......
  • 多线程中互斥锁与原子性的区别
    一个好的解释,原子操作是不能细分为更小部分的操作。因此,它永远不会半途而废,因此您可以保证它将始终以一致的状态被观察到。例如,现代硬件实现原子比较和交换操作。互斥锁......
  • 5. 使用互斥量保护共享数据
    使用互斥量保护共享数据C++中使用互斥量C++通过实例化std::mutex创建互斥量,通过调用成员函数lock()进行加锁,unlock()进行解锁,在实践中不推荐直接调用成员函数,因为调用......