Dans un modal bootstrap j'ai un bouton, les propriétés de ce bouton changent en fonction de certaines données, de sorte que le bouton peut avoir l'un des deux états.
State1
//Action1() $(".action-complete-task").on("click", function (event) { //do action 1 } //Action2() $(".action-complete-task.action-2").on("click", function (event) { //do action 2 }
État 2
<button type="button" class="btn action-complete-task action-2">Action 2</button>
En fonction de l'état de ce bouton, je souhaite qu'il exécute la fonction javascript correspondante au clic, soit action1 ()
ou action2 .
J'ai essayé d'utiliser des sélecteurs CSS pour activer cela, mais le code que j'ai ci-dessous ne fonctionne pas. J'ai lu qu'en combinant deux classes dans un sélecteur JQuery sans espaces tels que .class1.class2
, le sélecteur effectuera un ET logique et ne sélectionnera que les éléments qui contiennent les deux class1
et class2
.
Dans mon code ci-dessous, j'ai $ ("# EditTask .action-complete-task.action2")
, qui ne devrait sélectionner que les éléments qui ont les deux classes .action-complete-task
et .action-2
, mais dans ce scénario particulier, seule la fonction action1 ()
est exécuté.
<button type="button" class="btn action-complete-task">Action 1</button>
La raison pour laquelle je veux utiliser des classes pour déterminer le comportement et non des ID spécifiques est due au fait qu'il existe d'autres fonctions qui affectent la conception du bouton à l'aide du sélecteur de classe .action-complete-task
, donc je veux que la conception du bouton soit effectuée quel que soit l'état dans lequel se trouve le bouton.
4 Réponses :
C'est facile à faire.
$(".action-complete-task").on('click', function(event){ if($(this).hasClass('action-2')){ //Do action 2 }else{ //Do action 1 } })
Il existe de nombreuses solutions pour cela, telles que:
1. Ajoutez la classe action-1
à votre premier bouton, de sorte que le gestionnaire soit
$(".action-complete-task").on("click", function(e) { const buttonClass = e.target.attr('class') if (class.includes('action-2') { // handle action 2 } else { // handle action 1 } })
$(".action-complete-task.action-1").on("click", function (event) {})
Comme je l'ai expliqué dans mon commentaire, la méthode (1) ne fonctionnera pas.
JavaScript pur
Vérifiez si l'élément sur lequel vous avez cliqué contient la classe 'action-2'.
<button type="button" class="btn action-complete-task" onclick="performAction(this)">Action 1</button> <button type="button" class="btn action-complete-task action-2" onclick="performAction(this)">Action 2</button>
performAction = (e) => { if (e.className.indexOf('action-2') === -1){ console.log('Perform Action 1') } else { console.log('Perform Action 2') } }
dans la mesure où je comprends votre problème, vous pouvez lier l'événement à un élément parent qui existe sur pageload avant exemple document
$(document).on('click','.action-complete-task:not(.action-2)',function(){ //...1 }) $(document).on('click','.action-complete-task.action-2',function(){ //...2 })
de cette façon, il devrait fonctionner avec éléments insérés manuellement (DOM-Manipulation) et ne pas déclencher l'action1 (comme c'est le cas maintenant car votre .action-2 appartient également à .action-complete-task)
Je préfère utiliser $ (body) .on ('click', '. Action-complete-task.action-2', function () {//...2})
, mais Je pense qu'il n'y a pas de grande différence, je commente seulement pour faire savoir aux autres qu'il existe également cette option.
Les écouteurs que vous configurez sont ajoutés au moment où cette ligne est exécutée. Ce qui signifie que si le bouton n'a pas la classe
action-2
lorsque ce code jQuery s'exécute, la 2ème ligne finit par ne rien faire. Ce que vous devez faire à la place est d'ajouter un seul auditeur, et à l'intérieur, cochez$ (this) .hasClass ("action-2")
(notez également que même si cela a fonctionné à votre façon, cliquez sur le bouton bouton dans l'état 2 déclencherait les deux fonctions, donc même le passage à$ (document) .on ("click", ".action-complete-task", ...)
ne fonctionnerait pas)$ (". action-complete-task"). not (". action-2"). on ("click"
... et vous devriez ajouter le code qui change les états@johnSmith Comme je l'ai expliqué dans mon commentaire précédent, le test de classe doit être effectué au moment du clic, pas au chargement de la page.