jQuery悬停函数存在问题

jQuery悬停函数存在问题,jquery,Jquery,它的工作原理和它应该的一样,显示div。但它不会隐藏它。我想这不是在callbacl函数中定义的。如何在不必再次从DOM中选择的情况下将其传递到该函数中?我认为这是一个非常基本的javascript问题,我就是搞不懂。为什么不使用mouseenter和mouseleave 或者可能: $('#element').children('ul').children('li').children('a').hover(function(){ var _this = $(this);

它的工作原理和它应该的一样,显示div。但它不会隐藏它。我想这不是在callbacl函数中定义的。如何在不必再次从DOM中选择的情况下将其传递到该函数中?我认为这是一个非常基本的javascript问题,我就是搞不懂。

为什么不使用mouseenter和mouseleave

或者可能:

$('#element').children('ul').children('li').children('a').hover(function(){     
    var _this = $(this);
    _this.siblings('div').show();
},function(){
    _this.siblings('div').hide();
})

如果我没有在第一个函数语句中弄错的话,这是私有的…

为什么不使用mouseenter和mouseleave

或者可能:

$('#element').children('ul').children('li').children('a').hover(function(){     
    var _this = $(this);
    _this.siblings('div').show();
},function(){
    _this.siblings('div').hide();
})

如果我没有在第一个函数语句中弄错的话,这是私有的…

如果元素中的所有链接都在li中,您可以使用$'element>a.调用它们。悬停

试试这个:


$'element>a'.mouseoverfunction{$this.sides'div'.show;}.mouseoutfunction{$this.sides'div.hide;}

如果元素中的所有链接都在li中,则可以使用$'element>a.调用它们。悬停

试试这个:


$'element>a'.mouseoverfunction{$this.sides'div'.show;}.mouseoutfunction{$this.sides'div.hide;}

在您的示例中,您将两个函数作为参数传递给.hover方法,因此您在函数中声明的任何变量都只能在该函数的范围内使用。因此,如果需要在第二个函数中使用_this变量,则需要再次声明它

但在您的情况下,中间变量不应该是必需的,您可以完全忽略它:

$('#element').children('ul').children('li').children('a').hover(function(){ 

    var _this = $(this);
    _this.siblings('div').show();

},function(){

    var _this = $(this);
    _this.siblings('div').hide();
})

在您的示例中,您将两个函数作为参数传递给.hover方法,因此您在函数中声明的任何变量都只能在该函数的范围内使用。因此,如果需要在第二个函数中使用_this变量,则需要再次声明它

但在您的情况下,中间变量不应该是必需的,您可以完全忽略它:

$('#element').children('ul').children('li').children('a').hover(function(){ 

    var _this = $(this);
    _this.siblings('div').show();

},function(){

    var _this = $(this);
    _this.siblings('div').hide();
})

这两种功能都需要:

$('#element').children('ul').children('li').children('a').hover(function(){ 
    $(this).siblings('div').show();
} ,function(){
    $(this).siblings('div').hide();
})
但更好的方法是:

var _this = $(this);
…或者如果您希望避免多次呼叫.sides,您可以执行以下操作:

$('#element > ul > li > a').hover(function(e){ 
    $(this).siblings('div').toggle( e.type === 'mouseenter' );
});

仅供参考:当您执行$this时,您没有从DOM中选择任何内容。这只是对调用处理程序时为您设置的元素的直接引用。

您在两个函数中都需要它:

$('#element').children('ul').children('li').children('a').hover(function(){ 
    $(this).siblings('div').show();
} ,function(){
    $(this).siblings('div').hide();
})
但更好的方法是:

var _this = $(this);
…或者如果您希望避免多次呼叫.sides,您可以执行以下操作:

$('#element > ul > li > a').hover(function(e){ 
    $(this).siblings('div').toggle( e.type === 'mouseenter' );
});

仅供参考:当您执行$this时,您没有从DOM中选择任何内容。这只是对调用处理程序时为您设置的元素的直接引用。

我不知道hover是如何工作的,但如果它使用鼠标悬停,则每次鼠标移动到元素上时都会调用它。实际上。。刚查过。这和使用mouseenter和mouseleave是一样的。因此,请坚持使用您的函数,但请记住在这两个函数中声明它。我不知道hover是如何工作的,但如果它使用mouseover,则每次鼠标移动到元素上时都会调用它。实际上。。刚查过。这和使用mouseenter和mouseleave是一样的。因此,请坚持使用函数,但请记住在这两个函数中都声明这一点。我这样做只是出于性能原因。可以理解,但为了代码的清晰性,我不得不坚持使用$'element>a',因为使用代码所获得的性能提升,现在看来,充其量也可以忽略不计。当然,除非你有这么多的div,你打电话的时候,它确实会明显地减慢速度。但还有其他问题。我这样做只是为了性能。可以理解,但为了代码的清晰性,我不得不坚持使用$'element>a',因为使用代码所获得的性能提升,现在看来,充其量也可以忽略不计。当然,除非你有这么多的div,你打电话的时候,它确实会明显地减慢速度。但是还有其他问题。第二种方法看起来很有趣。有好处吗?似乎它缓存了所有的兄弟姐妹,所以它不必在每次悬停时都查看DOM,对吗?@Marcel:没错。好处是选择被缓存。缺点是,就创建的处理程序函数的数量而言,开销更大,当然还有缓存的元素。如果你有很多没有太多元素的兄弟姐妹,那就好了。如果你有很多元素,没有太多的兄弟姐妹,我会使用第一种解决方案。第二种方法看起来很有趣。有好处吗?似乎它缓存了所有的兄弟姐妹,所以它不必在每次悬停时都查看DOM,对吗?@Marcel:没错。好处是选择被缓存。缺点是,就创建的处理程序函数的数量而言,开销更大,当然还有缓存的元素。如果你有很多没有太多元素的兄弟姐妹,那就好了。如果你有很多元素,没有太多的同级元素,我会使用第一种解决方案
在不使用var的情况下,您应该能够使用window.variablename(在本例中为window)再次调用它。_this.@Zydeco,虽然从技术上讲是正确的,但我不建议我最坏的敌人使用它。实际上,您将为名为_this的变量赋予全局作用域,该变量在悬停处理程序之外没有上下文含义。呃。我甚至不想用这个,但如果说你在函数中声明的任何变量只留在函数中,而不能在函数外使用,那就不真实了。从语义上讲,这是一个变量声明:var x;,这是一个赋值:x=1。现在在JavaScript中,您可以分配一个以前未声明的变量,该变量自动接收全局范围。但函数中声明的变量始终是私有作用域的说法是不真实的,事实上是不真实的:我不知道我们在争论语义,或者试图更精确,因为对于那些只想知道什么功能起作用的人来说,这通常是一个失败的原因,但我相信,当我说谢谢时,我代表了所有关心这一点的人。包括我自己在内,因为我对这类事情的了解显然比你少只是指出了这一点,但是如果您声明一个变量而不使用var,您应该能够使用window.variablename-在本例中是window.\u this.@Zydeco,虽然从技术上讲是正确的,但我不建议我最坏的敌人使用它。实际上,您将为名为_this的变量赋予全局作用域,该变量在悬停处理程序之外没有上下文含义。呃。我甚至不想用这个,但如果说你在函数中声明的任何变量只留在函数中,而不能在函数外使用,那就不真实了。从语义上讲,这是一个变量声明:var x;,这是一个赋值:x=1。现在在JavaScript中,您可以分配一个以前未声明的变量,该变量自动接收全局范围。但函数中声明的变量始终是私有作用域的说法是不真实的,事实上是不真实的:我不知道我们在争论语义,或者试图更精确,因为对于那些只想知道什么功能起作用的人来说,这通常是一个失败的原因,但我相信,当我说谢谢时,我代表了所有关心这一点的人。包括我自己在内,因为我对这类事情的了解显然比你少