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()

                    }
             });                                                        

        }
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top