1
votes

Basculer le texte entre plusieurs boutons

Je voudrais avoir deux boutons qui sont essentiellement des catégories. Appelons-les catégorie A et catégorie B. Ils sont affichés à gauche et à droite. Ci-dessous, je voudrais afficher du texte qui dépend de la catégorie choisie (c'est-à-dire le bouton cliqué) afin que la catégorie A montre le texte A et la catégorie B montre le texte B.

Ceci est pour le HTML. Je travaille sur une page d'accueil wordpress.

J'ai pu installer un bouton qui bascule le texte (essentiellement le bouton 1 = Catégorie A). Mais je n'ai pas réussi à insérer un deuxième bouton (essentiellement bouton 2 = Catégorie B). Des idées? Très apprécié!

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>

<p>Click the button to swap the text of the DIV element:</p>

<p><button onclick="myFunction()">Click Me</button></p>

<div id="myDIV">Hello</div>

<script>
function myFunction() {
  var x = document.getElementById("myDIV");
  if (x.innerHTML === "Hello") {
    x.innerHTML = "Swapped text!";
  } else {
    x.innerHTML = "Hello";
  }
}
</script>

</body>
</html>

Je m'attends à avoir 2 boutons qui affichent 2 catégories, le texte devrait basculer en fonction du bouton sur lequel on a cliqué.


3 commentaires

jsfiddle.net/wb7efL4g


Bonjour Tobias, bienvenue sur Stackoverflow. Lorsque vous posez des questions, veuillez vous reporter à la page suivante et modifier votre question en conséquence afin que nous puissions fournir une meilleure réponse à vos questions. Veuillez nous fournir tout code que vous avez essayé et partagez-nous tout problème que vous rencontrez avec ce code (par exemple, vous n'utilisez qu'un seul bouton dans le code donné ci-dessus).


Cela semble mieux fonctionner à long terme: jsfiddle.net/wb7efL4g/1


4 Réponses :


0
votes

J'ai fait un codepen rapide comme exemple.

Vous pouvez y parvenir en passant un paramètre à la fonction onClick. Dans cet exemple, je garde une trace du dernier bouton cliqué et du texte qu'il doit rendre. Si le dernier bouton sur lequel vous avez cliqué était le même, le bouton est revenu à la valeur par défaut. J'espère que cela vous aidera.

https://codepen.io/maffekill/pen/ rbpjzw

HTML

// Keep track of the button currently clicked
var activeBtn = null; 

function myFunction(btnId, text) {

  var x = document.getElementById("myDIV");
  // If the last button is the same as the new one, show default text
  if (activeBtn === btnId) {
    x.innerHTML = "Default Text";
    activeBtn = null
  } else {
  // Else show the text given to the text param
    x.innerHTML = text;
      activeBtn = btnId;
  }


}

JS

<p>Click the button to swap the text of the DIV element:</p>

<p><button onclick="myFunction(1, 'TEXT A')">TEXT A</button></p>
<p><button onclick="myFunction(2, 'TEXT B')">TEXT B</button></p>
<div id="myDIV">Default Text</div>


0 commentaires

2
votes

Pourrait mettre la description dans un attribut, puis obtenir la valeur des attributs en cliquant et changer le html de la description. Voici un jsFiddle

<div>
  <button class="js-button default-button" data-description="Category A's Description" onclick="myFunction(this)">
    Category A
  </button>
  <button class="js-button default-button" data-description="Category B's Description" onclick="myFunction(this)">
    Category B
  </button>
</div>

<div id="js-description" class="description">
</div>

<script>
function myFunction(elem) {
  var x = document.getElementById("js-description");
  var description = elem.getAttribute('data-description');
  x.innerHTML = description;
  
  var button = document.getElementsByClassName('js-button');
  
  for (var i = 0; i < button.length; i++) {
    button[i].classList.remove('active-button');
  }
  
  elem.classList.add('active-button');
}
</script>

<style>
  .default-button{
    font-size:16px;
    border-radius: 4px;
    padding:7px 12px;
  }
  .active-button{
    background:blue;
    color:#fff;
  }
  .description{
    margin-top:20px;
  }
</style>


14 commentaires

Méthode intelligente. Je l'aime.


@BritishSam, comment changer le formatage de la description des données? Changer la taille, le visage et la couleur de la police? Je suis capable de formater les boutons lui-même mais je ne peux pas formater la description ... l'aide est très appréciée :)


Serait-ce la même chose pour chaque description de catégorie? Si oui, ajoutez une classe à la description div et faites un peu de css?


Oui, je suppose que ce serait la même chose pour chaque description de catégorie. Laissez-moi essayer, merci!


@BritishSam Où dois-je insérer ma classe dans la description de la catégorie? Ceci est mon css


@TobiasK


Merci @BritishSam. Je l'ai eu comme ça avant en fait mais je n'ai pas travaillé. J'ai cependant trouvé mon erreur. J'ai eu du texte formaté comme un en-tête qui a ruiné i. Merci encore pour votre soutien ;)


Une dernière question et idée ... J'adorerais que l'utilisateur puisse différencier visuellement les boutons i. e. lequel est actif et lequel est inactif. Peut-être en mettant en surbrillance le bouton actif .. Comment pourrais-je réaliser cela @BritishSam?


@BritishSam wow c'est génial. Ce serait parfait, j'utilisais la disposition des boutons par défaut. J'ai déjà formaté les boutons et ajouté la classe aux boutons. Lorsque j'utilise "js-button" comme classe, cela fonctionne bien mais avez-vous une idée de la façon dont je pourrais utiliser mes propres styles de boutons et changer simplement leur couleur une fois que le bouton est cliqué? Merci d'avance


vous pouvez ajouter plus d'une classe aux boutons pour les styliser, alors ajoutez comme .default-button à chaque bouton puis créez .active-button pour le style actif button class = "js-button default-button" js-button ne devrait pas avoir de style appliqué, c'est juste pour être ciblé par javascript


@BritishSam Comment démarrer avec 2 boutons décochés? actuellement, l'un d'eux est actif lors de la première visite du site. je voudrais qu'ils soient inactifs au début ...


retirer la classe active-button du premier bouton, supprimer le texte du div js-description


Réponse mise à jour, vous pouvez également ajouter autant de catégories de boutons que vous le souhaitez


incroyable, merci beaucoup @BritishSam. C'est mieux que chaque conférence universitaire :)



0
votes

Il existe plusieurs façons d'y parvenir, mais la manière la plus simple que je pourrais trouver pour vous l'expliquer serait la suivante:

<p>Click the button to swap the text of the DIV element:</p>

<p>
  <button onclick="myFunction(this)" value="a">
    Category A
  </button>
  <button onclick="myFunction(this)" value="b">
    Category B
  </button>
</p>

<div id="myDIV">Hello</div>
function myFunction(myEle) {
  var x = document.getElementById("myDIV");
  x.innerHTML = "This is category " + myEle.value;
}

JSFiddle

Pas besoin de trop compliquer les choses.

Premièrement, vous souhaitez envoyer l'élément cliqué de l'appelant (qui dans ce cas serait également l'élément cliqué, l'élément ). Vous pouvez utiliser this de JavaScript à cette fin.

Dans votre fonction, vous pouvez nommer un paramètre entre parenthèses, donc dans mon exemple ci-dessus: function myFunction () code > contient un paramètre appelé myEle donc il ressemblera à: function myFunction (myEle) . Une fois la fonction déclenchée, le paramètre appelé myEle sera défini sur l'élément cliqué (ou JavaScript this ). Vous pouvez simplement accéder à l'un de ses attributs comme value en utilisant un point: myEle.value.

Sachant ce qui précède, vous pouvez l'appliquer à n'importe quoi vous avez besoin de votre fonction (reportez-vous à mon exemple de code ci-dessus).


0 commentaires

1
votes

Je n'aime pas vraiment toutes ces solutions car tout est écrit à partir de JS mais le contenu vient probablement de la base de données. Voici donc ma solution:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button data-toggle="tab" data-target="#cat-A-content">
Cat A
</button>
<button data-toggle="tab" data-target="#cat-B-content">
Cat B
</button>

<div class="tab-contents">
  <div class="tab active" id="cat-A-content">
    My category A contents
  </div>
  <div class="tab" id="cat-B-content">
    My category B contents
  </div>
</div>
.tab-contents .tab {
  display: none;
}
.tab-contents .tab.active {
  display: block;
}
// Native JS version
// Working Fiddle : https://jsfiddle.net/d34cbtw7/
var togglers = document.querySelectorAll('[data-toggle="tab"]');

for (var i = 0; i < togglers.length; i++) {
    togglers[i].addEventListener('click', function() {
        var tabs = document.querySelectorAll('.tab');
        for(var j = 0; j < tabs.length; j++) {
            tabs[j].classList.remove('active');
        }
        var $target = document.querySelector(this.getAttribute('data-target'));
        $target.classList.add('active');
    });
}

// jQuery version
$('body').on('click', '[data-toggle="tab"]', function(e) {
  e.preventDefault();
  // Select our target
  var $target = $($(this).data('target'));
  // Hide all tabs
  $('.tab-contents .tab').removeClass('active');
  // Show only $target tab
  $target.addClass('active');
});

Je n'aime pas non plus vraiment l'attribut "onclick" en HTML ...


2 commentaires

Il n'utilise pas jQuery


Mon mal, je ne l'ai pas remarqué. J'ai ajouté une version native de JS.