记录Vue和Jquery混合开发中关于点击事件的一个bug

最近比较急的接手了公司的微信服务号项目,采用的技术栈主要是jq和vue。在项目中之前碰见过jq写的$().on('click',function(){})点击事件不起作用,只能写在vue实例中的methods中,然后用@click去监测。

一直困惑的是这个BUG在不同的页面中有时有,有时没有,而且出现的情况很少。今天工作闲了一点,于是乎专心去琢磨这个问题。

网上百度到的解决方案是这样的,如下图:

于是乎自己试了一下确实可以。代码如下图:

但是回过头来看项目就很奇怪,说的写在JQ的dom加载完成函数中就可以,但是我的具体项目中为什么不行呢?而其他页面的却可以呢?

于是乎开始从繁至简的减少代码,想要减少的如上,页面也简化。jq写的点击事件就是如下的‘伙伴详情’

这一列是v-for生成的,当把dataList直接改为数字后,点击是可以生效的,于是开始考虑是dom渲染问题,之前也这样猜想过,但没有过去验证到底是哪块的问题。

如果dataList是请求后端数据生成的,那可能是时间差上有问题。

于是我在vue实例中的$this.nextTick中和jq点击事件前分别打印时间。得到如下图:

显然jq点击函数被读取时,vue是还没有完成dom更新。虽说$(function() {})代表着jq dom完成之后再去执行里面的代码(所有代码写在这里面),但这是vue和jq的混合开大,对于v-for生成的dom 来说需要等待拿到后端数据并且赋值给实例的dataList才能生成。

所以加载jq点击事件时候,vue的dom还没完成更新,所以就是无效的。点击事件中的选取元素并不能拿到对应的dom元素。

上面的时间差是2毫秒。为了验证以上的猜想,我直接给了10个毫秒的延迟(好像毫秒默认的有效最小是24),然后jq写的点击事情就有用了。

 

总结:较好的写法还是通过vue的methods来写点击事件,不推荐jq写。或者只能这样了(form_vm是vue实例)

反思:对于在之前的页面中写的有效的jq点击事件可能是页面内容较少,拿的数据较少。但是个人总感觉可能其他地方还是有问题,或者说我的这个解决方法只是凑巧而已,甚至可能是错误的。所以若是您有任何指正的地方,欢迎留言!!!

 

转载于:https://www.cnblogs.com/hjj2ldq/p/8193860.html

以下是一个简单的仿微信聊天记录展示页面的HTML代码,使用Vue.js和jQuery.scrollbar插件实现滚动条: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>仿微信聊天记录展示页面</title> <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/jquery.scrollbar/0.2.11/jquery.scrollbar.min.css"> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { background-color: #f2f2f2; font-family: 'Helvetica Neue', sans-serif; font-size: 14px; } .chat-box { max-width: 600px; margin: 20px auto; background-color: #fff; border-radius: 5px; box-shadow: 0px 0px 5px #ccc; overflow: hidden; } .chat-item { display: flex; align-items: flex-start; padding: 10px; border-bottom: 1px solid #eee; } .avatar { width: 40px; height: 40px; margin-right: 10px; border-radius: 50%; overflow: hidden; } .avatar img { width: 100%; height: 100%; object-fit: cover; } .content { flex: 1; } .name { font-weight: bold; margin-bottom: 5px; } .message { word-break: break-all; margin-bottom: 5px; } .time { color: #999; font-size: 12px; } </style> </head> <body> <div id="app"> <div class="chat-box"> <div class="chat-item" v-for="(item, index) in chatList" :key="index"> <div class="avatar"> <img :src="item.avatar" alt=""> </div> <div class="content"> <div class="name">{{ item.name }}</div> <div class="message">{{ item.message }}</div> <div class="time">{{ item.time }}</div> </div> </div> </div> </div> <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/jquery.scrollbar/0.2.11/jquery.scrollbar.min.js"></script> <script> var app = new Vue({ el: '#app', data: { chatList: [ { avatar: 'https://via.placeholder.com/50', name: 'Alice', message: 'Hello, how are you?', time: '2021-09-01 10:00:00' }, { avatar: 'https://via.placeholder.com/50', name: 'Bob', message: 'I\'m fine, thanks. And you?', time: '2021-09-01 10:01:00' }, { avatar: 'https://via.placeholder.com/50', name: 'Alice', message: 'I\'m good too.', time: '2021-09-01 10:02:00' }, { avatar: 'https://via.placeholder.com/50', name: 'Bob', message: 'That\'s great.', time: '2021-09-01 10:03:00' } ] }, mounted: function() { // 初始化滚动条 $('.chat-box').scrollbar(); } }); </script> </body> </html> ``` 在这个示例,我们使用Vue.js的v-for指令来循环渲染聊天记录列表,并使用jQuery.scrollbar插件来实现滚动条。我们还添加了一些简单的CSS样式来美化页面。在Vue实例的mounted钩子函数,我们对.chat-box元素进行了滚动条初始化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值