好的,我认为您应该对您的问题采取不同的方法。
看,jQuery 基本上有两个目的:
- 从 HTML 页面中选择一个或多个 DOM 元素
- 以某种方式操作选定的元素
这可以重复多次,因为 jQuery 函数是可链接的(这意味着您可以在函数之后调用函数……)。
如果我正确理解了您的问题,那么您正在尝试构建博客文章列表并仅显示它们的预告片。
用户点击“阅读更多”按钮后,整篇文章被展开。
请记住:jQuery 选择元素的方式与 CSS 非常相似。这使得查询某些元素变得非常容易,但是您需要以良好的方式构建 HTML,就像出于格式化原因所做的那样。
所以我建议你应该为你的每篇文章使用这个基本标记(注意,HTML5 在工作!):
<article class="article">
<section class="teaser">
Hey, I am a incredible teaser text! I just introduce you to the article.
</section>
<section class="full">
I am the articles body text. You should not see me initially.
</section>
</article>
如果您愿意,可以用元素替换article
andsection
元素。div
这是此标记的 CSS:
/* In case you want to display multiple articles underneath, separate them a bit */
.article{
margin-bottom: 50px;
}
/* we want the teaser to stand out a bit, so we format it bold */
.teaser{
font-weight: bold;
}
/* The article body should be a bit separated from the teaser */
.full{
padding-top: 10px;
}
/* This class is used to hide elements */
.hidden{
display: none;
}
我们创建标记和 CSS 的方式允许我们在下面放置多篇文章。
好的,您可能已经注意到:我完全省略了任何“阅读更多”或“折叠”按钮。这是有意为之。
如果有人在禁用 javascript 的情况下访问博客站点(可能是搜索引擎,或者不支持 JS 的旧手机或其他任何东西),逻辑就会被破坏。此外,许多文本片段,如“阅读更多”和“折叠”,如果它们实际上没有做任何事情并且不是文章的一部分,则它们是不相关的。
最初,没有隐藏文章正文,因为我们没有在hidden
任何地方应用 css 类。如果我们将它嵌入到 HTML 中,而某人真的没有 JavaScript,他将无法阅读任何内容。
添加一些 jQuery 魔法
在页面底部,我们嵌入了来自 google CDN 的 jQuery 库。
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
这是一种最佳做法,通常会加快您的页面加载时间。由于许多网站都通过此 URL 嵌入 jQuery,因此很有可能它已经在访问者浏览器缓存中,并且不必再次下载。
请注意,http:
URL 开头的 被省略了。这会导致浏览器使用页面当前协议,可能是http
或https
. 如果您尝试通过http
协议在https
网站上嵌入 jQuery 库,某些浏览器会拒绝从不安全的连接下载文件。
在页面中包含 jQuery 之后,我们将把我们的逻辑添加到脚本标签中。通常我们会将逻辑保存到一个单独的文件中(再次缓存,而不是全部),但这次脚本块就可以了。
最后是一些 JavaScript
首先,我们想用 css-class 隐藏所有元素full
,因为只有预告片应该保持显示。使用 jQuery 这很容易:
$('.full').hide();
脚本的开头$('.full')
告诉 jQuery:我需要所有带有 CSS-class 的元素full
。然后我们对该结果调用一个函数,命名hide()
应该明确哪个目的。
好的,在下一步中,我们要在每个预告片旁边添加一些“阅读更多”按钮。这也是一项简单的任务:
$('.teaser').after('<button class="more">Read more</button>');
我们现在选择每个带有 css-class 的元素,teaser
并为每个元素附加一些 HTML 代码after()
- 一个带有 css-class 的按钮more
。
在下一步中,我们告诉 jQuery 观察每个新创建的按钮的点击。当用户单击时,我们希望full
在单击的按钮之后使用 css-class 展开下一个元素。
$('.more').on('click', function(){
//"this" is a reference to the button element!
$(this).slideUp().next('.full').slideDown();
});
呸,我们在这里做了什么?首先,我们告诉 jQuery 我们想要操作this
,它是对单击按钮的引用。然后我们告诉 jQuery 慢慢隐藏那个按钮(因为它不再需要了)slideUp()
。
我们立即继续告诉 jQuery 做什么:现在获取next()
元素(使用 css-class full
)并通过使用 向下滑动它使其可见slideDown()
。
这就是 jQuerys 链接的力量!
再次隐藏
但是等等,你希望能够再次折叠文章!所以我们还需要一个“折叠”按钮和一些 JavaScript:
$('.full').append('<button class="collapse">Collapse text</button>');
注意:我们没有使用after()
添加此按钮的append()
功能,而是使用将按钮放置在具有 css-class 的每个元素中的功能full
,而不是在它旁边。这是因为我们希望折叠按钮也与全文一起隐藏。
现在,当用户单击其中一个按钮时,我们也需要执行一些操作:
$('.collapse').on('click', function(){
$(this).parent().slideUp().prev('.more').slideDown();
});
现在,这很简单:我们从 button 元素开始,将焦点移到它的parent()
(包含全文的元素)并告诉 jQuery 通过向上滑动它来隐藏该元素slideUp()
。
然后我们使用 css-class 将焦点从全文容器移到它的前一个元素more
,这是它的展开按钮,在展开文本时已经隐藏。我们通过调用 慢慢地再次显示该按钮slideDown()
。
就是这样 :)
我已经在jsBin上上传了我的示例。