JQuery .Live ("Click" ، FN) يعمل فقط على النقر الثاني

StackOverflow https://stackoverflow.com/questions/2134577

  •  22-09-2019
  •  | 
  •  

سؤال

لدي عنصر DOM الذي يتم إنشاؤه باستخدام JS ، وبالتالي عندما أرغب في ربط مستمع حدث نقرة أحتاج إلى استخدامه $(generatedEl).live("click", fn...) (هل هناك طريقة مختلفة؟)

هنا هو الرمز الذي أستخدمه:

$(".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
                        }       
                     });

(هذا في منتصف أ .each())

لكن الوظيفة تعمل فقط على النقر الثاني.

هل يمكن لشخص ما مساعدتي في تتبع هذا الخطأ الغريب ، شكرًا

تحرير: أضيفت كتلة الكود بأكمله.

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

                    }
             });                                                        

        }
هل كانت مفيدة؟

المحلول

الشيء العظيم .live() هو أنه لا يحتاج إلى أن يطلق عليه أكثر من مرة. كل ما عليك فعله هو إخراجها من .each().

نظرًا لأنك تستخدم فئة كمحدد ، فإن أي عنصر ستنشئه مع هذا الفصل سيكون مرتبطًا تلقائيًا بحدث النقر.

نصائح أخرى

يبدو أن المتغير "isTrunced" يحتاج إلى استخراج من البيانات. نظرًا لأنه لم يتم تعريفه في البداية (داخل الوظيفة المباشرة) ، فإنه سوف يكون افتراضيًا إلى خطأ.

لذلك بمجرد سحب وظيفة Live من كل حلقة ، جرب هذا:

$(".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");
 }
});

حسنًا ، لقد حصلت على المشكلة

منطق IF كان عربات التي تجرها الدواب.

هذا هو التصحيح:

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
  }       

على أي حال بفضل أرييل, ، نقطة جيدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top