选择除 div 以外的所有元素不适用于 jQuery
Selecting all elements except for div not working with jQuery
我正在尝试 select 文档中除 #private_chat_menu
元素之外的所有元素,并向它们附加 mouseup 触发函数。但是,无论我是否单击 #private_chat_menu
元素内的 select 框,它都会运行该函数。这是代码:
<script>
$("*:not(#private_chat_menu > *)", "body").mouseup(function(e)
{
var chat_user_container = $('#private_chat_menu');
var chat_container = $('#chat-wrapper');
if (chat_container.css("visibility") == 'visible' && chat_user_container.is(':visible'))
{
chat_user_container.hide();
}
});
</script>
<div id="chat-wrapper">
<div id="private_chat_menu">
<select id="chat_user_select" name="chat_user_select">
<option value="">Select Assigned User</option>
<option value="1">...</option>
<option value="2">...</option>
</select>
</div>
</div>
JSFiddle:http://jsfiddle.net/q0ky2f56/
根据您的要求,如果您将单个事件处理程序附加到 document
并询问引发事件的元素,它会执行得更好(并且逻辑更简单)。如果它是 #private_chat_menu
或其子项,则不做任何工作。像这样:
var $chat_user_container = $('#private_chat_menu');
var $chat_container = $('#chat-wrapper');
$(document).on('mouseup', function(e) {
var $target = $(e.target);
if ($target.is($chat_user_container) || $target.closest($chat_user_container).length)
return;
if ($chat_container.is(':visible') && $chat_user_container.is(':visible')) {
$chat_user_container.hide();
}
});
首先,通过.on()
使用事件委托。比将事件绑定到多个元素更简洁、更易于维护。通过委托,我们将事件绑定一次(到顶级元素,例如 body
),然后,当它 运行 时,确定我们是否希望它继续触发事件的目标元素。
我们可以通过将选择器作为第二个参数传递给 on()
来做到这一点,但在您的情况下,由于关于事件是否应该 运行 的逻辑很重要,它可能在回调中更容易对此进行测试。
关键是要排除 #private_chat_menu
及其 childen/descendents。
$('body').on('mouseup', '*', function(e) {
if ($(this).closest('#private_chat_menu').length) return;
//safe to continue...
});
closest()
说:"does the current or any parent/ancestor elements match the passed selector?" 如果是,我们知道我们不应该允许事件 运行.
我正在尝试 select 文档中除 #private_chat_menu
元素之外的所有元素,并向它们附加 mouseup 触发函数。但是,无论我是否单击 #private_chat_menu
元素内的 select 框,它都会运行该函数。这是代码:
<script>
$("*:not(#private_chat_menu > *)", "body").mouseup(function(e)
{
var chat_user_container = $('#private_chat_menu');
var chat_container = $('#chat-wrapper');
if (chat_container.css("visibility") == 'visible' && chat_user_container.is(':visible'))
{
chat_user_container.hide();
}
});
</script>
<div id="chat-wrapper">
<div id="private_chat_menu">
<select id="chat_user_select" name="chat_user_select">
<option value="">Select Assigned User</option>
<option value="1">...</option>
<option value="2">...</option>
</select>
</div>
</div>
JSFiddle:http://jsfiddle.net/q0ky2f56/
根据您的要求,如果您将单个事件处理程序附加到 document
并询问引发事件的元素,它会执行得更好(并且逻辑更简单)。如果它是 #private_chat_menu
或其子项,则不做任何工作。像这样:
var $chat_user_container = $('#private_chat_menu');
var $chat_container = $('#chat-wrapper');
$(document).on('mouseup', function(e) {
var $target = $(e.target);
if ($target.is($chat_user_container) || $target.closest($chat_user_container).length)
return;
if ($chat_container.is(':visible') && $chat_user_container.is(':visible')) {
$chat_user_container.hide();
}
});
首先,通过.on()
使用事件委托。比将事件绑定到多个元素更简洁、更易于维护。通过委托,我们将事件绑定一次(到顶级元素,例如 body
),然后,当它 运行 时,确定我们是否希望它继续触发事件的目标元素。
我们可以通过将选择器作为第二个参数传递给 on()
来做到这一点,但在您的情况下,由于关于事件是否应该 运行 的逻辑很重要,它可能在回调中更容易对此进行测试。
关键是要排除 #private_chat_menu
及其 childen/descendents。
$('body').on('mouseup', '*', function(e) {
if ($(this).closest('#private_chat_menu').length) return;
//safe to continue...
});
closest()
说:"does the current or any parent/ancestor elements match the passed selector?" 如果是,我们知道我们不应该允许事件 运行.