有什么方法可以模仿jQuery的.parents()方法的角度,而不必实际包括jQuery?
最后的目标是获取DOM元素的所有父元素。
编辑:为什么我需要这个?
我正在创建一个指令(一个类似下拉的小部件)。下拉列表应该侦听整个<body>的单击,如果在小部件区域外单击,则关闭自身(如果是打开的)。
现在,我知道如何创建一个简单的指令来侦听鼠标事件,比如这个:
app.directive('mouseTrap', function() {
return function(scope, elem) {
elem.bind('click', function(event) {
scope.$broadcast('click', { event: event } );
});
};
});然后,我会像这样使用...which:<body mouse-trap .... >和
$scope.$on('click', function(msg, obj) {
console.log("click!");
});在这里,我需要检查单击对象的任何父级是否是我的小部件的顶级div,如果不是,则关闭小部件。
发布于 2015-05-25 16:54:17
编辑:虽然这个答案被接受了,但它是不正确的。见下面的评论和更好的答案。
看起来jQLite已经支持这一点了,所以如果您使用的是角度,您应该能够做到这一点,而不需要拉进JQuery本身。
从docs 这里
受支持的实例方法:(指向jQuery文档的链接) jQuery支持的操作的子集目前正在实现。它们都是使用jQuery的链式操作语法来实现的。例如:
$("div.foo").each(function() {
$(this).removeClass("foo").addClass("bar");});
$("div.bar, div.baz").css({ "border": "1px solid red" }).children().addClass("child");
.parent([selector)]
.parents([selector)] 发布于 2015-05-25 16:51:25
Angular的jqLite支持parent()方法,所以您可以让所有的父母都在这样的循环中:
var p = element.parent();
var allParents = [];
while (p.length > 0) {
allParents.push(p[0]);
p = p.parent();
}发布于 2015-05-25 16:50:59
在尝试与角控制器接口时,我不确定您是否希望使用DOM父引用。但是,不知道您的目标是什么,标准方法.parentNode,才是您要寻找的。然后,您必须循环,直到您到达body,或者html,或null。因此,如果您想要本机javascript:
var currentParent = nodeToFindParentsOf.parentNode();
var parents = [];
while(currentParent){
parents.push(currentParent);
currentParent = currentParent.parentNode();
}我也偏执于时间循环。所以倾向于用一个函数来包装整个事情,并在上面加一个安全阀,让我知道发生了什么,以防我的代码或DOM中出现疯狂,所以我会得到一个干净的错误,而不是锁定浏览器。
function getAllParentsOfNode (nodeToFindParentsOf) {
var currentParent = nodeToFindParentsOf.parentNode();
var parents = [];
var safetyCount = 1000;
while(currentParent){
parents.push(currentParent);
currentParent = currentParent.parentNode();
if (--safetyCount === 0) {
throw new Error("Something went wrong. Found 1000+ parents!")
}
}
return parents;
}https://stackoverflow.com/questions/30442576
复制相似问题