在用户点击时,我想获得所有在点击的位置的元素的列表。
例如,如果用户点击此处Hello
:
<div><span>Hello<span></div>
我想得到以下列表:
<span>
元素<div>
元素<body>
元素<html>
元素获取这些元素最简单的方法是什么?
答案 0 :(得分:13)
编辑:根据澄清,我认为这就是您的意思:
编辑:正如 @Misha 指出的那样,outerWidth()
和outerHeight()
应该用来代替width()
和{ {1}}以获得准确的height()
。
此外,如果没有什么可以阻止页面上的事件冒泡,那么range
应放在click
上,因为它将更多更高效。即使某个其他document
处理程序阻止了冒泡,您仍然应该在click
上使用click
,并且只是从那些阻止冒泡的处理程序中单独处理它。
示例: http://jsfiddle.net/57bVR/3/
document
原始回答:
这将为您提供包含范围的标签名称数组。无法确定这是否是你想要的。
它使用.parents()
和.andSelf()
来获取元素,然后使用.map()
和.get()
来创建数组。
示例: http://jsfiddle.net/9cFTG/
$(document).click(function(e) {
var clickX = e.pageX
,clickY = e.pageY
,list
,$list
,offset
,range
,$body = $('body').parents().andSelf();
$list = $('body *').filter(function() {
offset = $(this).offset();
range = {
x: [ offset.left,
offset.left + $(this).outerWidth() ],
y: [ offset.top,
offset.top + $(this).outerHeight() ]
};
return (clickX >= range.x[0] && clickX <= range.x[1]) && (clickY >= range.y[0] && clickY <= range.y[1])
});
$list = $list.add($body);
list = $list.map(function() {
return this.nodeName + ' ' + this.className
}).get();
alert(list);
return false;
});
如果您只是想要元素而不是标记名称,请删除var list;
$('span').click(function() {
list = $(this).parents().andSelf().map(function() {
return this.nodeName;
}).get();
alert(list);
});
和.map()
。
或者如果您想使用某种分隔符将Array加入String,只需在.get()
之后添加.join(" ")
,将分隔符放在引号内。
答案 1 :(得分:9)
在未来附近,这应该是可能的:
$(document).click(function(e) {
var family = this.elementsFromPoint(e.pageX, e.pageY);
$(family).each( function () {
console.log(child);
});
});
更新2019年
目前在编辑草稿中:
的 Elements from point 强>
答案 2 :(得分:0)
jQuery parents()函数可以为您完成此任务。
将点击事件附加到所有span
代码,例如:
$("span").click(function() {
var parents = "";
$(this).parents().map(function () {
parents = parents + " " + this.tagName;
})
alert(parents);
});
答案 3 :(得分:0)
使用parent方法递归或循环获取当前标记的父级:
var parentTag = $(this).parent().get(0).tagName;
答案 4 :(得分:0)
尝试这样的事情
$('span').click(function() {
var parents = $(this).parents();
for(var i = 0; i < parents.length; i++){
console.log($(parents[i]).get(0).tagName)
}
});
查看现场演示
答案 5 :(得分:0)
只是javascript实现:
window.addEventListener('click', function(e){
console.log(document.elementFromPoint(e.pageX, e.pageY))
}, false)
3-29-2017
为firefox和chrome工作答案 6 :(得分:-1)
我更新了演示http://jsfiddle.net/57bVR/3/,并在代码中添加了要管理的逻辑(如果存在):
$(document).click(function (e) {
var htmlZoom = window.getComputedStyle(document.getElementsByTagName('html')[0]).getPropertyValue('zoom');
var clickX = e.pageX,
clickY = e.pageY,
list,
$list,
offset,
range,
$body = $('body').parents().andSelf();
$list = $('body *').filter(function () {
offset = $(this).offset();
marginLeft = offset.left * htmlZoom - $(document).scrollLeft();
marginTop = offset.top * htmlZoom - $(document).scrollTop();
outerWidth = $(this).outerWidth() * htmlZoom;
outerHeight = $(this).outerHeight() * htmlZoom;
range = {
x : [marginLeft,
marginLeft + outerWidth],
y : [marginTop,
marginTop + outerHeight]
};
return (clickX >= range.x[0] && clickX <= range.x[1]) && (clickY >= range.y[0] && clickY <= range.y[1])
});
$list = $list.add($body);
list = $list.map(function () {
return this.nodeName + ' ' + this.className
}).get();
alert(list);
return false;
});