即時有點卡在這裏。一些提示會非常好。
Asume我必須有一個多維的對象數組,這些對象包含我想在鼠標懸停(play,stop,showFrame等)上使用的函數。但他們並不是所有尚未加載,所以我的第一種方法是使用jQuery:將函數綁定到數組中的對象,避免關閉錯誤
.on("mouseover", function() { ... }
,直到我遇到了一個閉合的問題,這是已經討論過幾次,這裏在計算器上和其他地方。首先,我嘗試着在另一個SO-thread上給出解決方案時遇到問題,直到遇到可以在.bind()中傳遞的eventData。的SO-封閉溶液我已經首先在下文評論的,活性的代碼包含我的方法與.bind EVENTDATA:
$(function(){
for (var r=0, firDep=menu[0][0].length; r<firDep; r+=1){
objects[0][0][r].init();
}
for(var f=0, livLen=menu.length; f<livLen; f++){
for(var g=0, livWid=menu[f].length; g<livWid; g++){
for(var h=0, livDep=menu[f][g].length; h<livDep; h++){
if(menu[f][g][h]){
// (function() {
// var fr = f;
// var gr = g;
// var hr = h;
// to apply this prior solution, i would simply replace all occurences of e.data.** with ** again and all .bind's with .on's
$('#'+menu[f][g][h]).bind("mouseover", { fr: f, gr: g, hr: h}, function(e) {
if(objects[e.data.fr][e.data.gr][e.data.hr].status==0){
objects[e.data.fr][e.data.gr][e.data.hr].showFrame(1);
}
});
$('#'+menu[f][g][h]).bind("mouseout", { fr: f, gr: g, hr: h}, function(e) {
if(objects[e.data.fr][e.data.gr][e.data.hr].status==0){
objects[e.data.fr][e.data.gr][e.data.hr].showFrame(0);
}
});
$('#'+menu[f][g][h]).bind("click", {fr: f, gr: g, hr: h}, function(e) {
e.preventDefault();
if(objects[e.data.fr][e.data.gr][e.data.hr].status!=1 || objects[e.data.fr][e.data.gr][e.data.hr].status!=2){
for(var t=0, tstLen=menu[e.data.fr][e.data.gr].length; t<tstLen; t++){
if(objects[e.data.fr][e.data.gr][t].status==1 || objects[e.data.fr][e.data.gr][t].status==2){
objects[e.data.fr][e.data.gr][t].stop();
objects[e.data.fr][e.data.gr][t].playReverse();
}
}
objects[e.data.fr][e.data.gr][e.data.hr].stop();
objects[e.data.fr][e.data.gr][e.data.hr].play();
finc = e.data.fr+1;
if(menu[finc][e.data.hr] && menu[finc][e.data.hr].length > 0){
$('#menu'+finc).load('menu'+finc+e.data.hr+'.php', function() {
for(var b=0, ldLen=menu[finc][e.data.hr].length; b<ldLen; b++){
objects[finc][e.data.hr][b].init();
}
$('#menu'+finc).slideDown('slow');
});
} else {
if ($('#menu2').is(':visible')) {
$('#menu2').slideUp('slow', function() {
$('#menu1').slideUp('slow', function() {
$('#menu1').empty();
$('#menu2').empty();
});
});
} else if ($('#menu1').is(':visible')){
$('#menu1').slideUp('slow', function() {
$('#menu1').empty();
});
}
}
loadContent(menu[e.data.fr][e.data.gr][e.data.hr]+".php");
}
});
//})(); //function execution for prior closure-defeating attempt
}
}
}
}
});
所以我有3D陣列菜單[] [] [],定義結構, (),stop()等功能的對象[] [] []的三維數組,我有3個菜單div,#menu0,#menu1,#menu2將包含適當的深度'菜單。
基本上這兩種解決方案都可以工作,但只適用於從一開始就已經加載到頁面上的元素。例如鼠標懸停部分不觸發編後來的div是負載(),但很好的選擇
$('#'+menu[f][g][h]).
匹配的替代解決方案,我發現這裏的話,你會刪除評論中開始得到這個匿名函數,用適當的**替換所有的e.data。**,用.on替換所有的.binds,當然還要刪除{fr:f,gr:g,hr:h } eventData部分。哦,並刪除最後的函數直接執行的註釋})();
任何暗示都會很棒,在此先感謝您的時間。
----編輯----
接受,這是一團糟。我會採取不同的方式,感謝您的幫助。然而,即使是更簡單的形式,邏輯問題依然存在,我真的對答案感興趣,只是爲了理解背後的基本邏輯問題。關於修補程序或on()我一點都不瞭解。 所以我用一個更簡單的例子在 jQuery: click function bind in for-loop with closure fix重新問這個問題。
嗨卡爾。誠實地說,我不認爲代碼是可挽救的。如果你有機會得到它的工作,將來將無法維持。你可以用5-10行代碼實現你想要做的事情,沒有循環,沒有三維數組,也沒有重複。你可以發表一個新的問題,將你的問題陳述提煉成最簡單的形式,然後從這裏開始。 – david