Si la balise details a un attribut open , le texte summary indiquera "Close".
Ma tentative de modification du texte:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <details class="description" open> <summary class="">Show</summary> <p class="">Description text</p> </details>
if (jQuery("details").click().attr("open")) {
jQuery("summary").text("Close");
} else if (jQuery("details").click().attr("")) {
jQuery("summary").text("Show")
}
3 Réponses :
Utilisez hasAttribute () pour vérifier si l'attribut existe ou non.
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <details class="description" open> <summary class=""></summary> <p class="">Description text</p> </details>
$("summary").html("Close");
$("details").click(function() {
if ($(this)[0].hasAttribute("open")) {
$("summary").html("Show");
} else {
$("summary").html("Close");
}
});
Je vous remercie. Par hasard si j'avais 5 ou 10 détails / résumés, est-ce que je pourrais n'affecter que celui qui a été cliqué?
Encore une fois, utilisez simplement CSS pour cela au lieu de jQuery ou Javascript. CSS n'a pas non plus ce problème.
OP a mis jquery comme balise alors je lui ai donné une réponse dans jQuery. @connexo
@Paolo C'est parfaitement bien! Je voulais juste souligner la solution supérieure pour ce cas d'utilisation spécial.
Utilisez simplement CSS pour cela, ici combiné avec un effet de décoloration / croissance / réduction soigné:
<details class="description" open> <summary data-open="Close" data-close="Show"></summary> <p>Description text</p> </details>
details.description[open] summary::after {
content: attr(data-open);
}
details.description:not([open]) summary::after {
content: attr(data-close);
}
Voici la version minimale:
<details class="description" open> <summary data-open="Close" data-close="Show"></summary> <p>Description text</p> </details>
details.description summary::after {
content: attr(data-open);
opacity: 0;
font-size: 5px;
}
details.description[open] summary::after {
content: attr(data-open);
opacity: 1;
font-size: 14px;
}
details.description summary::before {
content: attr(data-close);
opacity: 0;
font-size: 5px;
}
details.description:not([open]) summary::before {
content: attr(data-close);
opacity: 1;
font-size: 14px;
}
details.description summary::after,
details.description summary::before {
display: inline-block;
transition: all .4s ease-in-out;
transform-origin: center bottom;
}
Parfait. Cela me permet de ne pas savoir comment cibler l'élément sur lequel l'utilisateur clique. Je ne savais pas à ce sujet. Merci.
Avec seulement CSS, vous pouvez même faire en sorte que le texte actuel disparaisse et que l'autre disparaisse. Voir la réponse mise à jour.
Des liens qui approfondiraient cette fonctionnalité?
Nan. Tout est dans ma tête, je suppose. Peut-être que quelqu'un d'autre peut trouver un lien?
Voici une solution minimaliste sans utiliser de CSS .
Ajoutez ou supprimez simplement l'attribut "open" en utilisant .attr () et . removeAttr () .
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
<details>
<summary>See details</summary>
<p>My details</p>
</details>
</div>
$("summary").click(function() {
if($("details")[0].hasAttribute("open")) {
$("summary").html("See details");
$("details")[0].removeAttr("open");
} else {
$("summary").html("Hide details");
$("details")[0].attr("open");
}
});
Devez-vous utiliser l'attribut? pourquoi ne pas utiliser l'attribut de données avec vrai et faux? data-open = "true" et lisez sa valeur comme ceci: data ('open'); et écrivez comme ceci: data ('open', true); Si vous DEVEZ utiliser l'attribut ... alors regardez cette réponse: stackoverflow.com/questions/1318076/...
Pas besoin du tout de Javascript ici. Ceci peut être réalisé avec CSS et est éternellement plus rapide. Voir ma réponse ci-dessous.