كيفية تمرير من قبل عناصر من حيث القيمة من صفيف إلى متغير في جافا سكريبت

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

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا أحاول أن يتكرر خلال مجموعة "fSel.sI"، واستنادا إلى البيانات داخل يوصلها كقيم (وليس مرجع) إلى عدد من الإعلانات وظيفة. الآن المشكلة هي أن mydrag يحتوي على مرجع، وكما يحصل القابل للسحب وصفته يستخدم بيانات العنصر مجموعة الماضية. وبالتالي عندما تبدأ: السحب: وقف: ويسمى، والقيم ليست فريدة من نوعها. مساعدة؟

makeDraggable : function() {
        // create new draggable
        for (var i = 0; i < fSel.sI.length; i++) {
            mydrag = fSel.sI[i];
            $("#" + mydrag).draggable({
                cancel: [''],
                distance: 5,
                containment: "#fWorkspace",
                handle: mydrag,
                start: function() { dragRegister(mydrag)},
                drag: function() { dragItems(mydrag)},
                stop: function() { dragStop(mydrag)}
            });
        }
    },
هل كانت مفيدة؟

المحلول

النظر في الإغلاق .

وحاول البرمجية التالية:

makeDraggable : function() {
        // create new draggable
        for (var i = 0, l = fSel.sI.length, sI = fSel.sI; i < l; i++) {
                var mydrag = sI[i];
                (function(mydrag) {
                            $("#" + mydrag).draggable({
                                    cancel: [''],
                                    distance: 5,
                                    containment: "#fWorkspace",
                                    handle: mydrag,
                                    start: function() { dragRegister(mydrag); },
                                    drag: function() { dragItems(mydrag); },
                                    stop: function() { dragStop(mydrag); }
                            });
                })(mydrag);
         }
},

والمشكلة هي مع وظائف start، drag، وstop. انهم لا تنفيذ فورا؛ في الوقت الذي تفعل، تم ضبط mydrag إلى قيمة أخرى. عن طريق لف وظيفة ذاتية التنفيذ في جميع أنحاء كتلة التعليمات البرمجية التي تحتوي على هذه الوظائف، نقوم بإنشاء الإغلاق، حيث لا يغير mydrag.

<قوية> ملاحظة: بالنسبة أسباب تتعلق بالأداء، عند الوصول إلى خصائص كائن أكثر من مرة واحدة، فمن الأفضل أن إنشاء متغير المراجع (أو تحمل) الممتلكات. في حلقة for الخاص بك، لقد خلقت اثنين من المتغيرات l وsI التي تخزن fSel.sI.length وfSel.sI (على التوالي) بحيث لا يكون جافا سكريبت للبحث عن sI وlength خصائص كل مرة حول الحلقة.

نصائح أخرى

وذلك لأن لديك خلق الإغلاق. جرب هذا بدلا

makeDraggable : function() {
        // create new draggable
        for (var i = 0; i < fSel.sI.length; i++) {
                mydrag = fSel.sI[i];
                $("#" + mydrag).draggable({
                        cancel: [''],
                        distance: 5,
                        containment: "#fWorkspace",
                        handle: (function(mydrag){return mydrag;}(mydrag)),
                        start: (function(mydrag){return function() { dragRegister(mydrag)};}(mydrag)),
                        drag: (function(mydrag){return function() { dragItems(mydrag)};}(mydrag)),
                        stop: (function(mydrag){return function() { dragStop(mydrag)};}(mydrag))
                });
        }
    },

ونلقي نظرة على هذا الفيديو لفهم فائدة قوية والإغلاق جافا سكريبت: http://vimeo.com/1967261

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