我希望找到一种纯Angular的方式来确定点击的元素是否是另一个元素的子元素。在jQuery中,我会使用has()方法,但除了遍历所有子元素并进行比较外,不确定该如何在Angular中实现。
jQuery:
if($(someelement).has(another)) { };
我希望找到一种纯Angular的方式来确定点击的元素是否是另一个元素的子元素。在jQuery中,我会使用has()方法,但除了遍历所有子元素并进行比较外,不确定该如何在Angular中实现。
jQuery:
if($(someelement).has(another)) { };
你可以换个角度思考。
不要问B是否是A的子代,而是问A是否是B的祖先:
function isAncestor(ancestor, element) {
var parent = element.parentNode;
while (parent && parent!=ancestor) {
parent = parent.parentNode;
}
return parent==ancestor;
}
我把这个放在这里,因为我正在尝试解决同样的问题,并认为即使它不是has()
的严格替代品,对其他人可能有用。
我的第一个解决方案是使用Element.getBoundingClientRect()
。
如果你处理的是矩形目标,你可以将点击事件的x和y与element
(一个angular.element)的边界矩形进行比较。
$document.bind('click', function(evt) {
var x = evt.x,
y = evt.y,
rect = element[0].getBoundingClientRect();
if(x > rect.left && x < rect.right && y > rect.top && y < rect.bottom) {
//you've clicked somewhere in the element
}
});
IE8+可以正常工作,但5-7版本存在一个小bug
http://www.quirksmode.org/dom/w3c_cssom.html
令人烦恼的是,如果您的元素包含其他不影响其宽度/高度的元素,则该方法将无效。但是,您可以使用这个(略微hacky的)解决方案。
link: function(scope, element, attrs) {
var clicked = false;
element.on('click', eClickHandler);
$document.on('click', clickHandler);
function eClickHandler(event) {
clicked = true;
$timeout(function() {
clicked = false;
});
}
function clickHandler(event) {
if(!clicked) {
// click occurred outside
}
}
}
$document
上添加一个点击处理程序呢?这就是下拉切换的工作方式 - 查看代码 - 并且将其添加到弹出窗口插件中应该非常简单(只需两三行代码)。 - Josh David Miller