在同一父元素内单击下拉菜单时不想触发模态
Don't want to trigger modal when clicking inside dropdown inside same parent element
运行这段BootstrapHTML和下面的JS代码,我正在努力不点击时启动模态下拉导航-link(例如标记为已读)。
<ul id="notification_items" class="navi navi-hover">
<!--begin::Item-->
<li id="1f7cbbe4-2345-486a-ab66-b05601f033a9" data-notification-id="1f7cbbe4-2345-486a-ab66-b05601f033a9" data-notification-subject="Some Subject" data-notification-message="And some message" class="notification_item cursor-pointer navi-item">
<div class="pr-10 pl-2 navi-link">
<div class="navi-label mx-5"><span class="label label-dot label-lg label-primary mt-n6"></span></div>
<div class="navi-text">
<span class="font-weight-bolder font-size-lg">Some Subject</span><span class="text-muted"> - And some message</span>
<div class="text-muted font-size-sm">3 hours ago</div>
</div>
<div class="notification_actions dropdown dropdown-inline d-none">
<a href="javascript:;" class="btn btn-sm btn-clean btn-icon btn-hover-transparent-primary mr-2" data-toggle="dropdown" aria-expanded="false"><i class="far fa-ellipsis-h"></i></a>
<div class="dropdown-menu dropdown-menu-sm dropdown-menu-right" style="">
<ul class="navi flex-column navi-hover py-2">
<li class="navi-item"><span data-notification-id="1f7cbbe4-2345-486a-ab66-b05601f033a9" class="notification_mark_as_read navi-link"><span class="navi-icon"><i class="fad fa-comment-check"></i></span><span class="navi-text">Mark as Read</span></span></li>
<div class="dropdown-divider"></div>
<li class="navi-item"><a href="#" class="navi-link" data-toggle="modal"><span class="navi-icon"><i class="far fa-trash-alt text-danger"></i></span><span class="navi-text text-danger">Delete</span></a></li>
</ul>
</div>
</div>
</div>
</li>
<!--end::Item-->
</ul>
以及单击 <li>
时显示模式的简单 JS 代码片段:
$(document).on("click", ".notification_item", function () {
$('#notification').modal('show');
});
我在单击 .notification_actions
时尝试 e.stopPropagation();
最初有效,但显然其他所有事件都不再有效。
您必须使用单击事件的事件参数中的参数:target
和 currentTarget
target
将 return 发生点击的 DOM 元素
最初
currentTarget
将始终是您的处理程序所在的 DOM 元素
附上 -> 在你的情况下 li.notification_item
解决方案是识别发生点击的元素 - target
。有很多方法 - 在您的情况下,您可以通过遍历 DOM 直到根菜单(#notification_items
):
$(document).on("click", ".notification_item", function (e) {
// you traverse up to the root ul, and looking if you are in a dropdown menu
if ($(e.target).closest('.dropdown-menu', '#notification_items').length > 0) {
// You are in a drop down menu -> do nothing
} else {
// you are somewhere else -> trigger the modal
$('#notification').modal('show');
}
});
P.S。此代码检查您是否在 dropdown-menu 中,如果您想检查特定的下拉列表,可以使用特定的选择器。
运行这段BootstrapHTML和下面的JS代码,我正在努力不点击时启动模态下拉导航-link(例如标记为已读)。
<ul id="notification_items" class="navi navi-hover">
<!--begin::Item-->
<li id="1f7cbbe4-2345-486a-ab66-b05601f033a9" data-notification-id="1f7cbbe4-2345-486a-ab66-b05601f033a9" data-notification-subject="Some Subject" data-notification-message="And some message" class="notification_item cursor-pointer navi-item">
<div class="pr-10 pl-2 navi-link">
<div class="navi-label mx-5"><span class="label label-dot label-lg label-primary mt-n6"></span></div>
<div class="navi-text">
<span class="font-weight-bolder font-size-lg">Some Subject</span><span class="text-muted"> - And some message</span>
<div class="text-muted font-size-sm">3 hours ago</div>
</div>
<div class="notification_actions dropdown dropdown-inline d-none">
<a href="javascript:;" class="btn btn-sm btn-clean btn-icon btn-hover-transparent-primary mr-2" data-toggle="dropdown" aria-expanded="false"><i class="far fa-ellipsis-h"></i></a>
<div class="dropdown-menu dropdown-menu-sm dropdown-menu-right" style="">
<ul class="navi flex-column navi-hover py-2">
<li class="navi-item"><span data-notification-id="1f7cbbe4-2345-486a-ab66-b05601f033a9" class="notification_mark_as_read navi-link"><span class="navi-icon"><i class="fad fa-comment-check"></i></span><span class="navi-text">Mark as Read</span></span></li>
<div class="dropdown-divider"></div>
<li class="navi-item"><a href="#" class="navi-link" data-toggle="modal"><span class="navi-icon"><i class="far fa-trash-alt text-danger"></i></span><span class="navi-text text-danger">Delete</span></a></li>
</ul>
</div>
</div>
</div>
</li>
<!--end::Item-->
</ul>
以及单击 <li>
时显示模式的简单 JS 代码片段:
$(document).on("click", ".notification_item", function () {
$('#notification').modal('show');
});
我在单击 .notification_actions
时尝试 e.stopPropagation();
最初有效,但显然其他所有事件都不再有效。
您必须使用单击事件的事件参数中的参数:target
和 currentTarget
target
将 return 发生点击的 DOM 元素 最初currentTarget
将始终是您的处理程序所在的 DOM 元素 附上 -> 在你的情况下li.notification_item
解决方案是识别发生点击的元素 - target
。有很多方法 - 在您的情况下,您可以通过遍历 DOM 直到根菜单(#notification_items
):
$(document).on("click", ".notification_item", function (e) {
// you traverse up to the root ul, and looking if you are in a dropdown menu
if ($(e.target).closest('.dropdown-menu', '#notification_items').length > 0) {
// You are in a drop down menu -> do nothing
} else {
// you are somewhere else -> trigger the modal
$('#notification').modal('show');
}
});
P.S。此代码检查您是否在 dropdown-menu 中,如果您想检查特定的下拉列表,可以使用特定的选择器。