jQuery滑动切换未工作 - 已解决

3

第一次点击时,它按预期工作:

  1. 类别被改变
  2. HTML内容从“显示…”更改为“关闭…”
  3. 内容区域通过slideDown效果展开,

到目前为止还不错。

第二次点击时,...

  1. 类别更改
  2. HTML内容从“关闭…”更改为“显示…”
  3. 内容区域未按预期消失。

第三次点击时,...

  1. 类别被改变
  2. HTML内容被更改
  3. 已显示的内容重新显示,并带有slidedown效果。

因此,除了第2次点击应该隐藏内容之外,一切都正常工作。

以下是jQuery代码:

-

$('.open_user_urls').live('click', function() {
    $('#user_urls').slideDown('slow');
    $(this).addClass('close_user_urls');
    $(this).removeClass('open_user_urls');
    $(this).html('Close Search History');
    return false;
});

$('.close_user_urls').live('click', function() {
    $('#user_urls').slideUp('slow');
    $(this).addClass('open_user_urls');
    $(this).removeClass('close_user_urls');
    $(this).html('Show Search History');
    return false;
}); 

以下是需要翻译的内容:

这是它所作用的HTML:

<h3 class='open_user_urls'>Show Search History</h3>
<div id='user_urls'>
// an OL tag with content
</div>

唯一适用的CSS:

#user_urls { display: none; }

编辑 - 我用下面一个答案提供的等效代码替换了我的jquery代码,但问题仍然存在。因此,原因必须在其他地方。我记得这个代码最初是可以工作的,但后来停止了。我被难住了。现在需要逐步剥离所有其他部分...

编辑2 - 由于错误必须在其他地方,我接受了我的jquery代码的代码改进作为答案。谢谢。

编辑3 - 找到问题的来源。

在#user_urls div内,我有一系列带有以下css的OL:

.url_list {float: left; width: 285px; list-style-position: outside; margin-left: 25px;}

每个有序列表(OL)包含20个URL的列表,应根据需要显示为多列以显示所有URL。
在这些OL标记上删除float:left;会使问题消失。
因此,在显示和隐藏的DIV中包含的内容上设置浮动会导致它根本无法隐藏。为什么会发生这种情况?
编辑4:在#user_urls DIV中添加一个<div>可以使隐藏操作正常工作。

这是Jquery已知的问题,切换对浮动容器和/或内容的响应不太好。我正在寻找绕过此问题或在我的情况下替换切换使用的方法。我会及时通知您。(似乎主要发生在FF和Chrome中,但以不同的方式出现,令人惊讶的是IE似乎表现更好) - Ar3s
8个回答

5
也许像这样的方式会更简单一些?
$(".open_user_urls").toggle(
    function () {
        $(this).text("Close Search History").siblings(".user_urls").slideDown("slow");
    },
    function () {
        $(this).text("Show Search History").siblings(".user_urls").slideUp("slow");
    }
);

toggle功能的设计,恰好适用于你遇到的场景。

1
奇怪的是,你的函数和我的原始函数出现了相同的问题。问题肯定是在其他地方... - Ian
但是,我更喜欢你的代码,所以我会接受你的答案并稍微修改一下问题。谢谢。 - Ian
1
谢谢。抱歉,我没听懂你的意思。 - Conor McDermottroe

5
为了重申这个问题和解决方案...
在 #user_urls DIV 中有一系列左浮动的 OL 标签。正是浮动导致了问题。
在 #user_urls DIV 中添加
修复了问题。

感谢您更新您的答案。这在大约15秒钟之内解决了我的问题(在经历了几个小时的苦思冥想之后)。 - cori
问题也被我解决了...该死,那是一个非常奇怪的 bug。 - Jiaaro

1
据我所知,jQuery需要设置高度样式才能正确滑动。我使用的一个解决方法是在关闭之前先设置高度。
$('#user_urls').css('height', $('#user_urls').height() + 'px');

设置一次后,它应该从那时起正确工作。请查看本教程以获取更详细的解释。


1
自从提出这个问题以来,jQuery已经为此做了修复。
更新到最新版本的jQuery解决了我们的问题,无需进行CSS更改。(截至2010年12月9日的jQuery 1.4.4版本)
通过Google Groups上的讨论发现,该讨论是从d12的回答中找到的。根据讨论,在某些jQuery 1.3x版本中,如果要隐藏/滑动的元素是一个不浮动的包含浮动子元素的父元素,则会影响几个操作,包括slideUp、fadeOut和toggle等。

0

0
在您的div中放置一个不间断空格是另一种解决方案,类似于The Reddest建议的方法,在我遇到类似问题时起到了作用。

0

感谢您提出这个问题。它确实让我开始解决在具有浮动子元素的情况下切换元素的问题。

另一个真正有帮助并且解释了一些行为的资源可以在此Google小组讨论中找到。


0

我无法复制你的错误。我使用了你的代码,但是我无法重现你的问题。

这可能是来自你的JS代码中不同位置的脚本错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接