[英]Hide a DIV when it loses focus/blur
我有一個顯示DIV的JavaScript(將其顯示css屬性從'none'設置為'normal'。有沒有辦法讓它集中注意力,以便當我點擊頁面上的其他地方時,DIV失去焦點,它display屬性設置為none(基本上隱藏它)。我正在使用JavaScript和jQuery
對於除了selecteddiv之外的任何頁面上的任何位置隱藏div
$(document).not("#selecteddiv").click(function() {
$('#selecteddiv').hide();
});
如果你想隱藏焦點丟失的div或動畫模糊那么
$("#selecteddiv").focusout(function() {
$('#selecteddiv').hide();
});
用動畫
$("#selecteddiv").focusout(function() {
$('#selecteddiv').animate({
display:"none"
});
});
願這對你有所幫助
不幸的是,如果您的網站上有iframe,然后在iframe內部點擊,那么已經提供的示例無效。 將事件附加到文檔只會將其附加到元素所在的同一文檔中。
您也可以將其附加到您正在使用的任何iframe,但如果iframe已從其他域加載內容,則大多數瀏覽器都不允許您這樣做。
執行此操作的最佳方法是復制jQuery UI菜單欄插件中完成的操作。
基本示例HTML:
<div id="menu">Click here to show the menu
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li><a href="#">Item 3</a></li>
</ul>
</div>
而jQuery需要讓它工作:
var timeKeeper;
$('#menu').click(function()
{
$('#menu ul').show();
});
$('#menu ul').click(function()
{
clearTimeout(timeKeeper);
});
$('#menu').focusout(function()
{
timeKeeper = setTimeout(function() {$('#menu ul').hide()}, 150);
});
$('#menu').attr('tabIndex', -1);
$('#menu ul').hide();
它的作用是給菜單一個標簽索引,以便可以認為它具有焦點。 既然你已經完成了,你可以在菜單上使用focusout事件處理程序。 只要被認為失去焦點,就會觸發。 不幸的是,單擊某些子元素將觸發焦點事件(例如單擊鏈接),因此如果單擊任何子元素,我們需要禁用隱藏菜單。
因為在任何子項的click事件之前調用focusout事件,實現此目的的方法是在隱藏元素之前設置一個小超時,然后單擊任何子元素應清除此超時,這意味着菜單不會隱。
$(document).mouseup(function (e)
{
var container = $("YOUR CONTAINER SELECTOR");
if (!container.is(e.target)&& container.has(e.target).length === 0)
{
container.hide();
}
});
關於鼠標點擊,請參閱其他答案。
然而,對於失去焦點, .focusout
不是要附加的事件,而是.focusin
。 為什么? 請考慮以下彈出窗口:
<div class="popup">
<input type="text" name="t1">
<input type="text" name="t2">
</div>
從t1轉到t2會發生什么:
focusout
,它會冒泡到$('.popup').focusout
focusin
,冒泡到$('.popup').focusin
...所以你得到兩種類型的事件,即使焦點完全保留在彈出窗口內。
解決方案類似於使用.click
完成的魔術:
$(document).ready(function() {
$('html').focusin(function() {
$('.popup').hide();
});
$('.popup').focusin(function(ev) {
ev.stopPropagation();
});
});
(旁注:我發現.not(...)
解決方案無法正常運行事件冒泡)。
獎金:工作小提琴點擊我 - 打開彈出窗口,然后嘗試通過輸入選項卡。
你可以點擊body來綁定一個函數,並使用e.target檢查它是否是當前的div(e是事件)
$(document).ready(function () {
$("body").click(function(e) {
if($(e.target).attr('id') === "div-id") {
$("#div-id").show();
}
else {
$("#div-id").hide();
}
});
});
我也在尋找這個,在這里我找到了解決方案https://api.jquery.com/mouseleave/ 。 這對未來的讀者可能有用。
mouseleave事件與mouseout處理事件冒泡的方式不同。 如果在此示例中使用了mouseout,那么當鼠標指針移出Inner元素時,將觸發處理程序。 這通常是不受歡迎的行為。 另一方面,mouseleave事件僅在鼠標離開它所綁定的元素時觸發其處理程序,而不是后代。
$('.menu > li').click(function() {
$(this).children('ul').stop().slideDown('fast',function()
{
$(document).one('click',function()
{
$('.menu > li').children('ul').stop().slideUp('fast');
});
});
});
在觸發mouseup()事件時,我們可以檢查click是在div或者后代內部並相應地采取行動。
$(document).mouseup(function (e) {
var divContent= $(".className");
if(!divContent.is(e.target) && divContent.has(e.target).length === 0) {
$(".className").hide();
}
});
我個人沒有嘗試模糊div,只在輸入等。如果模糊eventhandler工作,它是完美的並使用它。 如果沒有,你可以檢查一下: 當<div>失去焦點時jQuery動畫
使用jQuery,你可以使用hide()
隱藏元素,例如: $("#foo").hide()
隱藏事件偵聽器中的元素:
$("#foo").blur(function() {
$("#foo").hide();
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.