使用val()另一个妙用------选中select/checkbox/radio的值

本文介绍了jQuery中val()方法的功能及使用技巧,包括如何利用该方法获取和设置select(下拉列表框)、checkbox(多选框)和radio(单选框)等表单元素的值,并展示了清空元素内容的方法。

      一直认为val()方法只有两个功能:1、能设置元素的值,2、获取元素的值。知道val()方法还有另外一个妙用,就是它能使select(下拉列表框)、checkbox(多选框)和radio(单选框)相应的选项被选中,在表单操作中会经常用到。而你使用的$("select").val()并不是把所有选项的value显示出来,而是把选中项的value显示出来。

  

下面的2,4,6其实都是通过$("select").val()得到的,具体代码如下:

<script>
    $(function(){
        $("select").change(function(){
            var strHtml = $("select").val();
            $("#p1").text(strHtml);
        });
    });
</script>

既然能得到选中项的value,自然可以设置选中项
 代码如下:

$("select").val("Item 3");

 补充:在jquery中,val()方法中是从最后一个选项往前读取。而如果要设置多个属性的话

则是:$("select").val(["Item 3","Item 5"]);

当然用val()这样子实现,你也是可以用attr实现的~

 

而checkbox(多选框)和radio(单选框) 也是以此类推~ 

 本文仅个人所见,更详细见 这儿

 

 补充——val()不仅有此用途,还可以用来清空内容

 $(selector).val()  这是获得元素的value

 $(selector).val(value)   这是设置元素的value   故而当你在项目中想要清空某元素的内容,只要 $(selector).val(' ')就ok了

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
<script type="text/javascript" src="../scripts/jquery-1.8.3.min.js"></script>
<script>
    $(function(){
        $("#btn").click(function(){
            $("#txtarea").val('');
            $("#txt").val('');
        });    
    });
</script>
</head>
<body>
    <textarea id="txtarea"  cols="23" rows="3">点击清空按钮后,内容全部清空</textarea>
    <input type="text"  id="txt"  value="点击清空按钮后,内容全部清空"/>
    <input type="button" id="btn" value="清空" />
</body>
</html>

 

 

转载于:https://www.cnblogs.com/wanliyuan/p/3426937.html

<think> 我们正在处理一个关于el-checkbox的问题:用户希望实现首次触发改变val,第二次不触发效果。 根据引用内容,我们可以得到一些线索: 引用[1]提到:el-checkbox内置的change事件不生效。同时说明子组件中绑定数据value,如果value改变会触发update:modelValue。 引用[2]提到:在el-table中,当行点击事件和el-checkbox/el-radio一起使用时,点击事件会触发两次。他们的解决方法是在行点击事件中判断事件源(e.target)是否为INPUT,如果是则返回。 引用[3]提到:在el-select使用el-checkbox作为全选功能,并使用了`style="pointer-events: none"`来阻止事件冒泡,避免触发两次el-select的change事件。 引用[4]提到:使用el-checkbox的change事件,通过@change触发函数,并动态改变选中状态。 用户需求:el-checkbox首次触发改变val,第二次不触发效果。 分析:用户可能遇到的问题是change事件被多次触发,或者希望控制触发次数。我们可以通过以下思路: 1. 使用一个标志变量(flag)来控制是否触发事件。首次触发后,将标志置为false,然后第二次就不会触发。但在第二次之后如何恢复?可能需要根据业务逻辑来重置标志。 2. 利用事件修饰符(如.stop)来阻止事件冒泡,避免父元素的事件处理函数被触发(如果是因为冒泡导致的多次触发)。 3. 使用原生事件(如@click.native)并手动控制,在事件处理函数中根据条件执行操作。 根据引用[2]和[3]中提到的解决方法,我们可以考虑: - 在事件处理函数中判断事件源,比如第二次触发可能是冒泡导致的,那么我们可以在事件处理函数中忽略特定的事件源(比如来自冒泡的事件)。 - 或者使用一个变量记录上一次的状态,如果当前状态与上一次相同则不执行操作(但change事件通常是改变才触发,所以可能不是这个问题)。 但是,用户的需求是“首次触发改变val,第二次不触发效果”,这听起来像是希望在第一次点击时执行操作,第二次点击时不执行(可能是同一个复选框的两次点击)。这类似于一个开关:第一次开,第二次关,但用户希望只在开的时候做操作,关的时候不做?或者反过来? 具体实现思路: 我们可以用一个变量(比如`isFirst`)来记录是否首次触发。在change事件中,如果是第一次,则执行操作并改变val,然后将`isFirst`设为false;当第二次触发时,由于`isFirst`为false,所以不执行操作。但是这样以后所有的触发都不会执行了。用户可能需要的是每次第一次点击执行,第二次点击不执行,然后第三次点击又执行?这实际上是一个交替执行的情况。因此,我们可以用一个计数器(count)或者切换一个标志(flag),每次点击时翻转标志,根据标志的状态来决定是否执行。 然而,更合理的解释可能是:用户希望当复选框从未选中选中时(即首次触发改变)执行操作,而从选中到未选中(第二次触发)时不执行操作。这就是根据复选框的状态来决定。 因此,我们可以这样: 在change事件的处理函数中,判断复选框当前的状态(即改变后的),如果为true(选中),则执行操作;如果为false(未选中),则不执行操作。 例如: ```vue <el-checkbox v-model="checked" @change="handleChange"></el-checkbox> methods: { handleChange(val) { // val是复选框当前的状态(true/false) if (val) { // 只有当选中时才执行操作 // 这里执行你需要的操作 } } } ``` 这样,当第一次点击(假设初始未选中)变成选中时,val为true,执行操作;第二次点击(变成未选中)时,val为false,不执行操作。 但是,用户的需求描述是“首次触发改变val,第二次不触发效果”,这个方案符合:第一次改变(从false到true)触发,第二次改变(从true到false)不触发。 如果用户希望的是一种情况(例如,第一次改变触发,第二次改变也触发但效果不同?),那么需要更明确的业务需求。但根据问题描述,上述方案应该能满足。 外,引用[4]中提供了一个使用@change并传递多个参数(事件、项、索引、行数据)的例子,我们可以参考其事件处理方式。 因此,解决方案的核心是:在change事件处理函数中,根据复选框当前的(即改变后的)来决定是否执行操作。 如果用户的需求不仅仅是根据选中状态,而是需要记录点击次数交替执行,那么我们可以使用一个计数器或者状态翻转变量。但根据问题描述,第一种方案更直接。 示例代码: ```vue <template> <el-checkbox v-model="checked" @change="onChange"></el-checkbox> </template> <script> export default { data() { return { checked: false }; }, methods: { onChange(val) { if (val) { // 首次触发(从false变为true)时执行 console.log('复选框被选中,执行操作'); // 这里可以改变val(实际上v-model已经绑定了,checked会变为true) } // 当val为false(取消选中)时,什么也不做 } } }; </script> ``` 注意:这里我们利用了change事件,它会在复选框状态改变时触发,并传递当前的状态(val)。我们只处理选中(true)的情况。 如果用户的需求是相反:只处理取消选中的情况,那么判断条件改为`if (!val)`即可。 如果用户需要在特定的第二次点击不触发,而其他时候触发,那么就需要记录点击次数或状态。例如: ```vue <template> <el-checkbox v-model="checked" @change="onChange"></el-checkbox> </template> <script> export default { data() { return { checked: false, shouldTrigger: true // 初始允许触发 }; }, methods: { onChange(val) { if (!this.shouldTrigger) { // 如果当前设置为不触发,则跳过 this.shouldTrigger = true; // 重置为true,以便下一次触发 return; } // 执行操作 console.log('执行操作'); // 然后设置shouldTrigger为false,这样下一次改变就不会触发 this.shouldTrigger = false; } } }; </script> ``` 但是,注意:这个实现中,第一次触发会执行操作并设置shouldTrigger为false,第二次触发不会执行操作但会重置shouldTrigger为true。那么第三次触发就会执行操作,然后第四次不执行,如此交替。这符合“奇数次执行,偶数次不执行”的逻辑。 用户需求是“首次触发改变val,第二次不触发”,那么上述交替模式可能满足(首次执行,第二次不执行,第三次执行,第四次不执行...)。但是,如果用户希望的是只执行第一次,以后都不执行?那么就应该用一个标志位,一旦执行过就不再执行。 因此,我们需要明确用户的具体需求: 1. 只执行第一次改变(之后无论多少次都不执行):使用一个标志位,初始为true,第一次执行后置为false,之后不再执行。 2. 交替执行:首次执行,第二次不执行,第三次执行,第四次不执行...(如上代码)。 这里按照用户描述的“首次触发改变val,第二次不触发效果”,我们假设是交替执行的情况。 综上所述,我们提供两种方案: 方案一:根据复选框的状态(选中/未选中)来决定是否执行操作(适用于只处理选中或只处理未选中的场景)。 方案二:使用交替触发标志(适用于交替执行的场景)。 由于用户问题中没有明确具体场景,我们给出两种方案供选择。 下面,我们将按照交替执行的场景(方案二)编写示例代码,因为用户明确提到了“首次”和“第二次”。 注意:在方案二中,我们使用一个变量`shouldTrigger`来控制,但要注意这个变量需要在每次改变后取反,以实现交替。然而,在change事件中,我们每次改变都会触发,所以每次触发后我们将`shouldTrigger`设置为false,然后在下一次触发开始时将其重置为true?不对,我们想要的是:第一次执行,第二次不执行,第三次执行...所以应该在执行操作后,设置`shouldTrigger`为false;在不执行操作的时候,设置`shouldTrigger`为true。这样交替。 修改方案二代码逻辑: 我们可以在不执行操作的时候,不重置`shouldTrigger`,而是通过下一次改变事件来重置?这样不行,因为下一次改变事件发生时,我们需要判断。我们可以这样: 每次执行change事件后,将`shouldTrigger`取反。初始为true。 当`shouldTrigger`为true时执行操作,然后置为false。 当`shouldTrigger`为false时,不执行操作,然后置为true(为下一次执行准备)。 这样,每次改变都会改变`shouldTrigger`,且交替执行操作。 代码: ```vue <template> <el-checkbox v-model="checked" @change="onChange"></el-checkbox> </template> <script> export default { data() { return { checked: false, shouldTrigger: true // 初始为true,允许第一次触发执行 }; }, methods: { onChange(val) { if (this.shouldTrigger) { // 执行操作 console.log('执行操作'); } // 无论是否执行操作,都将shouldTrigger取反,以便下次交替 this.shouldTrigger = !this.shouldTrigger; } } }; </script> ``` 这样,第一次:shouldTrigger为true -> 执行操作 -> 变为false 第二次:shouldTrigger为false -> 不执行操作 -> 变为true 第三次:shouldTrigger为true -> 执行操作 -> 变为false 第四次:false -> 不执行 -> 变为true ...交替执行。 但是,注意:这个复选框的change事件每次改变都会触发,而每次触发都会改变shouldTrigger。所以这个标志是针对这个复选框的每一次状态改变。 外,这个方案有一个潜在问题:如果复选框的状态改变不是通过用户点击(比如通过程序设置this.checked=true/false),那么也会触发change事件并交替标志位。所以要根据实际业务场景使用。 总结:根据用户需求,我们提供了两种可能的实现方式: 1. 基于状态(选中/未选中)的过滤:只处理选中(或只处理未选中)状态。 2. 交替执行:使用一个标志位,在每次改变时交替,从而实现在第一次改变(以及后续的奇数次改变)时执行操作,在第二次改变(以及后续的偶数次改变)时不执行操作。 用户可以根据具体需求选择。 最后,请注意引用[2]中提到的事件冒泡可能导致多次触发的情况,如果用户遇到的是事件冒泡问题,则需要采用事件冒泡的处理方式(如判断事件源或阻止冒泡)。但根据用户的问题描述,我们主要关注触发次数的控制。 因此,我们给出以上解决方案。 </think> 根据您的需求,要实现el-checkbox首次触发改变、第二次不触发的效果,以下是完整解决方案: ### 解决方案 1. **使用状态标志控制触发** 通过添加`isFirstTrigger`标志位记录首次触发状态: ```vue <template> <el-checkbox v-model="checkboxValue" @change="handleChange" >复选框</el-checkbox> </template> <script> export default { data() { return { checkboxValue: false, isFirstTrigger: true // 首次触发标志 } }, methods: { handleChange(val) { if (this.isFirstTrigger) { // 首次触发执行操作 console.log("首次触发,修改", val); this.executeBusinessLogic(val); this.isFirstTrigger = false; // 关闭首次触发标志 } // 第二次及后续触发不作处理 }, executeBusinessLogic(val) { // 您的业务逻辑,例如修改其他数据 } } } </script> ``` 2. **事件冒泡处理(针对嵌套场景)** 若复选框嵌套在其他组件中(如表格),需阻止事件冒泡: ```vue <el-table @row-click="handleRowClick"> <el-table-column> <template #default="{ row }"> <el-checkbox v-model="row.checked" @change="handleCheckboxChange($event, row)" @click.native.stop // 阻止事件冒泡 /> </template> </el-table-column> </el-table> ``` 引用[2][^2]中提到需要拦截INPUT事件,这里通过`.stop`修饰符实现 3. **动态事件绑定(可选方案)** 首次触发后解除事件绑定: ```vue <el-checkbox v-model="value" @change="firstChangeHandler" ref="checkboxRef" /> ``` ```js methods: { firstChangeHandler(val) { // 业务逻辑 this.$refs.checkboxRef.$off('change') // 移除事件监听 } } ``` ### 关键点说明 - **状态标志原理**:通过`isFirstTrigger`布尔控制业务逻辑执行条件,首次触发后标志位置为`false` - **冒泡处理**:引用[2][^2][^3]中提到的冒泡问题,使用`@click.native.stop`避免父组件事件二次触发 - **动态事件**:引用[4][^4]中的动态绑定思路,但更推荐状态标志方案,避免事件管理复杂度 - **适用场景**:表单初始化选择、单次激活操作等需要限制触发次数的交互 ### 示例场景 实现"首次选择启用功能,再次选择不响应": ```vue <el-checkbox v-model="isActive" @change="handleActivation"> 激活功能 </el-checkbox> ``` ```js handleActivation(val) { if (this.isFirstActivation) { this.activatePremiumFeature(val); // 执行激活 this.isFirstActivation = false; this.$message.success("功能已激活"); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值