3

我编写了一个简单的 jQuery (1.4.2) UI (1.8) 小部件,它嵌入了一个 jQuery UI 日期选择器。我想检测用户何时在我的小部件外部单击,在这种情况下它应该自动隐藏自己。我的代码大致如下:

var self = this;
$(document).bind("click.mywidget": function(event) {
    var target = event.target;
    if (!self.container.has(target).length && target != self.container.get(0)) {
        self.hide();
    }
});

单击日期选择器中的日期或月份上一个/下一个按钮时会出现问题。出于某种原因,即使 Firebug 将这些元素显示为我的容器的后代,has() 检查也会失败。

发生了什么,我该如何解决这个问题?

4

1 回答 1

4

在深入挖掘了 datepicker 源代码后,我意识到发生了什么。显然,每当您单击日期或循环几个月时,它都会清空整个 div 并重新创建它。

由于选取器在 DOM 中更靠后,它首先处理点击事件。到调用文档处理程序时,目标元素不再位于 DOM 中,因此不再是容器的后代。

我匆忙的 hack 是检查目标的更直接的父母,看看他们中的任何一个是否是日期选择器表或标题。由于这个小部件是迄今为止我唯一使用的 datepicker,我可以假设点击这样的元素不应该算作容器外的点击。

一旦我想出一个真正的解决方案,我会更新这个答案。

于 2010-08-26T00:59:18.993 回答