控制select为readonly状态

本文介绍了如何使用JavaScript和jQuery控制用户无法选择和更改特定控件的值,包括直接在HTML中设置readonly属性的方法,以及通过JavaScript函数批量设置控件为只读状态的方法。此外,还展示了如何利用jQuery在特定条件下动态改变select控件的默认值。

简单说两种方式,实质是一样的,一种简介明了,一种稍显复杂

实质都是用:

onmousemove="this.setCapture();" onmouseout="this.releaseCapture();" onfocus="this.blur();"

这句代码来控制用户无法选择和更改该控件的值

 

一、先说简单的(平时都用简单的,但是有大量select控件需要做readonly处理时用复杂的更简单)

<select  onmousemove="this.setCapture();" onmouseout="this.releaseCapture();" onfocus="this.blur();">

<option selected >aaa</option>

<option>bbb</option>

</select>   

二、贴一个复杂的,就是把变化放入js,来实现而已,多时候有用,另外只在脚本控制时候用

// set all input/select/textarea readonly  

function allReadonly(){  

    // input readonly  

    var inputEle = document.getElementsByTagName("input");  

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

        inputEle[i].setAttribute("readonly","true",0);  

        inputEle[i].onclick = function setClickFalse(){return false;}  

        inputEle[i].onfocus = function setFocusFalse(){return false;}  

        inputEle[i].onblur = function setBlurFalse(){return false;}  

    }  

    // select readonly  

    var selectEle = document.getElementsByTagName("select");  

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

        setReadOnly(selectEle[i]);  

    }  

    // textarea readonly  

    var textareaEle = document.getElementsByTagName("textarea");  

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

        textareaEle[i].setAttribute("readonly","true",0);  

    }  

}  

 

// select readonly  

function setReadOnly(obj){  

    obj.onmouseover = function(){  

        obj.setCapture();  

    }  

    obj.onmouseout = function(){  

        obj.releaseCapture();  

    }  

    obj.onfocus = function(){  

        obj.blur();  

    }  

    obj.onbeforeactivate = function(){  

        return false;  

    }   

}  

 

// select readonly rollback  

function rollBack(obj){  

    obj.onmouseover = function(){  

    }  

    obj.onmouseout = function(){  

    }  

    obj.onfocus = function(){  

    }  

    obj.onbeforeactivate = function(){  

    }   

}

 

另外,对于单个select的readOnly的控制,可以通过jQuery控制,js代码如下:

$("#phone").blur(function(){
  var url = $("#basePath").val() + "/phone/getAreaNew.do";
  var phoneNbr = $("#phone").val();
  if(/^CH/d{9}$/.test(phoneNbr.toUpperCase())){
   $("#regArea").val("sh");
   document.getElementById("regArea").disabled=true;
   $("#regArea").parent("td").append($("<input type='hidden' name='regArea' id ='hidden_regArea'/>").val($("#regArea").val()));
   $("#regArea").attr("name","regArea_");
   return;
  } else {
   document.getElementById("regArea").disabled=false;
   $("#hidden_regArea").remove();
   $("#regArea").attr("name","regArea");
  }
  if(phoneNbr != ""){
   $.ajax({
    type:"post",
    url:url,
    data:"phoneNbr=" + phoneNbr,
    success:function(responseText){
     if(responseText != "" || responseText == "all"){
      $("#regArea").val($("#accessArea").val());
     }else{
      $("#regArea").val(responseText);
     }
    }
   });
  }
 });

响应的jsp代码片段如下:

<form action="" method="post" id="form1">

   <div class="main">
    <table>
     <tr>
      <td align="right" class="label1">账号:</td>
      <td style="height: 30px;">
       <input type="text" id="phone" name="phone" maxlength="11" class="input"/>
      </td>
     </tr>
     <tr>
      <td align="right" class="label1">开户地:</td>
      <td style="height: 30px;">
       <select id="regArea" name="regArea" class="select_other">
                       <option value="all">--开户地--</option>
                       <option value="sh">上海</option>
                      </select>
      </td>
     </tr>
     <tr>
      <td align="right" class="label1">密码:</td>
      <td><input type="password" name="pwd" id="pwd" class="input"/></td>
     </tr>
    </table>
    <div style="margin: auto; text-align: center; margin-top: 15px;">
     <input type="button" id="login_other" name="login_other" class="login" value="登 录"/>
    </div>
   </div>
  </form>

### 解决方案 在 Vue 中实现 `select` 框禁用时的样式调整,可以通过自定义 CSS 样式来模拟 `readonly` 的效果。以下是具体方法: #### 方法一:通过覆盖默认样式 可以利用 Element Plus 提供的类名或者原生 `<select>` 元素的属性,修改禁用状态下的背景颜色和边框颜色。 ```css /* 修改禁用状态select 的样式 */ .el-select.is-disabled .el-input__inner { background-color: transparent !important; border-color: var(--el-border-color-light) !important; /* 设置边框颜色为浅灰色 */ color: var(--el-text-color-secondary) !important; /* 文字颜色变淡 */ } ``` 此部分代码的作用是当 `.el-select` 被禁用时,将其内部输入框的颜色改为透明,并保持边框可见[^1]。 --- #### 方法二:使用自定义组件 如果希望更灵活地控制样式的呈现方式,可以选择创建一个自定义的 `Select` 组件,在其中动态绑定 `disabled` 属性并应用特定的样式逻辑。 以下是一个简单的例子: ```vue <template> <div class="custom-select"> <el-select :disabled="isDisabled" v-model="selectedValue" placeholder="请选择" @change="handleChange" > <el-option v-for="(item, index) in options" :key="index" :label="item.label" :value="item.value" /> </el-select> </div> </template> <script lang="ts"> import { defineComponent, ref } from 'vue'; export default defineComponent({ name: 'CustomSelect', props: { disabled: Boolean, options: Array<{ label: string; value: any }>, }, setup(props) { const selectedValue = ref(null); const isDisabled = ref(props.disabled); function handleChange(value: any): void { console.log('Selected Value:', value); } return { selectedValue, isDisabled, handleChange, }; }, }); </script> <style scoped> .custom-select .el-select.is-disabled .el-input__inner { background-color: rgba(255, 255, 255, 0.3); /* 半透明背景 */ cursor: not-allowed; /* 鼠标悬停时显示不可操作图标 */ } .custom-select .el-select.is-disabled:hover .el-input__inner { border-color: var(--el-border-color-hover); /* 禁用状态下鼠标悬浮时不改变边框颜色 */ } </style> ``` 这段代码展示了如何封装一个支持半透明背景的禁用态 `select` 组件[^2]。 --- #### 方法三:基于 DeepSeek 或其他库扩展功能 对于更高阶的需求,比如需要完全定制化交互体验的情况,可以借助第三方工具如 DeepSeek 来增强开发效率[^3]。不过需要注意的是,这类解决方案通常依赖于额外安装插件或框架集成工作量较大。 --- ### 总结 无论是直接重写现有控件的行为还是构建全新的 UI 构造体都需要考虑用户体验的一致性和跨浏览器兼容性等问题。以上提到的技术手段均能有效达成目标——即让被锁定的选择列表看起来更像是只读字段而非彻底失效的状态
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值