jQuery:突出显示鼠标光标下的元素?
可能重复:jQuery:突出显示鼠标光标下的元素?,jquery,Jquery,可能重复: 我正试图在jQuery中创建一个“元素选择器”,就像Firebug一样。基本上,我想突出显示用户鼠标下方的元素。以下是我目前得到的,但效果不太好: $('*').mouseover(function (event) { var $this = $(this); $div.offset($this.offset()).width($this.width()).height($this.height()); return false; }); var $di
我正试图在jQuery中创建一个“元素选择器”,就像Firebug一样。基本上,我想突出显示用户鼠标下方的元素。以下是我目前得到的,但效果不太好:
$('*').mouseover(function (event) {
var $this = $(this);
$div.offset($this.offset()).width($this.width()).height($this.height());
return false;
});
var $div = $('<div>')
.css({ 'background-color': 'rgba(255,0,0,.5)', 'position': 'absolute', 'z-index': '65535' })
.appendTo('body');
看起来他们正在使用标准的div+css来绘制它。。。。。只是要弄清楚他们现在是如何处理这些事件的。。。(此文件的长度为28K行)
还有这个片段,我猜它检索到了合适的对象。。。。虽然我不知道怎么做。他们正在寻找一个类“objectLink元素”。。。我不知道这个“重新对象”是什么
我在想,也许当highlighter节点触发mousemove或mouseover事件时,我可以通过某种方式传递它?也许是为了让它覆盖
如果我把一个不可见的元素放在每个元素上面,z指数比荧光笔高,但给荧光笔一个比实际元素高的z指数。。。理论上,它应该是有效的。不可见的元素将触发鼠标事件,但高光效果看起来仍然像实际元素的叠加
这意味着我刚刚将DOM元素增加了一倍,而且位置必须正确。除非我只“提升”荧光灯当前覆盖的元素??但这仍然可能是每个元素><有人帮帮我 当您将鼠标移到上方时,整个页面就会变红的原因是您的代码与
body
元素的mouseover
事件相匹配。您可以通过只选择body
的子项来阻止这种情况的发生
$('body *').bind( //...
在一个包含大量元素的页面上,您会遇到性能问题,尽管bind会为每个匹配的元素附加一个侦听器。试着看看jQuery的事件委派api(.delegate()
),它允许您侦听传播到根元素的事件,也适用于鼠标事件。不那么烦躁,但是,如果不先将鼠标完全移出父元素,它就无法检测到从父元素移动到其子元素之一
var $div = $('<div id="highlighter">').css({
'background-color': 'rgba(255,0,0,.5)',
'position': 'absolute',
'z-index': '65535'
}).hide().prependTo('body');
var $highlit;
$('*').live('mousemove', function(event) {
if (this.nodeName === 'HTML' || this.nodeName === 'BODY')
{
$div.hide();
return false;
}
var $this = this.id === 'highligher' ? $highlit : $(this),
x = event.pageX,
y = event.pageY,
width = $this.width(),
height = $this.height(),
offset = $this.offset(),
minX = offset.left,
minY = offset.top,
maxX = minX + width,
maxY = minY + height;
if (this.id === 'highlighter')
{
if (minX <= x && x <= maxX
&& minY <= y && y <= maxY)
{
// nada
}
else
{
$div.hide();
}
}
else
{
$highlit = $this;
$div.offset(offset).width($this.width()).height($this.height()).show();
}
return false;
});
var$div=$('').css({
“背景色”:“rgba(255,0,0,5)”,
'位置':'绝对',
“z索引”:“65535”
}).hide().prependTo('body');
var$highlight;
$('*').live('mousemove',函数(事件){
if(this.nodeName=='HTML'| | this.nodeName==='BODY')
{
$div.hide();
返回false;
}
var$this=this.id=='highligher'?$highlight:$(this),
x=event.pageX,
y=event.pageY,
宽度=$this.width(),
高度=$this.height(),
偏移量=$this.offset(),
minX=offset.left,
minY=offset.top,
最大值=最小值+宽度,
最大值=最小值+高度;
如果(this.id==='highlighter')
{
如果(minX),我可以建议一种替代方法吗
只需为页面的所有子元素指定一个背景色
,然后在hover()
上调整该元素的背景色
,以增加其对比度,怎么样
$('html').children().css('background-color','rgba(0,0,0,0.2)');
$('body').children().hover(
function(){
$(this).css('background-color','#fff');
},
function(){
$(this).css('background-color','rgba(0,0,0,0.2)');
});
.修改David的答案,使其正确还原词尾的背景色
$('body *').live('mouseover mouseout', function(event) {
if (event.type == 'mouseover') {
$(this).data('bgcolor', $(this).css('background-color'));
$(this).css('background-color','rgba(255,0,0,.5)');
} else {
$(this).css('background-color', $(this).data('bgcolor'));
}
return false;
});
所有这些答案都太复杂了…简单的解决方案:
Javascript:
prevElement = null;
document.addEventListener('mousemove',
function(e){
var elem = e.target || e.srcElement;
if (prevElement!= null) {prevElement.classList.remove("mouseOn");}
elem.classList.add("mouseOn");
prevElement = elem;
},true);
Css:
当你尝试做这样的事情时,有一个令人讨厌的第二十二条军规。基本上,当你在鼠标下画东西时,由于鼠标悬停在一个元素上,鼠标实际上离开了原来的元素,现在又悬停在新的元素上。@Matt:那么我们怎么解决这个问题呢?Firebug不是操纵DOM来渲染这些东西吗框,还是它有自己的渲染引擎?当您在Firebug中鼠标悬停在网页中的元素上时,Firebug会高亮显示这些元素-这是独立的。或者,当您使用“单击以检查”时,您会想到这一点吗它只概括了元素,这可能是问题的关键-Firebug可以绘制4个独立的元素,每个元素对应于框的每一个边缘,在这种情况下,我提到的catch-22根本不是问题。+1用于挖掘Firebug源代码-我打算提出这个建议。这并不能真正解决问题(使用body*
),这只是将问题转移到了一个更深层的元素上。请看Matt的评论。现在还不太担心性能,我会选择任何有效的。另外,我不使用live()或delegate()的原因是因为这样会包含将来的元素…也就是说,我不希望它开始选择自己(这就是我在绑定事件后附加它的原因)。您是否尝试检查传递给回调函数的currentTarget的事件对象?如果currentTarget是突出显示的div,则您可以什么都不做。如果我什么都不做,它仍然会阻止实际元素接收事件。(但是是的,这将允许我使用live()
…只要我能解决其他问题)到达那里…仍然需要一些工作。我会看看我能做些什么。这是可能的。如果我找不到解决方案,我可能不得不采用这种方法,但这真的让我感到困扰,因为我知道必须有办法做到这一点。
$('body *').live('mouseover mouseout', function(event) {
if (event.type == 'mouseover') {
$(this).data('bgcolor', $(this).css('background-color'));
$(this).css('background-color','rgba(255,0,0,.5)');
} else {
$(this).css('background-color', $(this).data('bgcolor'));
}
return false;
});
prevElement = null;
document.addEventListener('mousemove',
function(e){
var elem = e.target || e.srcElement;
if (prevElement!= null) {prevElement.classList.remove("mouseOn");}
elem.classList.add("mouseOn");
prevElement = elem;
},true);
.mouseOn{
background-color: #bcd5eb !important;
outline: 2px solid #5166bb !important;
}