js中事件绑定,$("body").on("click")与$("").click()区别

本文探讨了在jQuery中处理动态元素的点击事件时遇到的问题,并对比了使用element.click和on的不同效果及适用场景。

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

编辑对照:https://jsfiddle.net/
<dl>
     <dt>性别</dt>
     <dd>
            <a href="javascript:void(0);" class="sex_icon set_icon"></a><p>男</p>
            <a href="javascript:void(0);" class="sex_icon set_icon"></a><p>女</p>
            <a href="javascript:void(0);" class="sexon_icon set_icon"></a><p>保密</p>
            </dd>
</dl>

这是一个选择 男、女、保密 的功能
但 下面的 js 一个有问题,一个成功:

有问题、有bug的:

 $(".sex_icon").click(function(){
        $(this).removeClass().addClass("sexon_icon set_icon").siblings("a").removeClass().addClass("sex_icon set_icon");      
    });

    或者是:

    $(".sex_icon").click(function(){
        $(this).removeClass("sex_icon").addClass("sexon_icon").siblings("a").removeClass("sexon_icon").addClass("sex_icon");

    });
下面是成功的、无问题的:

 $("body").on("click",".sex_icon",function(){
         $(this).removeClass("sex_icon").addClass("sexon_icon").siblings("a").removeClass("sexon_icon").addClass("sex_icon");
    });

解析:其实只有两个a标签被绑定了click事件,即男和女的这两个选项前面的a标签。因为它们都有sex_icon的class。代码中的保密选项因为没有sex_icon的class,所以没有被绑定click事件,后来它有了sex_icon的class,那是因为另外两个选项的点击事件代码里面给的。也就是动态给的sex_icon样式。但是element.click这种写法不支持给动态元素或者样式重新绑定事件。

支持给动态元素和属性绑定事件的是live和on,其中live在JQUERY 1.7之后就不推荐使用了。现在主要用on,使用on的时候也要注意,on前面的元素也必须在页面加载的时候就存在于dom里面。动态的元素或者样式等,可以放在on的第二个参数里面。




### Vue.js 中通过 `$refs` 设置 `el-table` 表格滚动位置 在 Vue.js 开发中,当需要操作 DOM 或者组件内部的状态时,可以通过 `$refs` 来访问子组件或原生 DOM 节点。对于 Element Plus 提供的 `<el-table>` 组件来说,设置其滚动条的位置是一个常见的需求。 #### 方法实现 以下是基于 Vue 3 和 Element Plus 的解决方案: 1. **绑定 `ref` 属性** 需要在模板中的 `<el-table>` 上绑定 `ref` 属性以便后续能够通过 `$refs` 进行访问。 2. **调用 `setScrollTop` 方法** 如果目标是将表格滚动到顶部,则可以直接调用 `scrollBarRef.setScrollTop(0)`[^1]。需要注意的是,此方法依赖于组件内部的具体实现逻辑,因此可能因版本不同而有所变化。 3. **处理异步渲染问题** 当使用条件渲染指令(如 `v-if`)控制表格显示隐藏时,可能会遇到无法立即获取到 `$refs.table` 的情况。这是由于 Vue 的响应式机制决定的——DOM 更新存在延迟。此时应借助 `$nextTick()` 确保 DOM 已经完成更新后再执行相关操作[^3]。 下面是完整的代码示例: ```javascript <template> <div> <!-- 绑定 ref --> <el-table v-if="flag" ref="elTableRef"> ... </el-table> <button @click="handleScrollToTop">滚动至顶部</button> </div> </template> <script> export default { data() { return { flag: true, }; }, methods: { handleScrollToTop() { this.$nextTick(() => { const tableInstance = this.$refs.elTableRef; if (tableInstance && tableInstance.$refs.scrollBarRef) { // 调用 setScrollTop 方法使表格回到顶部 tableInstance.$refs.scrollBarRef.setScrollTop(0); } }); }, }, }; </script> ``` 上述代码片段展示了如何安全地利用 `$refs` 对象来操控 `<el-table>` 实现滚动回顶功能,并妥善解决了潜在的同步/异步问题。 --- #### 注意事项 - 若未正确初始化或者销毁阶段尝试访问不存在的 `$refs` 成员变量会抛出错误,请务必确认对应元素已被挂载至页面上再做进一步动作。 - 不同框架版本间 API 可能略有差异,请参照官方文档核实具体细节[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值