简体   繁体   English

根据元素是否折叠来更改引导折叠按钮中的文本

[英]Change text in a bootstrap collapse button based on whether the element is collapsed

I've had a look at a few threads on here about this but I am having issues ammending the code to fit my design. 我在这里看到了一些关于此的线程,但是在扩展代码以适合我的设计时遇到了问题。

I am using Collapse buttons from here: http://getbootstrap.com/javascript/#collapse 我正在从此处使用“折叠”按钮: http : //getbootstrap.com/javascript/#collapse

They work fine but I would like the text and icon to change based on the state of the element. 它们工作正常,但我希望根据元素的状态更改文本和图标。

Minimised: Show More V Expanded: Show Less ^ 最小化:显示更多V展开:显示更少^

I wrote it in 2 scripts because I am quite the gumby with JavaScript: 我用2个脚本编写了它,因为我对JavaScript非常了解:

<Script>
$(".collapse").click(function(){
  $(this).hasClass("in")?true : (function(){
      $(this).children("i").removeClass('fa-caret-down');
      $(this).children("i").addClass('fa-caret-up');
  }, function () {
      $(this).children("i").removeClass('fa-caret-up');
      $(this).children("i").addClass('fa-caret-down');
  });
});
</script>

<Script>
$(".collapse").click(function(){
  $(this).hasClass("in")?true : (function(){
      $(this).children("i").removeClass('More');
      $(this).children("i").addClass('Less');
  }, function () {
      $(this).children("i").removeClass('Less');
      $(this).children("i").addClass('More');
  });
});
</script>

The names of the elements are all things like collapseBech, collapseTrev etc. 元素的名称是诸如fallingBech,collapseTrev等之类的所有东西。

Is this something obvious I am missing? 这是我很想念的东西吗?

The HTML HTML

<p class="text-justify">The cat sat on the mat</p>
<div class="collapse" id="collapseBech">
    <p class="text-justify">The cat sat on the mat</p>
</div>
<a class="btn btn-primary" role="button" data-toggle="collapse" href="#collapseBech" aria-expanded="false" aria-controls="collapseBech">
    Read More <i class="fa fa-caret-down"></i>
</a>

<p class="text-justify">The cat sat on the mat</p>
<div class="collapse" id="collapseTrev">
    <p class="text-justify">The cat sat on the mat</p>
</div>
<a class="btn btn-primary" role="button" data-toggle="collapse" href="#collapseTrev" aria-expanded="false" aria-controls="collapseTrev">
    Read More <i class="fa fa-caret-down"></i>
</a>

<p class="text-justify">The cat sat on the mat</p>
<div class="collapse" id="collapseNat">
    <p class="text-justify">The cat sat on the mat</p>
</div>
<a class="btn btn-primary" role="button" data-toggle="collapse" href="#collapseNat" aria-expanded="false" aria-controls="collapseNat">
    Read More <i class="fa fa-caret-down"></i>
</a>

The way you are using the ternary operator is not correct, you are doing: 您使用三元运算符的方式不正确,您正在执行以下操作:

[condition]?true : [code_if_true] , [code_if_false];

but the right syntax is: 但是正确的语法是:

[condition]?  [code_if_true] : [code_if_false];

note that you don't use the keyword "true" and the colon ( : ) separates the two code blocks, not a comma as in your code. 请注意,您不使用关键字“真”和冒号( : )两个代码块,而不是逗号分隔在你的代码。

However, your code is quite long so the ternary operator is not a good idea, you should use a simple if-else such as: 但是,您的代码很长,因此三元运算符不是一个好主意,您应该使用简单的if-else,例如:

EDIT: 编辑:

I have changed the code below after seeing your HTML code in your last edit. 在上次编辑中看到您的HTML代码后,我更改了下面的代码。 The problem is that you are triggering the event when someone clicks on the element with class collapse , but that's wrong because you click on the button not on the .collapse element: 问题是,当有人单击具有类collapse的元素时,您将触发事件,但这是错误的,因为您单击的按钮不在.collapse元素上:

$(".collapse").click(function(){}); // This is wrong

you need to assign a class, let's call it clickable-butn , to each of the buttons, so that later we can apply the .click() event to this class: 您需要为每个按钮分配一个类,我们将其称为clickable-butn ,以便稍后我们可以将.click()事件应用于该类:

<p class="text-justify">The cat sat on the mat</p>
<div class="collapse" id="collapseBech">
    <p class="text-justify">The cat sat on the mat</p>
</div>
<a class="btn btn-primary clickable-butn" role="button" data-toggle="collapse" href="#collapseBech" aria-expanded="false" aria-controls="collapseBech">
    <span>Read More </span><i class="fa fa-caret-down"></i>
</a>

<p class="text-justify">The cat sat on the mat</p>
<div class="collapse" id="collapseTrev">
    <p class="text-justify">The cat sat on the mat</p>
</div>
<a class="btn btn-primary clickable-butn" role="button" data-toggle="collapse" href="#collapseTrev" aria-expanded="false" aria-controls="collapseTrev">
    <span>Read More </span><i class="fa fa-caret-down"></i>
</a>

<p class="text-justify">The cat sat on the mat</p>
<div class="collapse" id="collapseNat">
    <p class="text-justify">The cat sat on the mat</p>
</div>
<a class="btn btn-primary clickable-butn" role="button" data-toggle="collapse" href="#collapseNat" aria-expanded="false" aria-controls="collapseNat">
    <span>Read More </span><i class="fa fa-caret-down"></i>
</a>

<div id="output">
</div>

Now let's check how the code would look like: 现在,让我们检查一下代码的样子:

$(".clickable-butn").click(function(){
  // now, $(this) is the button we just clicked...
  // Now let's find the id of the .collapse element that is associated to $(this) button
  var idOfCollapse = $(this).attr("href");
  // now that we know its id, we can check if it is visible
  // note that we are checking if it was visible BEFORE the click...
  if($(idOfCollapse).is(":visible")){ 
      $(this).children("span").text($(this).children("span").text().replace("Less", "More"));
      $(this).children("i").removeClass('fa-caret-down');
      $(this).children("i").addClass('fa-caret-up');
    } else {
      $(this).children("span").text($(this).children("span").text().replace("More", "Less"));
      $(this).children("i").removeClass('fa-caret-up');
      $(this).children("i").addClass('fa-caret-down');
  }
});

You will see that when you click the button, the text changes from "Read More" to "Read Less" and vice versa. 您将看到单击按钮时,文本从“阅读更多”更改为“阅读较少”,反之亦然。

you can use build-in Bootstrap's collapse event 您可以使用内置的Bootstrap的折叠事件

$('#collapseBech, #collapseTrev, #collapseNat').on('hide.bs.collapse', function () {
     // do something…
     $(this).next("a").css({"background": "#ff0000"});
     $(this).next("a").children("i").removeClass('More').addClass('Less').removeClass('fa-caret-down').addClass('fa-caret-up');
});
$('#collapseBech, #collapseTrev, #collapseNat').on('show.bs.collapse', function () {
     // do something…
     $(this).next("a").css({"background": "#00ff00"});
});

try this demo 试试这个演示

jsfiddle.net/my9z7zhc jsfiddle.net/my9z7zhc

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM