Как получить список всех элементов, находящихся в щелчке?
На клике пользователя я хотел бы получить список всех элементов, которые находятся в в нажатой точке.
Например, если пользователь нажимает на Hello
здесь:
<div><span>Hello<span></div>
Я хотел бы получить следующий список:
-
<span>
элемент
-
<div>
элемент
-
<body>
элемент
-
<html>
элемент
Каким будет самый простой способ получить эти элементы?
Ответы
Ответ 1
РЕДАКТИРОВАТЬ: Основываясь на разъяснении, я думаю, что это то, что вы имеете в виду:
EDIT: Как указано @Misha, вместо width()
и height()
следует использовать outerWidth()
и outerHeight()
, чтобы получить точный range
.
Кроме того, если нечего препятствовать пузырьку событий на странице, то click
следует поместить на document
, поскольку он будет намного более эффективным. Даже если какой-либо другой обработчик click
предотвращает пузырьки, вы все равно должны иметь click
на document
и просто обрабатывать его отдельно от тех обработчиков, которые предотвращают пузырьки.
Пример: http://jsfiddle.net/57bVR/3/
$(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;
});
Оригинальный ответ:
Это даст вам массив имен тегов, включая span. Не могу сказать, действительно ли это то, что вы хотели.
Он использует .parents()
вместе с .andSelf()
, чтобы получить элементы, затем использует .map()
с .get()
для создания массива.
Пример: http://jsfiddle.net/9cFTG/
var list;
$('span').click(function() {
list = $(this).parents().andSelf().map(function() {
return this.nodeName;
}).get();
alert(list);
});
Если вам просто нужны элементы, а не теги, избавиться от .map()
и .get()
.
Или если вы хотите присоединиться к массиву в строку, используя какой-то разделитель, просто добавьте .join(" ")
после .get()
, поместив ваш разделитель внутри кавычек.
Ответ 2
В ближайшее время это должно стать возможным:
$(document).click(function(e) {
var family = this.elementsFromPoint(e.pageX, e.pageY);
$(family).each( function () {
console.log(child);
});
});
Обновление 2019
В настоящее время в редакции проекта:
Элементы из точки
Ответ 3
Функция jQuery parents() может сделать это для вас.
Чтобы прикрепить событие click ко всем тегам span
, например:
$("span").click(function() {
var parents = "";
$(this).parents().map(function () {
parents = parents + " " + this.tagName;
})
alert(parents);
});
Ответ 4
используйте родительский метод, чтобы получить родительский элемент текущего тега рекурсивно или в цикле:
var parentTag = $(this).parent().get(0).tagName;
Ответ 5
Попробуйте что-то вроде этого
$('span').click(function() {
var parents = $(this).parents();
for(var i = 0; i < parents.length; i++){
console.log($(parents[i]).get(0).tagName)
}
});
проверить живое демо
http://jsfiddle.net/sdA44/1/
Ответ 6
Просто реализация javascript:
window.addEventListener('click', function(e){
console.log(document.elementFromPoint(e.pageX, e.pageY))
}, false)
Работала для меня в firefox и chrome по 3-29-2017
Ответ 7
Найдено:
https://gist.github.com/osartun/4154204
Пришлось изменить element.get(i) на элементы [i], чтобы исправить его...
Ответ 8
Я обновил демо http://jsfiddle.net/57bVR/3/, добавив в код логику для управления также (если присутствует):
- Прокрутка страницы
- Тег html уровня увеличения (в проекте, который я выполняю, он дает мне несколько проблем)
$(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;
});