搜索框的模糊事件与 搜索框提示框文本替换的点击事件冲突记录
当点击 li 时,input 会先触发 blur 事件(失去焦点),导致 ul 被隐藏(display: none),然后 li 的点击事件才触发,但此时 ul 已经不可见了,所以 li 的点击无法生效。
代码如下
<body>
<div class="outer">
<div>
<input type="text" placeholder="小米笔记本">
</div>
<ul>
<li>全部商品</li>
<li>小米11</li>
<li>小米10S</li>
<li>小米笔记本</li>
<li>小米手机</li>
<li>黑鲨4</li>
<li>空调</li>
</ul>
</div>
<script>
const input = document.querySelector('.outer input')
const ul = document.querySelector('.outer ul')
const liList = document.querySelectorAll('.outer ul li')
input.addEventListener('focus',function(){
ul.style.display = 'flex'
input.style.borderColor = 'orange'
ul.style.borderColor = 'orange'
})
input.addEventListener('blur',function(){
ul.style.display = 'none'
input.style.borderColor = 'black'
ul.style.borderColor = 'black'
})
for(let i =0;i<liList.length;i++){
liList[i].addEventListener('click',function(){
input.value = liList[i].innerText
})
}
</script>
</body>
以下是解决方法:
方法 1:使用 mousedown 代替 click
mousedown 事件在 blur 之前触发,可以确保在 ul 隐藏前完成文本替换:
for (let i = 0; i < liList.length; i++) {
liList[i].addEventListener('mousedown', function(e) {
e.preventDefault(); // 阻止默认行为(可选)
input.value = this.innerText;
});
}
方法 2:延迟隐藏 ul
在 blur 事件中加一个短暂延迟,确保 click 事件先执行
方法 3:完全由 JavaScript 控制显示/隐藏
运用事件对象属性 e.currentTarget 判断事件触发的对象
document.addEventListener('click', function(e) {
const isClickInside = ul.contains(e.target) || input.contains(e.target);
if (!isClickInside) {
ul.style.display = 'none';
input.style.borderColor = 'black';
ul.style.borderColor = 'black';
}
});
input.addEventListener('focus', function() {
ul.style.display = 'flex';
input.style.borderColor = 'orange';
ul.style.borderColor = 'orange';
});
for (let i = 0; i < liList.length; i++) {
liList[i].addEventListener('click', function() {
input.value = this.innerText;
});
}

浙公网安备 33010602011771号