在主流的搜索引擎上搜索時,輸入內容,往往會彈出智能提示。輸入框为input,智能提示區域为suggest。接下來一般有兩種操作: 1.選擇某一提示,則把內容复制到input中,自動關閉suggest; 2.點擊網頁其他地方,自動關閉suggest。
實現第一個可以用click事件,在suggest中增加鼠標click事件,在處理中將點擊的內容寫到input中,然後關閉suggest。單獨測試無問題; 實現第二個可以在input元素上增加focusout事件或者blur事件,在input中丟失焦點的時候,關閉suggest。單獨測試無問題。
但是放在一起的時候,就會出現問題,只響應了丟失焦點事件(關閉了suggest),卻沒有響應內容點擊事件(沒有獲取點擊的suggest內容)。 不明白为什麼會沖突,在網上搜,也搜到了一些同样的問題,有人建議使用blur,但是blur跟focusout是一样的道理,都不行。
思前想後,忽然想到click事件的觸發條件,你點擊一個按鍵,觸發一次點擊事件,而一次點擊包括:鼠標點下去,鼠標松開。而jquery的click事件是鼠標松開後才觸發的(事實上button元素和href元素的點擊事件都是這样),這样一想就明白剛剛出現的沖突問題了,你點中suggest中的某一提示,這時候input丟失焦點事件觸發,關閉了suggest區域,而這個時候你的鼠標才松開(電腦反應速度要快於鼠標點擊松開速度),完成點擊,但此時鼠標已經不在suggest要選擇的提示上面了,所以也就無法觸發suggest裏的點擊事件。
想明白了這點,問題就好解决了,把suggest中的響應事假改成mousedown,這样在鼠標點的時候就會觸發,測試了一下,果然成功了,mousedown事件和focusout事件都得到了正確處理。 //input的丟失焦點事件 $("#input_area").focusout(function(){ $("#suggest_div").hide(); }); //suggest區域的點擊事件 $("#suggest_div li").mousedown(function(){ $("#input_area").val($(this).text()); $("#suggest_div").hide(); });
將click換成mousedown就完全ok了,簡單到我都不好意思說,但是有的時候,也不容易想到哇!
另外,在網上還找到了別的方法,一個是 $("#input_area").keypress(function() { $("#suggest_div").slideDown(); }).blur(function() { $("#suggest_div").slideUp(); });
這種方法用隱藏動畫造成了延遲,使得suggest區域的click事件可以觸發。但是slide可不适應所有情況,而且把功能成功與否建立在動畫隱藏的速度快慢上,個人覺得也不太合适。
另一種方法是將input和suggest用一個div包起來,事件直接加在div上面。這個未測試過,不過理論上應該也是可行的。 |
搜索提示時jquery的focusout和click事件沖突問題完美解决
时间: 2024-12-22 22:13:38
搜索提示時jquery的focusout和click事件沖突問題完美解决的相关文章
轉:Jquery绑定img的click事件
用JQUERY给IMG element绑定click事件的时候,直接用img.click(function(){...})不起作用,如下面代码$("img.ms-rteImage-LightBox").click(function(){ SP.UI.ModalDialog.showModalDialog({ url: $(this).attr("src"), title: $(this).attr("
jquery中on绑定click事件在苹果手机失效的问题
因为是动态添加的内容,所以想要使用click事件,需要给他用on绑定一下: $(document).on("click",".next_button",function(){ alert(); });
关于jquery中on绑定click事件在苹果手机失效的问题
用一个div当做了一个按钮来使用. <div class="button"> <div class=" next_button button_left btn_red" style="width: 345px;"> 下一步 </div> </div> 因为是动态添加的内容,所以想要使用click事件,需要给他用on绑定一下: $(document).on("click",&quo
移动端click事件延迟300ms的原因以及解决办法
这要追溯至 2007 年初.苹果公司在发布首款 iPhone 前夕,遇到一个问题 —— 当时的网站都是为大屏幕设备所设计的.于是苹果的工程师们做了一些约定,应对 iPhone 这种小屏幕浏览桌面端站点的问题.这当中最出名的,当属双击缩放(double tap to zoom).这也是会有上述 300 毫秒延迟的主要原因. 当用户一次点击屏幕之后,浏览器并不能立刻判断用户是要进行双击缩放,还是想要进行单击操作.因此,iOS Safari 就等待 300 毫秒,以判断用户是否再次点击了屏幕. 于是,
移动端click事件延迟300ms的原因以及解决办法[转载]
原文: 这要追溯至 2007 年初.苹果公司在发布首款 iPhone 前夕,遇到一个问题 —— 当时的网站都是为大屏幕设备所设计的.于是苹果的工程师们做了一些约定,应对 iPhone 这种小屏幕浏览桌面端站点的问题.这当中最出名的,当属双击缩放(double tap to zoom).这也是会有上述 300 毫秒延迟的主要原因. 当用户一次点击屏幕之后,浏览器并不能立刻判断用户是要进行双击缩放,还是想要进行单击操作.因此,iOS Safari 就等待 300 毫秒,以判断用户是否再次点击了屏幕.
JQuery给元素绑定click事件多次执行的解决方法
原绑定方法: $(".subNavdiv").click(function () { ###### }); 这种方法只会在原click方法中继续添加新方法: 解决办法更改绑定方法为: $("#sdfsd").unbind("click").click(function(e){ ###### }); 在绑定新click方法前对元素所绑定的click方法解绑
EasyUi中的datagird中a标签的click事件无法触发?(未解决)
***************************2015-10-29 21:07************************* 问题如下: datagrid最后一列编辑中有如下a标签 { field: "编辑", title: "编辑", width: 100, align: "center", //value表示字段值,row表示当前行的值,index表示当前行的索引 formatter: function (value, row,
html中的click事件被触发两次如何解决
//1:用中间变量处理var b=true;function(){ if(b){ b=false; //-你的代码块 }}//2用jq处理:$("#btnbgm").one("click",function(){ _click($(this));});function _click(obj){ //你的代码块 settimeOut(function(){ $("#btnbgm").one("click",function(){
jQuery中click事件多次触发解决方案
jQuery 中元素的click事件中绑定其他元素的click事件. 因为jQuery中的click事件会累计绑定,导致事件注册越来越多. 解决方案: 1.能够避开,避免把click事件绑定到其他元素的例如click,hover等事件中. 2.不能避开,使用unbind("click"),然后再bind("click").