我如何将此 div 作为所有子项的最后一个子项而不是第一个子项进行预置/附加?

How do I prepend/append this div as the last child of all the children as opposed to the first?

提问人:marcamillion 提问时间:6/18/2016 最后编辑:marcamillion 更新时间:6/20/2016 访问量:3287

问:

所以我有一个呈现HTML的视图,看起来像这样:

enter image description here

现在发生的事情是,当用户添加新评论时,它现在被添加到该列表的顶部,即突出显示的。但是,我希望它添加到列表中的最后一个之后,而不是作为第一个。我该怎么做?div.social-comment

这是看起来像的:create.js.erb

$(".question-<%= @comment.commentable.id %>").prepend("<%= j (render partial: 'comments/comment', locals: { comment: @comment}) %>");

我怎样才能实现我想要的?

编辑 1

我的错,我对最初的问题并不完全清楚。

我不能只使用 ,因为存在一个表单字段,该字段当前位于该子列表的底部。.append

如果我使用append,修改后的HTML是这样的:

enter image description here

请注意,出现在最后一个 ..row .question-46-new.social-comment

所以这最终产生了这个:

screenshot-of-rendered-comments

这显然是我不想要的。

我想要的是让新评论出现在该文本框的正上方,以及现有评论列表的末尾。Write Comment

编辑 2

这是我的 DOM 树在尝试 Pranav 的建议后的样子:

enter image description here

编辑 3

在 Pranav 的最新尝试之后,这些是结果。

我试过这个:

$(".question-<%= @comment.commentable.id %>").children(".social-comment").last().after("<%= j (render partial: 'comments/comment', locals: { comment: @comment}) %>");

当有现有评论时,这很有效,它只是将其添加到现有评论的最后一个。但是,当没有现有评论时,新评论就会消失。

这是没有注释时 DOM 树的图片:

enter image description here

这是添加注释后的 DOM 树的图片,使用上面的:.js.erb

enter image description here

没有变化。对于它的价值,我还尝试了另一个建议:

$(".question-<%= @comment.commentable.id %> > .social-comment:last").after("<%= j (render partial: 'comments/comment', locals: { comment: @comment}) %>");

我也有类似的行为。当有现有注释时,它起作用,但当没有注释时,它不起作用。

编辑 4

当我使用 Pranav 的建议时,这就是结果。:before

当我添加一条评论时,这是我的评论部分的样子,当时之前没有评论(请注意,间距是关闭的,与其他 DOM 元素的对齐看起来很奇怪):

not aligned going from 0 to 1 comment

然后,当有现有注释时,它看起来像这样(注意对齐方式看起来多么奇怪):

not aligned going from 1 to 2 comments

但是,如果我刷新,这就是它的样子(这是它应该的样子,但不是添加评论后立即的样子):

aligned on refresh

jquery unobtrusive-javascript ruby-on-rails-5

评论


答:

2赞 Pranav C Balan 6/18/2016 #1

使用 append() 而不是 prepend( 方法。

$(".question-<%= @comment.commentable.id %>").append("<%= j (render partial: 'comments/comment', locals: { comment: @comment}) %>");


更新1:

由于您已经更新了问题,因此无法使用上述代码进行更新。相反,您可以做的是获取 div 中的最后一个元素,然后将其附加到元素之后。您可以使用 :last 获取最后一个元素,并使用 after() 方法附加到最后一个元素之后。social-comment

$(".question-<%= @comment.commentable.id %> .social-comment:last").after("<%= j (render partial: 'comments/comment', locals: { comment: @comment}) %>");

更新2:

由于存在具有相同类的嵌套 div,因此您只需要获取直接子级。因此,请使用子选择器(>

$(".question-<%= @comment.commentable.id %> > .social-comment:last").after("<%= j (render partial: 'comments/comment', locals: { comment: @comment}) %>");

或使用 children()last()。

$(".question-<%= @comment.commentable.id %>").children(".social-comment").last().after("<%= j (render partial: 'comments/comment', locals: { comment: @comment}) %>");

此外,如果最后一个 div 的类总是采用类似 后跟 (例如: 和 ) 的格式,那么您可以使用 before() 方法完成。parent id-newquestion-36question-36-new

$(".question-<%= @comment.commentable.id %>-new").before("<%= j (render partial: 'comments/comment', locals: { comment: @comment}) %>");

评论

0赞 marcamillion 6/18/2016
这是一个公平的建议,但我在最初的问题中并不清楚。请刷新问题,看看我这样做时会发生什么。简而言之,这是行不通的 - 出于我在更新的问题中解释的原因。
0赞 marcamillion 6/18/2016
我喜欢这个方向。但是由于某种原因,它实际上不起作用。评论就这样消失了。很明显,它已经正确提交了,它只是没有正确更新 DOM。想法?
0赞 Pranav C Balan 6/18/2016
@marcamillion:这是我这边的一个错误,我在类选择器之前错过了......答案现在更新。.
0赞 marcamillion 6/18/2016
是的,我以前试过,但没有用。正在发生的事情是它仍然将其附加在文本字段 div 之后。查看问题,了解此建议后 DOM 的更新。
0赞 Pranav C Balan 6/18/2016
让我们在聊天中继续讨论