jQuery .live ( « clic », fn) ne fonctionne que sur le deuxième clic
-
22-09-2019 - |
Question
J'ai un élément DOM qui est généré avec js, et donc quand je veux lier un écouteur d'événement click je dois utiliser $(generatedEl).live("click", fn...)
(est-il une autre façon?)
voici le code que je utilise:
$(".toggleView").live("click", function(){
if(isTrunced){
$(this).html(cntarctText).siblings("h3").html(currEl.data("md").myFullText)
isTrunced = false
}
else{
$(this).html(expandText).siblings("h3").html(currEl.data("md").truncedText)
isTrunced = true
}
});
(ce qui est en plein milieu d'une .each()
)
Mais la fonction ne fonctionne que sur le second clic.
quelqu'un peut me s'il vous plaît aider à traquer ce bug bizarre, Merci
EDIT:. Ajouté tout le bloc de code
var truncMe = function(passedNode, passedChanges){
var truncTarget = passedNode,
expandText = "more",
cntarctText = "less",
isTooLong = false,
isTrunced = false,
maxChar = 170,
toggleView
truncTarget.each(function (index, domEle) {
var currEl = $(domEle)
currEl.data("md", {myFullText:currEl.html(),isTooLong:false, isTrunced:false })
if(currEl.data("md").myFullText.length >= maxChar){
currEl.data("md").truncedText = currEl.data("md").myFullText.substring(0, maxChar);
currEl.data("md").isTooLong = true;
currEl.siblings(".toggleView").remove()
if(passedChanges){
currEl.data("md").myFullText = passedChanges;
currEl.data("md").truncedText = currEl.data("md").myFullText.substring(0, maxChar);
}
/* here the element is created */
toggleView = $("<div class='toggleView'/>").html(expandText).appendTo(currEl.parent());
currEl.html(currEl.data("md").truncedText)
/* here the event is binded */
$(".toggleView").live("click", function(){
if(isTrunced){
$(this).html(cntarctText).siblings("h3").html(currEl.data("md").myFullText)
isTrunced = false
}
else{
$(this).html(expandText).siblings("h3").html(currEl.data("md").truncedText)
isTrunced = true
}
});
}
else{
currEl.siblings(".toggleView").remove()
}
});
}
La solution
La grande chose au sujet .live()
est qu'il n'a pas besoin d'être appelé plus d'une fois. Tout ce que vous avez à faire est de prendre de la .each()
.
Puisque vous utilisez une classe comme un sélecteur tout élément que vous allez créer avec cette classe sera automatiquement liée à l'événement click.
Autres conseils
Il semble que la variable « isTrunced » doit être extrait à partir des données. Comme il ne se définit pas initally (dans la fonction live) il sera par défaut à false.
Donc, une fois que vous tirez la fonction en direct de la chaque boucle, essayez ceci:
$(".toggleView").live("click", function(){
if($(this).data("isTrunced")){
$(this).html(cntarctText).siblings("h3").html(currEl.data("md").myFullText)
$(this).data("isTrunced", "false");
} else {
$(this).html(expandText).siblings("h3").html(currEl.data("md").truncedText)
$(this).data("isTrunced", "true");
}
});
OK, je suis le problème
la logique du cas était bogué.
est corrigée:
if(isTrunced){
$(this).html(cntarctText).siblings("h3").html(currEl.data("md").myFullText)
isTrunced = false
}
else{
$(this).html(expandText).siblings("h3").html(currEl.data("md").truncedText)
isTrunced = true
}
En tout cas merci Ariel , bon point.