我正在实现这个:http://jsfiddle.net/xkfqN/85/
.html:
<div id="posts">
<div class="more">Show More</div>
<div class="commentsContainer">
<div class="comment">Comment 1</div>
<div class="comment">Comment 2</div>
<div class="comment">Comment 3</div>
<div class="comment">Comment 4</div>
<div class="comment">Comment 5</div>
<div class="comment">Comment 6</div>
<div class="comment">Comment 7</div>
<div class="comment">Comment 8</div>
<div class="comment">Comment 9</div>
<div class="comment">Comment 10</div>
</div>
</div>
.css:
.comment {
display: none;
border:3px solid whiteSmoke;
width:280px;
}
.more {
cursor:pointer
}
JQuery:
function toggleComment(index, hide) {
//check the index to make sure it is in range
if (index > -1 && $('.comment').length > index) {
//get the comment at the given index and apply the animation
$('.comment:eq(' + index + ')')
.slideToggle(18, function() {
//if hiding then decrement
var next = hide ? index + 1 : index - 1;
//call toggle on the next index
toggleComment(next , hide);
});
//set to display block so they show up on their own line
// .css('display', 'block');
}
}
$('.more').click(function() {
//are the comments already open... returns true or false
var hide = $(this).hasClass('open');
//default to start at the begining... each click brings the index to 0
var index = 0;
//if the comments are not open then start at the end
if (!hide) {
index = $('.comment').length - 1
}
//toggle the comments
toggleComment(index, hide);
//used to remember state.. adds class to more and takes it away hence toggle class
$(this).toggleClass('open');
});
我打算下拉的评论默认情况下不会显示,并且像示例链接所示使用 css 隐藏,因为默认情况下为每个用户加载所有评论是不明智的。
它们只会在单击"全部显示"链接/提交时加载。无论如何,在下面的代码中,我的评论是在页面上呈现后从文件"show_all_comments"中抓取的。该文件中有一个循环,循环遍历每个注释并显示数据及其 html。
我想做什么:
我不想在页面上呈现它,而是在内存中呈现一些方式,然后能够访问这些类,就好像我试图从实际页面访问它们一样。这样,我将能够访问每个注释类并与JSFiddle代码一起使用。
如果这对你有意义,这可能吗?如果是这样,我将如何实现这一目标?
JQuery:
var postContent = $(this).parents('.post_content'),
commentContainer = postContent.find('.comment_container');
commentContainer.slice(0, -2).remove();
postContent.find('.comment_container:first')
.before("<%= j render 'users/partials/show_all_comments', :comments => @comments %>");
听起来你想要断开连接的 DOM 元素并搜索它们。您可以非常轻松地做到这一点:
var elements = $('<div><div class="one">one</div><div class="two">two</div></div>');
var divOne = elements.find('.one');
在那里,我创建了一个包含所有其他顶级div
的结构,并在其周围包装了一个 jQuery 实例。这些元素不在 DOM 中,它们与 DOM 完全断开连接。然后我可以使用 jQuery 方法(如 find
等)来提取我想要的位。
如果你想把一个提取的位实际放在页面上的某个地方,你可能想clone
它:
// Put "one" on the page
elements.find(".one").clone().appendTo(document.body);
但是看看你对Juhana对这个问题的评论:
Juhana:想象一下,一个用户有一个微帖子,上面有4000条评论。每次用户进入带有该微帖子的页面时,所有 4000 条评论都会从数据库中加载然后隐藏。即使用户未单击"全部显示"链接。这不是我想做的事情。想象一下,有 1000 名用户查看该微帖子。这意味着无论用户是否单击"全部显示",都会加载 4000 条评论,然后隐藏 1000 次。
。我根本不会加载额外的注释(不在 HTML 中,也不在脚本中)。相反,我只会加载我要显示的评论,然后在用户单击"更多"链接时触发其余评论的 ajax 请求。仅仅将它们从HTML移动到脚本中不会获得太多(如果有的话)。
下面是一个示例 - 实时示例 | 来源:
.HTML:
<div id="commentsContainer">
<div class="comment">Comment 1</div>
<div class="comment">Comment 2</div>
<div class="comment">Comment 3</div>
<div class="comment">Comment 4</div>
<div class="comment">Comment 5</div>
<div class="comment">Comment 6</div>
<div class="comment">Comment 7</div>
<div class="comment">Comment 8</div>
<div class="comment">Comment 9</div>
<div class="comment">Comment 10</div>
<div><a href="fallback.php" id="moreComments">more</a></div>
</div>
JavaScript:
jQuery(function($) {
$("#moreComments").click(function(event) {
var $this = $(this),
moreDiv,
container;
event.preventDefault();
moreDiv = $this.parent();
container = moreDiv.parent();
$this.replaceWith("<em>Loading...</em>");
$.ajax({
method: 'get',
url: 'http://jsbin.com/ijarov',
dataType: 'html',
success: function(data) {
moreDiv.remove();
container.append(data);
}
});
});
function display(msg) {
$("<p>").html(msg).appendTo(document.body);
}
});
ajax 调用返回的内容:
<div class="comment">Comment 11</div>
<div class="comment">Comment 12</div>
<div class="comment">Comment 13</div>
<div class="comment">Comment 14</div>
<div class="comment">Comment 15</div>
<div class="comment">Comment 16</div>
<div class="comment">Comment 17</div>
<div class="comment">Comment 18</div>
<div class="comment">Comment 19</div>
<div class="comment">Comment 20</div>
在下面重新发表您的评论:
假设您不想附加"数据",而是访问该文件中的类。这可能吗?
我不知道你说的"...访问类...",但是如果你的意思是与你返回的元素进行交互而不附加它们,你只需实例化它们,就像我在这个答案的顶部用文字字符串所做的那样。例如,在ajax
成功处理程序中执行此操作:
var elements = $(data);
这是上面带有不同返回数据的示例(div
元素的混合,有些带有类 comment
,有些带有类 other
),我在追加数据之前查看数据,然后只附加注释,而不是"其他": 实时示例 | 来源
.HTML:
<div id="commentsContainer">
<div class="comment">Comment 1</div>
<div class="comment">Comment 2</div>
<div class="comment">Comment 3</div>
<div class="comment">Comment 4</div>
<div class="comment">Comment 5</div>
<div class="comment">Comment 6</div>
<div class="comment">Comment 7</div>
<div class="comment">Comment 8</div>
<div class="comment">Comment 9</div>
<div class="comment">Comment 10</div>
<div><a href="fallback.php" id="moreComments">more</a></div>
</div>
<hr>
JavaScript(唯一的更改是在success
函数中):
jQuery(function($) {
$("#moreComments").click(function(event) {
var $this = $(this),
moreDiv,
container;
event.preventDefault();
moreDiv = $this.parent();
container = moreDiv.parent();
$this.replaceWith("<em>Loading...</em>");
$.ajax({
method: 'get',
url: 'http://jsbin.com/ijarov/2',
dataType: 'html',
success: function(data) {
var elements = $(data);
moreDiv.remove();
display("Number of <code>.comment</code> elements: "+
elements.filter('.comment').length);
display("Number of <code>.other</code> elements: "+
elements.filter('.other').length);
display("Appending only the <code>.comment</code> ones.");
elements.filter('.comment').appendTo(container);
}
});
});
function display(msg) {
$("<p>").html(msg).appendTo(document.body);
}
});
ajax
调用返回的数据:
<div class="comment">Comment 11</div>
<div class="other">Other 11</div>
<div class="comment">Comment 12</div>
<div class="other">Other 12</div>
<div class="comment">Comment 13</div>
<div class="comment">Comment 14</div>
<div class="comment">Comment 15</div>
<div class="comment">Comment 16</div>
<div class="comment">Comment 17</div>
<div class="comment">Comment 18</div>
<div class="comment">Comment 19</div>
<div class="comment">Comment 20</div>