使用 CSS/jQuery 进行元素操作
Element manipulation with CSS/jQuery
我正在做一些操作,大概是用 jQuery,这很像之前在这里提出的问题:
Hide and show divID with Javascript - Hide when new title is opened
我已经解决了我的问题。我正在研究一些 pills/tabs,其中每个药丸分为三个部分,每个部分都包含 "Read more" 的可能性,这就是 show/hide 发挥作用的地方。我的 jsfiddle 在这里:https://jsfiddle.net/jwb99gw1/6/
<div class="container">
<h2>Pills</h2>
<ul class="nav nav-pills">
<li class="active"><a data-toggle="pill" href="#home">Home</a></li>
<li><a data-toggle="pill" href="#menu1">Menu 1</a></li>
</ul>
<div class="tab-content">
<div id="home" class="tab-pane fade in active">
<div class="row">
<div class="col-lg-3 col-md-3 col-sm-3">
<h3>HOME</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
<a class="" href="#a">Read more</a>
</div>
<div class="col-lg-3 col-md-3 col-sm-3">
<h3>Header</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
<a href="#b">Read more</a>
</div>
<div class="col-lg-3 col-md-3 col-sm-3">
<h3>Something else</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
<a href="#c">Read more</a>
</div>
</div>
<div id="a">Lorem ipsum (A)</div>
<div id="b">Lorem ipsum (B)</div>
<div id="c">Lorem ipsum (C)</div>
</div>
<div id="menu1" class="tab-pane fade">
<h3>Menu 1</h3>
<p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
</div>
</div>
目前,我做了一个纯粹基于 CSS 的解决方案,但是它不能处理 UX。我希望 "Read more" 切换到 "Hide text",一旦单击,当然如果在该状态下单击,则隐藏文本。理想情况下,切换 pill/tab 也应该隐藏元素。
与我一开始链接的问题相比,我的问题有一些不同之处。这些元素没有被彼此包围,所以我认为 "this" 关键字不会起作用,至少不会完全符合上一个问题的处理方式。
你会如何解决这个问题?必须有比 ID by ID jQuery 处理更智能的解决方法。
我已将 .display-box
添加到您的 .container
。
HTML
<div class="container display-box">
...
<a data-target="#a">Read more</a>
<a data-target="#b">Read more</a>
<a data-target="#c">Read more</a>
...
<div id="a" class="box">Lorem ipsum (A)</div>
<div id="b" class="box">Lorem ipsum (B)</div>
<div id="c" class="box">Lorem ipsum (C)</div>
...
</div>
JQuery
$(".display-box").each(function () {
var $this = $(this);
$this.find("[data-target]").each(function () {
$(this).click(function () {
$($this.data("visible")).hide();
$("[data-target='"+$this.data("visible")+"']").text("Read more");
if ($this.data("visible") !== $(this).data("target")) {
$this.data("visible", $(this).data("target"));
$(this).text("Hide text");
$($this.data("visible")).show();
} else {
$this.data("visible", "")
}
});
});
})
CSS
.box {
display:none;
}
jsfiddle: https://jsfiddle.net/jwb99gw1/11/
说明
基本上,这会针对每个 .displaybox
进行迭代,找到每个具有属性 data-target
的元素,然后为每个元素添加一个点击事件侦听器。
它隐藏了数据 data-visible
中为 .display-box
指定的元素,但此数据对检查器是隐藏的。然后它从单击的 link 中获取 data-target
的值并将其存储回 data-visible
。然后它显示 data-visible
中指定的元素,它是单击 link 的目标。
由于您没有 class 来引用被单击的元素,我们将不得不使用某种父关系。当我们无法控制正在生成的DOM时,下面的方法可能会证明非常有用,因此可以按如下方式进行...
hideall = function(){
jQuery("#home p ").next("a").each(function(e){ // accessing all the pairs of readmore elements and their respective companion elements
readmore2 = jQuery(this).attr('href'); // get the readmoreid
id2 = readmore2.substr(1); // extract the id
jQuery("#"+id2).hide();
});
}
jQuery("#home p ").next("a").on("click", function(e){
e.preventDefault; // prevent the <a> tag from navigating
readmore = jQuery(this).attr('href'); // get the readmoreid
id = readmore.substr(1); // extract the id
hideall();
jQuery("#"+id).show();
});
jQuery(document).on( 'shown.bs.tab', function (e) {
hideall();
});
即使此解决方案有效,这也不是正确的方法,我建议您使用 classes 以获得更高效和更好的代码。
哇,我回答得太晚了,但我一直在努力,所以我会 post 无论如何。
$(function(){
$(".a").click(function () {
$(".p").toggle();
$(this).text(function(i, text){
return text === "Read more" ? "Hide text" : "Read more";
})
});
我正在做一些操作,大概是用 jQuery,这很像之前在这里提出的问题: Hide and show divID with Javascript - Hide when new title is opened
我已经解决了我的问题。我正在研究一些 pills/tabs,其中每个药丸分为三个部分,每个部分都包含 "Read more" 的可能性,这就是 show/hide 发挥作用的地方。我的 jsfiddle 在这里:https://jsfiddle.net/jwb99gw1/6/
<div class="container">
<h2>Pills</h2>
<ul class="nav nav-pills">
<li class="active"><a data-toggle="pill" href="#home">Home</a></li>
<li><a data-toggle="pill" href="#menu1">Menu 1</a></li>
</ul>
<div class="tab-content">
<div id="home" class="tab-pane fade in active">
<div class="row">
<div class="col-lg-3 col-md-3 col-sm-3">
<h3>HOME</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
<a class="" href="#a">Read more</a>
</div>
<div class="col-lg-3 col-md-3 col-sm-3">
<h3>Header</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
<a href="#b">Read more</a>
</div>
<div class="col-lg-3 col-md-3 col-sm-3">
<h3>Something else</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
<a href="#c">Read more</a>
</div>
</div>
<div id="a">Lorem ipsum (A)</div>
<div id="b">Lorem ipsum (B)</div>
<div id="c">Lorem ipsum (C)</div>
</div>
<div id="menu1" class="tab-pane fade">
<h3>Menu 1</h3>
<p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
</div>
</div>
目前,我做了一个纯粹基于 CSS 的解决方案,但是它不能处理 UX。我希望 "Read more" 切换到 "Hide text",一旦单击,当然如果在该状态下单击,则隐藏文本。理想情况下,切换 pill/tab 也应该隐藏元素。
与我一开始链接的问题相比,我的问题有一些不同之处。这些元素没有被彼此包围,所以我认为 "this" 关键字不会起作用,至少不会完全符合上一个问题的处理方式。
你会如何解决这个问题?必须有比 ID by ID jQuery 处理更智能的解决方法。
我已将 .display-box
添加到您的 .container
。
HTML
<div class="container display-box">
...
<a data-target="#a">Read more</a>
<a data-target="#b">Read more</a>
<a data-target="#c">Read more</a>
...
<div id="a" class="box">Lorem ipsum (A)</div>
<div id="b" class="box">Lorem ipsum (B)</div>
<div id="c" class="box">Lorem ipsum (C)</div>
...
</div>
JQuery
$(".display-box").each(function () {
var $this = $(this);
$this.find("[data-target]").each(function () {
$(this).click(function () {
$($this.data("visible")).hide();
$("[data-target='"+$this.data("visible")+"']").text("Read more");
if ($this.data("visible") !== $(this).data("target")) {
$this.data("visible", $(this).data("target"));
$(this).text("Hide text");
$($this.data("visible")).show();
} else {
$this.data("visible", "")
}
});
});
})
CSS
.box {
display:none;
}
jsfiddle: https://jsfiddle.net/jwb99gw1/11/
说明
基本上,这会针对每个 .displaybox
进行迭代,找到每个具有属性 data-target
的元素,然后为每个元素添加一个点击事件侦听器。
它隐藏了数据 data-visible
中为 .display-box
指定的元素,但此数据对检查器是隐藏的。然后它从单击的 link 中获取 data-target
的值并将其存储回 data-visible
。然后它显示 data-visible
中指定的元素,它是单击 link 的目标。
由于您没有 class 来引用被单击的元素,我们将不得不使用某种父关系。当我们无法控制正在生成的DOM时,下面的方法可能会证明非常有用,因此可以按如下方式进行...
hideall = function(){
jQuery("#home p ").next("a").each(function(e){ // accessing all the pairs of readmore elements and their respective companion elements
readmore2 = jQuery(this).attr('href'); // get the readmoreid
id2 = readmore2.substr(1); // extract the id
jQuery("#"+id2).hide();
});
}
jQuery("#home p ").next("a").on("click", function(e){
e.preventDefault; // prevent the <a> tag from navigating
readmore = jQuery(this).attr('href'); // get the readmoreid
id = readmore.substr(1); // extract the id
hideall();
jQuery("#"+id).show();
});
jQuery(document).on( 'shown.bs.tab', function (e) {
hideall();
});
即使此解决方案有效,这也不是正确的方法,我建议您使用 classes 以获得更高效和更好的代码。
哇,我回答得太晚了,但我一直在努力,所以我会 post 无论如何。
$(function(){
$(".a").click(function () {
$(".p").toggle();
$(this).text(function(i, text){
return text === "Read more" ? "Hide text" : "Read more";
})
});