【问题标题】:Rails: Jquery Ajax issue with slidetoggleRails:滑动切换的 Jquery Ajax 问题
【发布时间】:2012-02-23 21:29:01
【问题描述】:

我有一个独立于微博的评论部分,我正在尝试单击微博中的一个按钮,以便在 CSS 幻灯片中显示为无的评论部分滑动和显示。问题是所有 10 条微博的评论按钮都打开了最新的微博,而它应该打开它自己的微博评论部分。我不确定如何更改 javascript 以及 HTML 以使评论按钮动态到它自己的微帖子。这是我正在使用的,非常感谢任何帮助。谢谢。

JS

$(".CommentTitle").click(function(){
    $("#CommentContainer").slideToggle("slow", function(){ 
        $(".CommentTitle").html($(this).is(":hidden") ? "Comments" : "Comments");  
    });
});

HTML

<div class='Actions'>
<div class='CommentButton'>
<span class='CommentIcon'></span>
<span class='CommentNum'>5</span>
<span class='CommentTitle'>Comments</span>
</div>
</div>

<div id='CommentContainer' class='<%= micropost.id%>'>
<div class='Comment'>
<%=render "comments/form" %>
</div>
<div id='comments'>
<%=render @micropost.comments %>
</div>
</div>

【问题讨论】:

    标签: ruby-on-rails ajax ruby-on-rails-3 jquery


    【解决方案1】:

    更改您的 HTML,以便您的 CommentContainer 元素上没有重复的 ID。这就是为什么 jQuery 只找到第一个 - 你正在创建无效的 HTML。

    假设每个微博都有一个评论按钮,您应该将微博 id 作为数据属性添加到 Title,然后检索它以找到正确的 CommentContainer。每个评论容器都应在其 ID 中包含其所属微博的 ID。

    HTML:

    <div class='Actions'>
        <div class='CommentButton'>
            <span class='CommentIcon'></span>
            <span class='CommentNum'>5</span>
            <span class='CommentTitle' data-micropost='<%= micropost.id %>'>Comments</span>
        </div>
    </div>
    
    <div id='CommentContainer-<%= micropost.id%>' class='CommentContainer'>
        <div class='Comment'>
            <%=render "comments/form" %>
        </div>
        <div id='comments'>
            <%=render @micropost.comments %>
        </div>
    </div>
    

    JavaScript:

    $(".CommentTitle").click(function(){
        var title = this;
        var postID = $(this).data('micropost');
        $("#CommentContainer-" + postID).slideToggle("slow", function(){ 
            $(".CommentTitle", title).html($(this).is(":hidden") ? "Comments" : "Comments");  
        }); 
    });
    

    更改您的 CSS 以隐藏 .CommentContainer 而不是 #CommentContainer

    【讨论】:

    • 嗯,它似乎不起作用,CommentContainer 也被 CSS 隐藏了,但添加了 -&lt;%= micropost.id%&gt;,CSS 无法隐藏它,嗯,不太确定是错的
    • 您的课程和 ID 似乎非常混乱。 CSS 类可以应用于任何元素,您可以将多个类应用于单个元素。一个元素只能有一个 id 属性,并且它在页面上必须是唯一的。将您的 CSS 从 #CommentContainer { display:none; } 更改为 .CommentContainer { display: none; }
    • 嗯,尽管我将它更改为一个类而不是一个 id,commentcontainer 有一个 - 和一个 postid,所以 HTML 不是没有拾取仅为 commentcontainer 指定的 CSS 吗?
    • 我添加了 class="CommentContainer" 并将 id 设置为 'CommentContainer-',因此 .CommentContainer CSS 样式应该适用于所有这些
    • 我已经完成了你所说的一切,我改变了 JS 和类,id 和 HTML,它现在隐藏了容器,但点击时没有打开任何东西,对不起这么多麻烦,我非常感谢您的帮助! :)
    【解决方案2】:
    $(".CommentTitle").click(function(){
        $("#CommentContainer", this.parent()).slideToggle("slow", function(){ 
            $(".CommentTitle", this).html($(this).is(":hidden") ? "Comments" : "Comments");  
        }); 
    });
    

    您可以向 jQuery 选择器添加上下文,以便它只匹配该元素下方。在这种情况下,我已将this.parent() 添加到容器选择器中,因此它只会匹配单击容器内的#CommentContainer,而 this 会匹配到标题选择器,因此它将匹配当前容器内的标题。

    这假设你的微博 HTML 看起来像这样:

    <div id='#CommentContainer'>
      <span class='CommentTitle'>Some clickable title</span>
      <p>data here</p>
    </div>
    

    元素类型无关紧要,只是 CommentTitle 是 CommentContainer 的直接子代。

    【讨论】:

    • 你能看一下HTML的编辑,Action的div包含按钮而不是commentcontainer div,因为它被CSS隐藏了,还有其他方法吗?我应该在 action 和 commentcontainer 周围添加另一个 div 标签吗?
    • 将在几秒钟内用我的完整推荐添加另一个答案。
    • 你帮了大忙!我发现你的代码有效,但愚蠢的是我没有添加不显眼的 js 文件 x) 原谅我。再次谢谢你:)
    猜你喜欢
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多