1

jquery右クリックイベントでメニューを表示する機能があります。関数内の親関数からオブジェクトにアクセスしたいcallback

次のJQuery プラグインを使用して、コンテキスト メニューを取得しています。

コードは次のとおりです。

function OnContextMenu() {

     //alert(key + ' ' +this.Node.Content);
     var localNode = this.Node;
     alert(localNode.Content); //CORRECT NODE VALUE GETS ALERTED

        $.contextMenu({
            selector: '.Container', 
            callback: function(key, options) {
                var m = "clicked: " + key;
                 alert(localNode.Content); //ALWAYS PRINTS THE VALUE OF THE VERY FIRST NODE THAT WAS CLICKED. 
                // window.console && console.log(m) || alert(m); 
            },
            items: {
                "edit": {name: "Edit", icon: "edit"},
                "cut": {name: "Cut", icon: "cut"},
                "copy": {name: "Copy", icon: "copy"},
                "paste": {name: "Paste", icon: "paste"},
                "delete": {name: "Delete", icon: "delete"},
                "sep1": "---------",
                "quit": {name: "Quit", icon: "quit"}
            }
        });
    }

ご覧のとおり、値を変数に格納しています。

var localNode = this.Node;

関数内でこの変数を使用しcallbackます。これに関する奇妙な点はalert(localNode.Content);、メニューが最初にクリックされたときにコールバックの内部が正しい値を与えることです。その後alert、外側の関数の が異なる値を正しく返しても、内側のコールバック関数は最初と同じ古い値を表示し続けます。

4

2 に答える 2

0

私はここで非常に単純なことを見逃していたので、今はかなり愚かだと感じています。グローバル変数を使用する場合と同様に、関数の外部で変数を宣言することで、この問題を解決することができました。

以下は変更点です。

 var localNode;

 function OnContextMenu() {

 //alert(key + ' ' +this.Node.Content);
 localNode = this.Node;
 alert(localNode.Content); //CORRECT NODE VALUE GETS ALERTED

    $.contextMenu({
        selector: '.Container', 
        callback: function(key, options) {
            var m = "clicked: " + key;
             alert(localNode.Content); //ALWAYS PRINTS THE VALUE OF THE VERY FIRST NODE THAT WAS CLICKED. 
            // window.console && console.log(m) || alert(m); 
        },
        items: {
            "edit": {name: "Edit", icon: "edit"},
            "cut": {name: "Cut", icon: "cut"},
            "copy": {name: "Copy", icon: "copy"},
            "paste": {name: "Paste", icon: "paste"},
            "delete": {name: "Delete", icon: "delete"},
            "sep1": "---------",
            "quit": {name: "Quit", icon: "quit"}
        }
    });
}
于 2012-09-28T11:14:49.117 に答える
0

メソッドはわかりませんが.contextMenu()(おそらくURLを教えてください)、コンテキストメニューは1回だけ(!)追加され、.Containerその後の呼び出しごとに返されるようです(コンテキストメニューがすでに存在するため).Container)。これは単なる経験に基づいた推測です。

于 2012-09-28T06:00:36.497 に答える