select多选问题

如果想讓 select 呈現多選狀態則設置它的屬性 multiple, 就可以實現多選。

<select multiple name="SUBROUTE" style="HEIGHT: 140px; WIDTH: 150px" id="subroute_select">
<option VALUE="10M">10M</option>
<option VALUE="30M">30M</option>
<option VALUE="50M">50M</option>
<option VALUE="100M">100M</option>
<option VALUE="200M">200M</option>
<option VALUE="300M">300M</option>
<option VALUE="500M">500M</option>
<option VALUE="1000M">1000M</option>
</select>

但是會有一個問題:如果想選擇多個選項,就必須用按 shift 或者 ctrl 或鼠標拖動,如果不想這樣操作,想直接通過點擊操作的話,可以按以下方法實現。

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

< html >

< head >

< title > New Document </ title >

< meta name = "Generator" content = "EditPlus" >

< meta name = "Author" content = "" >

< meta name = "Keywords" content = "" >

< meta name = "Description" content = "" >

</ head >

< body >

< select id = "oselect" name = "cars" size = "10" multiple >

    < option value = "BMW" > 宝马 </ option >

    < option value = "Porsche" > 保时捷 </ option >

    < option value = "Benz" > 奔驰 </ option >

    < option value = "Santana" > 桑塔纳 </ option >

    < option value = "LK" > 林肯 </ option >

    < option value = "?" > 标志 </ option >

    < option value = "Bus" > 大公共 </ option >

</ select >

< input type = "button" id = "btnShowSelected" value = " 查看选中项索引 " >

</ body >

< script language = "JavaScript" >

    String.prototype.trimEnd = function (trimString) {

       var re = new RegExp(trimString + "*$" , "g" );

       return this .replace(re, "" );

    };

    Array.prototype.indexOf = function (itemValue) {

       var nIndex = -1;

       for ( var i = 0; i < this .length; i++) {

           if ( this [i] == itemValue)

              nIndex = i;

       }

       return nIndex;

    };

    var oSpan = document.getElementById( "spaOutput" );

    var oSele = document.getElementById( "oSelect" );

    var oBtn = document.getElementById( "btnShowSelected" );

    oBtn.onclick = function () {

       alert(getSelectedIndexes(oSele));

    };

    function getSelectedIndexes(oSele) {

       var sSelectedIndexes = "" ;

       var separator = "," ;

       for ( var i = 0; i < oSele.options.length; i++) {

           if (oSele.options[i].selected)

              sSelectedIndexes += i.toString() + separator;

       }

       if (sSelectedIndexes == "" )

           return new Array(0);

       else

           return sSelectedIndexes.trimEnd(separator).split(separator);

    }

    oSele.onclick = function () {

       this .selectedIndexes = getSelectedIndexes( this );

 

       if ( this .selectedIndexes.length == 1) {

           var nSelectedIndex = parseInt( this .selectedIndexes[0]);

           if (!isNaN(nSelectedIndex))

              this .options[nSelectedIndex].selected = false ;

       }

    };

    oSele.onchange = function () {

 

       var j = this .selectedIndexes.indexOf( this .selectedIndex.toString());

       if (j > -1) {

           this .options[ this .selectedIndex].selected = false ;

           this .selectedIndexes.splice(j, 1);

       }

       if ( this .selectedIndexes.length > 0) {

           var nSelectedIndex;

           for ( var i = 0; i < this .selectedIndexes.length; i++) {

              nSelectedIndex = parseInt( this .selectedIndexes[i]);

              this .options[nSelectedIndex].selected = true ;

           }

       }

 

 

</ script >

</ html >

 

此方法可以實現,但是也會有一個弊端,就是它選擇的時候會出現閃爍的情況,給人不是很好的感覺。所以最後,通過在網上查詢,得知最好的方法就是可以使用層來模擬 textarea

  < html >

     < head >

        < title > Test </ title >

     </ head >

     < body bgcolor = "#336699" >

        < div id = haiwa style = "background-color: #eeeeee; border: 1 solid #000000; width: 120; height: 120;overflow:auto" >

           < div style = "height:20px;cursor:default;font-family: tahoma;font-size: 12px; font-weight: bold" onclick =haiwa.style.height=" 120";document.all.haiwa.scrolltop = 0 >

              < input type = checkbox style = height:15px; name = ck id = ck1 >< label for = ck1 > 第一項 </ label >

           </ div >

           < div style = "height:20px;cursor:default;font-family: tahoma;font-size: 12px; font-weight: bold" onclick =haiwa.style.height=" 120";document.all.haiwa.scrolltop = 0 >

              < input type = checkbox style = height:15px; name = ck id = ck2 >< label for = ck2 > 第二項 </ label >

           </ div >

           < div style = "height:20px;cursor:default;font-family: tahoma;font-size: 12px; font-weight: bold" onclick =haiwa.style.height=" 120";document.all.haiwa.scrolltop = 0 >

              < input type = checkbox style = height:15px; name = ck id = ck2 >< label for = ck2 > 第三項 </ label >

           </ div >

           < div style = "height:20px;cursor:default;font-family: tahoma;font-size: 12px; font-weight: bold" onclick =haiwa.style.height=" 120";document.all.haiwa.scrolltop = 0 >

              < input type = checkbox style = height:15px; name = ck id = ck2 >< label for = ck2 > 第四項 </ label >

           </ div >

       </ div >

     </ body >

</ html >

在使用 `el-tree-select` 组件时,若遇到功能异常,尤其是当需要限制最大择数量时,通常会发现 `el-select` 支持的 `max` 属性在 `el-tree-select` 中不生效。为了解决这一问题,可以采取以下几种方案来实现对数量的限制,并确保组件的交互逻辑保持正常。 ### 1. 手动控制中状态 可以通过监听 `check-change` 事件,在数据发生变化时手动控制中项的数量。当用户尝试择超过限制数量的节点时,阻止其继续择,并提示相关信息。 ```vue <template> <el-tree-select v-model="selectedNodes" :data="treeData" show-checkbox @check-change="handleCheckChange" /> </template> <script> export default { data() { return { selectedNodes: [], treeData: [ { id: 1, label: '一级 1', children: [ { id: 4, label: '二级 1-1' }, { id: 5, label: '二级 1-2' } ] }, { id: 2, label: '一级 2', children: [ { id: 6, label: '二级 2-1' }, { id: 7, label: '二级 2-2' } ] } ], maxSelection: 2 }; }, methods: { handleCheckChange(checkedKeys, checkedNodes) { if (checkedNodes.length > this.maxSelection) { this.$message.warning(`最只能择 ${this.maxSelection} 项`); // 回退到之前的状态 this.selectedNodes = checkedKeys.slice(0, this.maxSelection); } } } }; </script> ``` ### 2. 使用 `v-model` 和 `watch` 实现双向绑定控制 通过 `watch` 监听中值的变化,若超出限制则自动回退到合法状态。这种方式适合需要更精细控制的场景。 ```vue <template> <el-tree-select v-model="selectedNodes" :data="treeData" show-checkbox /> </template> <script> export default { data() { return { selectedNodes: [], treeData: [ { id: 1, label: '一级 1', children: [ { id: 4, label: '二级 1-1' }, { id: 5, label: '二级 1-2' } ] }, { id: 2, label: '一级 2', children: [ { id: 6, label: '二级 2-1' }, { id: 7, label: '二级 2-2' } ] } ], maxSelection: 2, previousSelection: [] }; }, watch: { selectedNodes(newVal) { if (newVal.length > this.maxSelection) { this.$message.warning(`最只能择 ${this.maxSelection} 项`); this.selectedNodes = this.previousSelection; } else { this.previousSelection = [...newVal]; } } } }; </script> ``` ### 3. 自定义组件封装限制逻辑 如果项目中频繁使用 `el-tree-select` 并需要统一控制限制,建议封装一个自定义组件,将限制逻辑封装在其内部,对外暴露一个统一的 `props` 接口。 ```vue <template> <el-tree-select v-model="internalValue" :data="data" show-checkbox @check-change="handleCheckChange" /> </template> <script> export default { props: { value: { type: Array, default: () => [] }, data: { type: Array, required: true }, maxSelection: { type: Number, default: 2 } }, data() { return { internalValue: this.value }; }, watch: { value(newVal) { this.internalValue = newVal; } }, methods: { handleCheckChange(checkedKeys) { if (checkedKeys.length > this.maxSelection) { this.$message.warning(`最只能择 ${this.maxSelection} 项`); this.internalValue = checkedKeys.slice(0, this.maxSelection); this.$emit('input', this.internalValue); } } } }; </script> ``` ### 4. 禁用未中的节点(可增强体验) 在达到最大择数量后,可以动态设置未中节点为 `disabled` 状态,防止用户继续择。这需要遍历树结构,将未中的节点标记为不可。 ```js function disableUncheckedNodes(treeData, selectedKeys) { return treeData.map(node => { const isDisabled = !selectedKeys.includes(node.id); node.disabled = isDisabled; if (node.children) { node.children = disableUncheckedNodes(node.children, selectedKeys); } return node; }); } ``` 在 `handleCheckChange` 中调用该函数更新 `treeData`。 --- ### 总结 - `el-tree-select` 没有直接支持 `max` 属性,但可以通过 `check-change` 事件或 `watch` 来手动控制中数量。 - 对于复杂项目,建议封装组件以实现复用性和统一控制。 - 可结合 `disabled` 属性提升用户体验,防止用户误操作。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值