Javascript Jquery slidedown if语句不比较$(this)

Javascript Jquery slidedown if语句不比较$(this),javascript,jquery,Javascript,Jquery,我有一个要点击的按钮列表。如果单击的链接是新的,我希望一个div向下滑动,但如果它与上次单击的链接相同,我只希望该div向上滑动 所以我的代码是: var $lastflyout = ''; $('.links-text a').each(function(){ $(this).click(function(){ if($(this) == $lastflyout) { alert('last equals'); $('#f

我有一个要点击的按钮列表。如果单击的链接是新的,我希望一个div向下滑动,但如果它与上次单击的链接相同,我只希望该div向上滑动

所以我的代码是:

var $lastflyout = '';
$('.links-text a').each(function(){
    $(this).click(function(){
        if($(this) == $lastflyout) {
            alert('last equals');
            $('#flyout').slideUp(500);
        }
        else {
            $('#flyout').slideUp(500);
            $('#flyout').slideDown(500);
        }
        $lastflyout = $(this);


    });

});
出于某种原因,它从不提醒“last equals”,因此永远不会进入第一个if语句。我尝试提醒$lastflout,它说第一次单击后它是一个对象,但我不知道为什么第一个if语句不起作用


感谢您的帮助。

比较两个jQuery对象根本不是一个好主意。它们可能是不同的jQuery对象,即使它们内部有相同的HTML元素

如果您想继续使用这种方法,请将其保存在全局变量中,而不是$this,并与之进行比较

我建议您一起去掉全局变量,通过查看弹出按钮的可见性来检查其状态。向上滑动后,jQuery使该项不可见,因此您可以检查它是否可见

您可以在此处看到一个没有全局变量的示例:

更好的是,.slideToggle将为您进行比较:

$(this).click(function() {
    $("#flyout").slideToggle(500);
});

比较两个jQuery对象根本不是一个好主意。它们可能是不同的jQuery对象,即使它们内部有相同的HTML元素

如果您想继续使用这种方法,请将其保存在全局变量中,而不是$this,并与之进行比较

我建议您一起去掉全局变量,通过查看弹出按钮的可见性来检查其状态。向上滑动后,jQuery使该项不可见,因此您可以检查它是否可见

您可以在此处看到一个没有全局变量的示例:

更好的是,.slideToggle将为您进行比较:

$(this).click(function() {
    $("#flyout").slideToggle(500);
});

您是否尝试过比较元素本身而不是jQuery元素

var lastflyout = '';
$('.links-text a').each(function(){
    $(this).click(function(){
        if(this == lastflyout) {
            alert('last equals');
            $('#flyout').slideUp(500);
        }
        else {
            $('#flyout').slideUp(500);
            $('#flyout').slideDown(500);
        }
        lastflyout = this;
    });
});

您是否尝试过比较元素本身而不是jQuery元素

var lastflyout = '';
$('.links-text a').each(function(){
    $(this).click(function(){
        if(this == lastflyout) {
            alert('last equals');
            $('#flyout').slideUp(500);
        }
        else {
            $('#flyout').slideUp(500);
            $('#flyout').slideDown(500);
        }
        lastflyout = this;
    });
});

两个相等的对象不相等,除非它们是完全相同的对象。由于$克隆了一个对象:

$(this) == $(this)
这总是错误的。如果您只是使用普通的JS对象而不是jQuery,并为其创建别名而不是克隆,那么它将起作用:

if(this == lastflyout) {
    alert('last equals');
    $('#flyout').slideUp(500);
}
else {
    $('#flyout').slideUp(500);
    $('#flyout').slideDown(500);
}
lastflyout = this;

两个相等的对象不相等,除非它们是完全相同的对象。由于$克隆了一个对象:

$(this) == $(this)
这总是错误的。如果您只是使用普通的JS对象而不是jQuery,并为其创建别名而不是克隆,那么它将起作用:

if(this == lastflyout) {
    alert('last equals');
    $('#flyout').slideUp(500);
}
else {
    $('#flyout').slideUp(500);
    $('#flyout').slideDown(500);
}
lastflyout = this;

改用toggleSlide!看看这里

HTML:


改用toggleSlide!看看这里

HTML:


由于您试图引用最近单击的链接,我会将$lastflout指定为等于锚的id或锚的href

试着做一些类似的事情:

var $lastflyout = '';
$('.links-text a').each(function(){
    $(this).click(function(){
        if($(this).attr('id') == $lastflyout) {
            alert('last equals');
            $('#flyout').slideUp(500);
        }
        else {
            $('#flyout').slideUp(500);
            $('#flyout').slideDown(500);
        }
        $lastflyout = $(this).attr('id');
    });
});
如果没有每个锚点的id,也可以使用:

var $lastflyout = '';
$('.links-text a').each(function(){
    $(this).click(function(){
        if($(this).attr('href') == $lastflyout) {
            alert('last equals');
            $('#flyout').slideUp(500);
        }
        else {
            $('#flyout').slideUp(500);
            $('#flyout').slideDown(500);
        }
        $lastflyout = $(this).attr('href');
    });
});

由于您试图引用最近单击的链接,我会将$lastflout指定为等于锚的id或锚的href

试着做一些类似的事情:

var $lastflyout = '';
$('.links-text a').each(function(){
    $(this).click(function(){
        if($(this).attr('id') == $lastflyout) {
            alert('last equals');
            $('#flyout').slideUp(500);
        }
        else {
            $('#flyout').slideUp(500);
            $('#flyout').slideDown(500);
        }
        $lastflyout = $(this).attr('id');
    });
});
如果没有每个锚点的id,也可以使用:

var $lastflyout = '';
$('.links-text a').each(function(){
    $(this).click(function(){
        if($(this).attr('href') == $lastflyout) {
            alert('last equals');
            $('#flyout').slideUp(500);
        }
        else {
            $('#flyout').slideUp(500);
            $('#flyout').slideDown(500);
        }
        $lastflyout = $(this).attr('href');
    });
});

为什么在没有必要的时候使用全局变量?@Gísli Konráð-我知道你编辑了OP的方法,但这不是解决问题的最佳方法-这是我的观点,我希望OP能够了解/理解这一点。在不需要全局变量时使用它很少或永远是最佳解决方案。因此,不应该只是第一个有效的答案——应该是最好的答案,OP也应该从中受益。我不在乎哪一个得到了复选标记,我只想让OP注意非全局变量解决方案,它的代码也少得多。@jfriend你怎么知道变量是全局的?就我们所知,这整段代码很容易就被关闭了,对吗?@PaulPro-无论它在哪里,都不需要它。我提出我的观点是为了让OP能看到一个更短、更好的方法——这就是我想要指出的。为什么在不必要的时候使用全局变量?@Gísli Konráð-我知道你编辑了OP的方法,但这不是解决问题的最佳方法——这是我的观点,我希望OP能了解/理解这一点。在不需要全局变量时使用它很少或永远是最佳解决方案。因此,不应该只是第一个有效的答案——应该是最好的答案,OP也应该从中受益。我不在乎哪一个得到了复选标记,我只想让OP注意非全局变量解决方案,它的代码也少得多。@jfriend你怎么知道变量是全局的?就我们所知,这整段代码很容易就被关闭了,对吗?@PaulPro-无论它在哪里,都不需要它。我已经表明了我的观点,所以OP可以看到一个更短、更好的方法来做这件事——这就是我所尝试的 指出。