كيفية تمرير من قبل عناصر من حيث القيمة من صفيف إلى متغير في جافا سكريبت
-
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