关于自定义input输入框清空方法bug的解决方案
前两天看到一个问题:input 聚焦时 侧边清空按钮(自定义的按钮)要点击两次才能把内容清空。(真机测试时遇到)
原贴:input 聚焦时 侧边清空按钮要点击两次才能把内容清空? - 微信开放社区 https://developers.weixin.qq.com/community/develop/doc/000884e3874360026098031ea5b000
通俗点就是说:自定义了一个清空的按钮,在input输入(聚焦)的时候,点击清空没反应。
这引起我强烈的好奇心了。
先考虑清空的按钮的事件有没有触发。
我感觉是会触发的,因为之前有做过手机号发送验证码的,没试过输入手机号的时候,点击不能触发发送验证码的情况。
测试后,果然,清空的按钮的事件是有触发,方法执行之后(setData),值是有改变了的。
那么问题来了,最后value值为什么没有变化呢?
显然,还有其他的事件触发了,执行了setData。
经过我反复的试验,bindinput触发了。bindinput,原来是它搞的鬼,为什么会触发bindinput?我就不清楚了,要问官方了。
点击清空按钮,同时触发了两个事件,两个同时存到了队列里面,虽然bindtap的方法还未执行,但是参数值已经有了,e.detail.value的值就是原本输入框里面的值。所以,执行完两个事件之后的结果是,input的值没有发生变化,导致大家以为,清空事件没有触发,或者清空事件没有作用。
原因找到了,点击清空的时候,触发了bindinput。为什么会触发呢,怎么让它不触发呢,这就留给小程序去解决吧,不是我们用户能解决的了。我们要解决的是,怎么实现input聚焦时能直接清空。
“只要思想不滑坡,办法总比困难多”。既然找到了原因,那解决办法肯定是会有的。我测试的时候发现,清空方法是比bingtap的方法先执行的,所以想到了一个解决方法:
在data里面声明一个boolean变量值为false,在执行清空方法的时候,赋值为:true,执行bindtap方法的时候,判断该变量,为true就不执行setData操作了,为false则继续。
代码: [图片]
这样做,就算清空方法不是比bingtap的方法先执行的,也不会有影响。简单测试了一下,解决了。
总结:以上就是我对input输入框清空bug的探索过程,解决方法也是我想到的最简单的做法了。因为没有经过大量测试验证,所以不知道会不会有其他问题。要是有bug,或者有其他解决方法,欢迎各位大大留言。