多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > web前端 > htmlcss > 解決blur與click沖突

解決blur與click沖突

來源:程序員人生   發布時間:2016-08-11 08:43:09 閱讀次數:2916次

在開發中我們會常常遇到blur和click沖突的情況。下面敘述了開發中常遇到的“下拉框”的問題,并提供了兩種解決方案。

1、blur和click事件簡述

  • blur事件:當元素失去焦點時觸發blur事件;其為表單事件,blur和focus事件不會冒泡,其他表單事件都可以。
  • click事件:當點擊元素時觸發click事件;所有元素都有此事件,會產生冒泡。

示例1:blur事件為表單事件

<input type="text" id="tel"> <script> document.addEventListener("blur", function(){ console.log("my document blur"); }); var ipt = document.getElementById("tel"); ipt.addEventListener("blur", function(){ console.log("my input blur"); }); </script> // 輸出結果:document為非表單元素 my input blur

示例2:click事件可冒泡

<input type="text" id="tel"> <script> document.addEventListener("click", function(){ console.log("my document click"); }); var ipt = document.getElementById("tel"); ipt.addEventListener("click", function(){ console.log("my input click"); }); </script> // 輸出結果: my input click my document click

示例3:點擊某元素致使前1個元素失去焦點,blur事件優先于click事件

<input type="text" id="ipt"> <input type="button" id="btn" value="點我"> <script> var ipt = document.getElementById("ipt"); ipt.addEventListener("blur", function(){ console.log("my input blur"); }); var btn = document.getElementById("btn"); btn.addEventListener("click", function(){ console.log("my button click"); }); </script> // 輸出結果: my input blur my button click

2、下拉框blur和click事件沖突,致使不能正常選擇值

實際開發中,我們會常常遇到某1下拉列表框,點擊其他元素消失列表框;點擊下拉框子元素使其生效的需求。這就會面臨沖突問題。

<!-- DOM結構示意 --> <input type="text" placeholder="請選擇姓氏" readonly> <div class="search-list" data-status="hide"> <ul> <li><a href="javascript:"></a></li> <li><a href="javascript:"></a></li> <li><a href="javascript:"></a></li> <li><a href="javascript:"></a></li> </ul> </div>
/** 說明: * 目前通過ul外層div自定義屬性“data-status”控制其是不是顯示 */ (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").click(function(){ console.log("履行"); $("input").val($(this).text()); }); })(jQuery);

履行上述代碼,會出現1個問題,其實不能正確獲得下拉框中某值。
緣由:由于JavaScript為單線程,同1時間只能履行處理1個事件。由上述示例3,可得知“blur優先于click履行”。而在本示例中,由于blur處理程序,會將對應的下拉框展現區隱藏,所以致使其后續click事件其實不會履行。上述console的信息也不會被輸出。

解決方案1:對blur事件進行延遲,讓click先履行。

(function($){ $("input").focus(function(){ // input框獲得焦點,展現下拉框 $(".search-list").attr("data-status", "show"); }).blur(function(){ setTimeout(function(){ // input框失去焦點,隱藏下拉框 $(".search-list").attr("data-status", "hide"); }, 300); }); // 選擇對應選項,并賦值給input框 $(".search-list li a").click(function(){ console.log("履行"); $("input").val($(this).text()); }); })(jQuery);

3、使用mousedown讓其優先履行

示例4:將示例3中的click事件改成mousedown

<input type="text" id="ipt"> <input type="button" id="btn" value="點我"> <script> var ipt = document.getElementById("ipt"); ipt.addEventListener("blur", function(){ console.log("my input blur"); }); var btn = document.getElementById("btn"); btn.addEventListener("mousedown", function(){ console.log("my button mousedown"); }); </script> // 輸出結果: my button mousedown my input blur
  • mousedown事件:當鼠標指針移動到元素上方,并按下鼠標按鍵時,會產生mousedown事件。
  • mouseup事件:當在元素上放松鼠標按鈕時,會產生mouseup事件。
    注意
    (1)mousedown與click 事件不同,mousedown事件僅需要按鍵被按下,而不需要松開便可產生。
    (2)mouseup與click事件不同,mouseup事件僅需要放松按鈕。當鼠標指針位于元素上方時,放松鼠標按鈕就會觸發該事件。

補充:mousedown、mouseup、click

<input type="button" id="btn" 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);
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 成在线人免费视频一区二区三区 | 亚洲a免费| 亚洲一区二区三区高清网 | 性欧美video在线播放 | 欧美系列第一页 | 国产精品国产三级国产在线观看 | 亚洲欧美日韩在线精品一区二区 | www高清视频 | 亚洲综合二区 | 亚洲在线中文 | 天天鲁天天爱天天鲁天天 | 天天爱综合网 | 波多野结衣免费免费视频一区 | 亚洲精品亚洲人成在线播放 | 中国黄色毛片 大片 | 久久精品嫩草影院免费看 | 精品久久中文字幕有码 | 69国产精品视频免费 | 视频一区二区不卡 | 亚洲一区二区三区四区 | 意大利一级毛片 | 伊人性 | 伊人久久大香线蕉资源 | 亚洲国产综合精品中文第一区 | 一本伊大人香蕉久久网手机 | 中文国产成人精品久久96 | 在线观看网 | 日本一区二区三区在线 视频 | 日韩欧美一二三区 | 在线观看美女网站 | 国产一级精品视频 | 欧美高清精品videossex | 精品视频在线观看一区二区三区 | 狂野欧美激情性xxxx | 免费簧网站永久在线播放国产 | 999精品影视在线观看 | 爱操在线视频 | 人人爱人人爽 | 国产精品无码久久av | 欧美成人在线免费 | www.色网站|