如果鼠标悬停在不同的div上,我会显示一个div,然后当鼠标离开div时隐藏。
在我的mousemove
回调函数中,我说
$('#divToShow').show()
,但是我想知道这是否效率低,因为mousemove
事件经常被触发,如果已经显示了div,那么它无缘无故地调用show()
。
检查div是否隐藏,然后只显示它会更有效吗?像这样:
if ($('#divToShow').is(":hidden")){
$('#divToShow').show();
}
或者另一个解决方案是在第一次显示div时将布尔变量设置为true,然后在mouseleave
上设置为false。
有没有人有关于在mousemove
函数中显示div的有效方法的任何信息?
答案 0 :(得分:2)
由于您正在使用Jquery,更有效的方法是使用.hover(handlerIn, handlerOut)回调,因此您不必担心创建标记或类似内容。
当鼠标在目标handlerIn
上输入时,div
只会被触发一次(正如您在console.log('show')
电话中看到的那样)。当鼠标离开目标handlerOut
时,div
也只会被执行一次。
在下面的示例中,当鼠标悬停#div-b
时,#div-a
内容将可见,当它离开时,内容将被隐藏:
$(function() {
$('#div-b').hover(
function() {
console.log('show');
$('#div-a').show();
},
function() {
console.log('hide');
$('#div-a').hide();
}
);
});

#div-a {
display: none;
padding: 20px;
}
.wrapper {
margin: auto;
background-color: darkcyan;
color: white;
height: 100px;
margin-bottom: 10px;
}
#div-b {
padding: 20px;
height: 50px;
background-color: black;
color: white;
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="wrapper">
<div id="div-a">
I'm visible!
</div>
</div>
<div id="div-b">
Hover me
</div>
&#13;
答案 1 :(得分:1)
使用mouseEnter设置标志(或只显示),在mouseLeave上将标志设置为相反的值(或者只是隐藏)。 mouseMove可能不是最好的事件,因为它可能会被激发超过预期。如果您只想显示和隐藏元素,您甚至可能无法跟踪标记。
答案 2 :(得分:1)
首先,我让你检查source code of $.fn.show
,最后,看看我的回答:
show: function() {
return showHide( this, true );
}
showHide
源代码是:
function showHide( elements, show ) {
var display, elem, hidden,
values = [],
index = 0,
length = elements.length;
for ( ; index < length; index++ ) {
elem = elements[ index ];
if ( !elem.style ) {
continue;
}
values[ index ] = dataPriv.get( elem, "olddisplay" );
display = elem.style.display;
if ( show ) {
// Reset the inline display of this element to learn if it is
// being hidden by cascaded rules or not
if ( !values[ index ] && display === "none" ) {
elem.style.display = "";
}
// Set elements which have been overridden with display: none
// in a stylesheet to whatever the default browser style is
// for such an element
if ( elem.style.display === "" && isHidden( elem ) ) {
values[ index ] = dataPriv.access(
elem,
"olddisplay",
defaultDisplay( elem.nodeName )
);
}
} else {
hidden = isHidden( elem );
if ( display !== "none" || !hidden ) {
dataPriv.set(
elem,
"olddisplay",
hidden ? display : jQuery.css( elem, "display" )
);
}
}
}
// Set the display of most of the elements in a second loop
// to avoid the constant reflow
for ( index = 0; index < length; index++ ) {
elem = elements[ index ];
if ( !elem.style ) {
continue;
}
if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
elem.style.display = show ? values[ index ] || "" : "none";
}
}
return elements;
}
您不需要检查它是否隐藏$().is(':hidden')
,因为它已在show
函数中检查过(请参阅:if ( elem.style.display === "" && isHidden( elem ) ) { ....
)
答案 3 :(得分:1)
更好的解决方案是使用下面的代码段mouseEnter
和mouseLeave
:
这是在javaScript中,但会给你一个更好的主意。如果你想在JQuery中使用它并遇到问题,我可以在Pluncker上为你编写它。希望这会有所帮助
function show_hide(id) {
var e = document.getElementById(id);
if (e == null){
} else {
if (!e.classList.contains('showClass'))
e.className += " showClass";
else
e.className = "myclass";
}
}
.myclass {
opacity: 0;
margin-top: 25px;
font-size: 21px;
text-align: center;
-webkit-transition: opacity 1s ease-in;
-moz-transition: opacity 1s ease-in;
-o-transition: opacity 1s ease-in;
-ms-transition: opacity 1s ease-in;
transition: opacity 1s ease-in;
}
.showClass{ opacity: 1 }
<div onmouseover="show_hide('deletebutton')" onmouseout="show_hide('deletebutton')">
// image
<div class="myclass" id="deletebutton">DELETE</div>
</div>
function show() {
$("#deletebutton").show();
}
function hide() {
$("#deletebutton").hide();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<div onmouseover="show()" onmouseout="hide()">
// image
<div class="myclass" id="deletebutton" style="display:none;">DELETE</div>
</div>
答案 4 :(得分:1)
您不能使用.hover()
和.toggle()
功能吗?是mousemove
必须吗?