2017-06-20 220 views
0

我從我的jquery-contextmenu sumbenu調用函數,根據點擊哪個選項傳遞一個特定的參數。來自jquery conextmenu的參數調用函數

我根據包含三個名稱的js對象生成該子菜單。當我點擊其中的一個時,就會顯示它,我的函數被稱爲參數,然後打印在控制檯上。

但它只是調用最後一個元素的函數,我不知道爲什麼。當我點擊「約翰」或「馬特」時,它只顯示「你按Petter」。

就像這個形象:

enter image description here

即使我從來沒有點擊「皮特」,它只是顯示「您按下皮特」。

代碼(我可以在這裏把小提琴,但我沒有發現jquery的文本菜單鏈接,我會很高興,如果你把它分享給我的,如果存在的話):

var obj = {"1":"john","2":"Matt","3":"Petter"}; 

function myFun(name){ 
    console.log("you pressed "+name); 
} 

$(function() { 
$.contextMenu({ 
    selector: '.context-menu-one', 
    autoHide: true, 
    build: function($trigger, e) { 
    var options = { 
     items: {} 
    } 

    options.items["users"] = {name: "users", icon: "fa-circle", items: {}} 

    for(var i in obj){ 
     options.items["users"].items[obj[i]] = {name: obj[i], icon: "fa-user", callback: function(){ 
     myFun(obj[i]); 
     }} 
    } 

    return options; 
    } 
}); 
}); 

對不起我的英語不好,謝謝。

回答

1

這是由於在javascript語言中關閉。在回調中對變量i的引用將被存儲並在之前被調用到範圍之外,但是,循環將已經運行並且全局範圍的i將總是等於最後的索引。爲了解決這個問題改變你的循環這樣

for(var i in obj){ 
    (function(j) { 
    options.items["users"].items[obj[j]] = {name: obj[j], icon: "fa-user", callback: function(){ 
     myFun(obj[j]); 
     } 
    } 
    })(i); 
} 

這將創建保持封閉在循環,並保持i的值等於目前正在在itterated的指數函數內的一個新的領域的工作,使菜單正常工作。

+0

美麗,TY這麼多! –

1
for(var i in obj){ 
    options.items["users"].items[obj[i]] = { 
    name: obj[i], 
    icon: "fa-user", 
    callback: function(){ 
     myFun(obj[i]); // here is the problem 
    } 
    } 
} 

問題是由JS閉合,其變量是在每一個回調捕獲在循環引起的。 所以當你執行回調時點擊菜單將永遠是相同的,因爲它們是相同的變量。並且i的值將爲循環完成時的值,在您的示例中爲「3」。

這裏是你如何能做到用IIFE(立即調用函數表達式),以避免問題

for (var i in obj) { 
    (function (i) { 
    // here goes the code in your for loop 
    })(i); 
}