JQuery сообщить, какой элемент находится на
Я пытаюсь создать мини-инструмент инспектора, который просто сообщает о элементе, находящемся над ним, его ID и любых классах, которые у него есть.
Я построил демонстрационную страницу, которая имеет 4 вложенных элемента:
html> body> outerContainer> innerContainer
Мне удалось заставить его работать по моде, он правильно сообщает информацию при переходе от внешних элементов к внутренним элементам, но при движении в обратном направлении сообщаемый элемент является предыдущим.
Чтобы увидеть это в действии - http://jsfiddle.net/sygad/kmJ5s/
<head>
<meta charset="utf-8">
<title>Element Hover</title>
<style>
html {margin:0; padding:40px 20px 0; background:#333; font:0.9em/1.1em "Arial", sans-serif}
body {margin:0; padding:0 0 10px; background:#555}
#outerContainer {margin:20px; padding:0; background:#777; width:240px; height:260px;}
#innerContainer {margin:20px; padding:0; background:#999; width:200px; height:200px;}
p#info {position:absolute; top:0; left:0}
p {margin:0; padding:0; color:white}
</style>
</head>
<body>
<p id="info">Current element: <span></span></p>
<p>Body</p>
<div id="outerContainer">
<p>Outer</p>
<div id="innerContainer">
<p>Inner</p>
</div>
</div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script>
<script>
//Initialise
var nodeName = '';
var ids = '';
var classes = '';
$('*').hover(function(e)
{
//Clear
nodeName = '';
ids = '';
classes = '';
nodeName = $(this).context.nodeName.toLowerCase();
if ($(this).attr('id') != undefined)
{
ids = ' #' + $(this).attr('id');
}
if ($(this).attr('class') != undefined)
{
classes = ' .' + $(this).attr('class');
}
$('p#info span').text(nodeName+ids+classes)
})
</script>
</body>
2 ответа
Решение
Вы должны позаботиться о нижеследующих пунктах,
- Вы должны действительно реализовать это
onmousemove
потому что когда вы перемещаете дочерние элементы внутри родительских элементов и оставляете дочерний элемент, он не обновляется для родительского элемента, поскольку вы никогда не вводите / не покидаете родительский элемент. - Вы должны использовать
e.target
вместоthis
- Уберите глобальные переменные, так как они могут перейти к следующему элементу.
ДЕМО: http://jsfiddle.net/kmJ5s/8/
var nodeName = '';
var ids = '';
var classes = '';
$('*').mousemove(function(e) {
nodeName = '';
ids = '';
classes = '';
var _this = e.target;
nodeName = _this.nodeName.toLowerCase();
if (_this.id) {
ids = ' #' + _this.id;
}
if (_this.className) {
classes = ' .' + _this.className;
}
$('p#info span').text(nodeName + ids + classes)
});