<input type="button" value="点我"> var btn = document.getElementById("btn"); btn.addEventListener("mousedown", function(){ console.log("my button mousedown"); }); btn.addEventListener("click", function(){ console.log("my button click"); }); btn.addEventListener("mouseup", function(){ console.log("my button mouseup"); });
输出结果:
my button mousedown
my button mouseup
my button click
所以,其执行顺序为:
mousedown >> mouseup >> click
解决方案2:将click事件改为mousedown,让其优先于blur事件执行
(function($){ $("input").focus(function(){ // input框获取焦点,展示下拉框 $(".search-list").attr("data-status", "show"); }).blur(function(){ // input框失去焦点,隐藏下拉框 $(".search-list").attr("data-status", "hide"); }); // 选择对应选项,并赋值给input框 $(".search-list li a").mousedown(function(){ $("input").val($(this).text()); }); })(jQuery);
补充: js、jquery 中 blur事件和click事件冲突
问题说明:
在表单验证中,我们往往会在输入框失去焦点时触发一个blur事件,但当失去焦点后点击了一个按钮,这时blur事件和click事件就都触发了,由于js是单线程的所以就出现了问题,现在需要让blur先执行验证,然后在触发click事件。
解决方法:
给按钮的click事件设置延迟执行setTimeOut(fn,100),延迟时间的设置要大于blur事件的执行时间,这样就会在blur事件执行完后在执行click事件。