我还没有足够的代表来发布我自己的答案,但在我浪费更多人的时间之前:
好吧,我现在明白为什么我没有得到所有预期的祖先:
JQuery datepicker删除父节点(datepicker-head)
单击。在那之后我的事件是在按钮上触发的
已经被删除的元素。所以现在我被“困”在范围内
被删除元素的位置,只能遍历到被删除的元素
容器本身。我想我可以为我的问题找到一个解决方案
具有这些知识的事件委托!
我将在 8 小时内将此添加为我的问题的正确答案! ;)
原来的问题/问题:
我已经在 stackoverflow、google 等上彻底搜索过这个问题,但似乎找不到解决方案。
我对这个问题快要疯了:
我在一个容器中有一个 JQuery UI Datepicker,如果您在容器外部单击,该容器就会隐藏。
这意味着我需要知道容器内何时有交互,这样容器就不会关闭!在 document.click 上,我从给定元素向上遍历以查找封闭容器(或满足任何其他条件)以允许该操作或拒绝该操作。
这就像一个魅力 - 也可以点击生成的日期选择器工作,除了“下个月”和“上个月”按钮。
在下面的小提琴中,我记录了单击元素的 .parents() 。
请注意,如果单击“下一个”和“上一个”按钮,则 document.click 将执行,关闭容器,并且日志将仅显示按钮的直接父级。
如果您单击日期选择器中的其他元素,您将看到 .parents() 将为您提供直到封闭的 html 标签为止的所有元素。
有谁知道如何解决这个问题?
我做了一个简单的例子来展示这一点......
这是 HTML:
<div class="container">
<input type="text" class="myToggleInput" />
<div class="toggleContainer" style="display: none">
<div class="myDatepicker"></div>
</div>
</div>
这是脚本:
$(document).ready(
init()
);
function init() {
$('.myDatepicker').datepicker();
$(document).on('click', '.myToggleInput', function(e) {
$('.toggleContainer').show();
});
$(document).on('click', function(e) {
//Logging the targets parents
//Note that the next and prev buttons only go up one level in the DOM Tree, thus
//not returning all of their parents...
console.log($(e.target).parents());
if ($(e.target).parents('.toggleContainer').length == 0 && !$(e.target).hasClass('myToggleInput')) {
$('.toggleContainer').hide();
}
});
};
这是小提琴:http://jsfiddle.net/Px9Ab/ http://jsfiddle.net/Px9Ab/
澄清:
是的,我可以将下一个/上一个按钮的类添加到我的条件中,但我更喜欢一个通用的解决方案,因此我可以确保 '$(e.target).parents()' 始终遍历到html 节点。
为什么我不能使用 stoppropagation:
这个容器和网站的其余部分内发生了很多动态的事情。
例如,我正在根据所选日期重新加载元素列表,这些元素还附加有事件,或者更确切地说,也委托给文档。这就是为什么我无法停止容器上的传播。
也欢迎任何其他完全绕过我的问题的解决方案! :)