js 动态生成 input 的绑定事件 blur 无效

本文探讨了在动态生成表格中,如何正确绑定blur事件至input标签。起初的尝试仅适用于静态表格,通过调整策略,最终实现了动态表格元素的事件监听。文章强调了异步操作对事件绑定的影响及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 今天在进行代码编写时,我需要根据ajax返回的数据动态生成一个表格,而针对于其中的input标签,要求设置失去焦点的blur事件

  • 需要实现的界面截图如下:

  • 最开始编写的 js 代码如下:

	/**
     * 当sku库存量变化时,对应总库存进行更新
     */
    $(".input-sku-stock").blur(function () {
        var input_goods_stock = 0;
        $('.input-sku-stock').each(function () {
            input_goods_stock += Number($(this).val());
        });
        $(".input-goods_stock").val(input_goods_stock);
    });
  • 但是发现,静态的表格是可以正常实现的,而动态新生成的却无法触发blur事件
    因为测试失败后,转而考虑新的写法,且可以正常实现

 

意见:异步导致绑定事件失败,需使用全局绑定事件

<think>嗯,用户的问题是关于在Vue中使用Element UI的表格组件,想要通过this.$refs.table.setActiveRow(row)来实现当焦点离开时取消表格行的编辑模式。首先,我需要理解用户的具体需求。他们可能是在开发一个可编辑的表格,用户在点击某行后可以编辑,当焦点离开时保存或取消编辑状态。 根据提供的引用内容,特别是引用[2]提到在el-table中使用el-input时,调用focus方法可能无效,可能需要使用原生DOM的方法。这可能意味着在表格中使用动态ref时,直接操作Vue的refs可能不够,需要借助原生的blur事件。 用户提到的setActiveRow方法,可能是指Element UI表格的一个方法,用于设置当前活动的行。但根据常规经验,Element UI的el-table组件并有内置的setActiveRow方法,这可能是用户自定义的方法或者误解。因此,可能需要引导用户使用正确的事件和方法。 接下来,用户希望当焦点离开时取消编辑模式。通常,这可以通过监听blur事件来实现。但要注意,在el-table中动态生成的el-input可能需要特殊处理,比如使用原生事件或者手动绑定blur事件。 引用[4]提到父组件通过$refs调用子组件的方法,这可能涉及到在表格行中使用子组件,并通过ref来访问它们的方法。例如,每个可编辑的单元格是一个子组件,当失去焦点时调用其方法取消编辑状态。 可能的解决方案步骤包括: 1. 在el-table-column中使用作用域插槽来嵌入el-input。 2. 动态绑定ref到每个el-input,可能需要使用动态ref,如:ref="'input_' + scope.$index"。 3. 在el-input上监听blur事件,当触发时调用方法取消编辑状态。 4. 使用$nextTick确保DOM更新后正确获取refs,因为el-table可能存在渲染延迟的问题。 5. 验证是否正确处理了validate方法,引用[3]指出拼写错误可能导致问题,需要确保方法名正确。 另外,引用[2]提到改用原生DOM的方法,可能需要通过this.$refs.input[0].$el.querySelector('input')来获取原生输入元素并添加事件监听。 总结,需要指导用户在作用域插槽中正确绑定ref和事件,使用blur事件触发状态变更,并处理可能由于动态渲染导致的ref获取问题。同时,提醒用户检查方法名拼写和使用$nextTick确保DOM就绪。</think>### 分步实现表格行编辑模式与焦点取消 根据Element-UI表格组件和Vue的$refs特性,结合焦点事件blur)实现编辑模式控制,步骤如下: #### 1. 定义可编辑单元格的模板 ```html <el-table :data="tableData" ref="editableTable"> <el-table-column prop="name"> <template #default="scope"> <el-input v-if="scope.row.isEditing" v-model="scope.row.name" :ref="'input_' + scope.$index" @blur="handleBlur(scope.row, scope.$index)" ></el-input> <span v-else>{{ scope.row.name }}</span> </template> </el-table-column> </el-table> ``` #### 2. 初始化表格数据状态 ```javascript data() { return { tableData: [ { id: 1, name: 'Ite
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值