我现在还没有足够的声望来发布自己的答案,但在我浪费更多人的时间之前,这是我的答案:
好的,现在我理解为什么我没有得到所有预期的祖先:JQuery日期选择器在单击时会删除父节点(日期选择器头)。在此之后,我的事件在已经被删除的元素的按钮上触发。因此,现在我“陷入”已删除元素的范围内,只能向上遍历到已删除的容器本身。我认为我可以根据这个知识解决我的事件委托问题!8小时后我会将这个作为我的问题的适当答案添加进去!
原始问题/问题: 我已经彻底搜索了stackoverflow、google等网站,但似乎找不到解决方案。
我对这个问题感到非常疯狂: 我有一个JQuery UI日期选择器,它位于一个容器中,如果你在它外面点击,它就会隐藏。 这意味着我需要知道何时在容器内进行交互,以便它不会关闭!在document.click中,我从给定的元素向上遍历,找到我的封闭容器(或满足任何其他条件),允许或拒绝操作。 这个过程非常顺利——也就是说,生成的日期选择器的点击也能正常工作,除了“下一个月”和“上一个月”的按钮。 在以下的fiddle中,我记录了被单击元素的.parents()。 请注意,如果您单击下一个和上一个按钮,document.click将会执行,并关闭容器,日志只会显示按钮的直接父对象。 如果您单击日期选择器中的其他元素,您将看到.parents()将为您提供所有元素,一直到包含html标签的封闭元素。
有人知道如何解决这个问题吗?
我制作了一个简单的示例来展示这个问题... 以下是HTML:
这是脚本:
这是代码片段: http://jsfiddle.net/Px9Ab/ 为了澄清: 是的,我可以将上一页/下一页按钮的类添加到我的条件中,但我更喜欢一个通用解决方案,这样我就可以确保“ $(e.target).parents()”总是向上遍历到html节点。
为什么我不能使用stoppropagation: 在此容器内部和网站的其余部分有很多动态内容。 例如,我正在重新加载依赖于所选日期的元素列表,这些元素也具有事件附加到它们,或者更准确地说,也委托给文档。这就是为什么我不能在容器上停止传播的原因。
任何完全规避我的问题的其他解决方案也是受欢迎的! :)
好的,现在我理解为什么我没有得到所有预期的祖先:JQuery日期选择器在单击时会删除父节点(日期选择器头)。在此之后,我的事件在已经被删除的元素的按钮上触发。因此,现在我“陷入”已删除元素的范围内,只能向上遍历到已删除的容器本身。我认为我可以根据这个知识解决我的事件委托问题!8小时后我会将这个作为我的问题的适当答案添加进去!
原始问题/问题: 我已经彻底搜索了stackoverflow、google等网站,但似乎找不到解决方案。
我对这个问题感到非常疯狂: 我有一个JQuery UI日期选择器,它位于一个容器中,如果你在它外面点击,它就会隐藏。 这意味着我需要知道何时在容器内进行交互,以便它不会关闭!在document.click中,我从给定的元素向上遍历,找到我的封闭容器(或满足任何其他条件),允许或拒绝操作。 这个过程非常顺利——也就是说,生成的日期选择器的点击也能正常工作,除了“下一个月”和“上一个月”的按钮。 在以下的fiddle中,我记录了被单击元素的.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/ 为了澄清: 是的,我可以将上一页/下一页按钮的类添加到我的条件中,但我更喜欢一个通用解决方案,这样我就可以确保“ $(e.target).parents()”总是向上遍历到html节点。
为什么我不能使用stoppropagation: 在此容器内部和网站的其余部分有很多动态内容。 例如,我正在重新加载依赖于所选日期的元素列表,这些元素也具有事件附加到它们,或者更准确地说,也委托给文档。这就是为什么我不能在容器上停止传播的原因。
任何完全规避我的问题的其他解决方案也是受欢迎的! :)