wake-up-neo.net

jQuery-Plugin gibt "Eigenschaft von undefined nicht lesen" zurück

Ich versuche etwas zu tun, das ich schon oft gemacht habe. Ich kann nicht herausfinden, warum das nicht funktioniert. Egal wie ich den jQuery-Code schreibe, es funktioniert nicht. menuitems[i].action() funktioniert einfach NICHT. Unten ist Beispiel 1 , in dem dieses Beispiel, unabhängig davon, auf welches Element geklickt wird, die Aktion des letzten Elements zurückgibt (in diesem Beispiel ist es die alert('Forward!')). Die 2. gibt eine undefinierte Eigenschaft zurück. Der volle Fehler unten.

Mein jQuery-Plugin wird wie folgt aufgerufen (die folgenden Beispiele zeigen, was mit demselben Aufruf geschieht):

$('p').contextMenu([
    {
        name:'Back',
        action:function(){
            alert('Back!');
        },
        icon:'http://cdn.iconfinder.net/data/icons/crystalproject/16x16/actions/agt_back.png'
    },
    {
        name:'Forward',
        action:function(){
            alert('Forward!');
        },
        icon:'http://cdn.iconfinder.net/data/icons/crystalproject/16x16/actions/agt_forward.png'
    }
]);

Beispiel 1:

for (i in menuitems){
    $('<li/>',{
        'html':'<img src="'+menuitems[i].icon+'">'+menuitems[i].name,
        'class':o.itemClass,
        'click':function(){
            menuitems[i].action();
        }
    }).appendTo('.'+o.listClass);
}

Dies gibt eine Warnung mit Weiterleiten zurück! Unabhängig davon, auf welches Element, Zurück oder Vorwärts, geklickt wird.

Beispiel 2:

var len = menuitems.length;
for (var i = 0; i < len; i++){
    $('<li/>',{
        'html':'<img src="'+menuitems[i].icon+'">'+menuitems[i].name,
        'click':function(){
            menuitems[i].action();
        },
        'class':o.itemClass
    }).appendTo('.'+o.listClass);
}

Ich bekomme:

Nicht abgerufener TypeError: Kann .__ nicht lesen. Eigenschaft 'Aktion' von undefined

Andere zufällige Dinge, die ich ausprobiert habe, waren das Klicken des Klicks und das erneute Anbringen außerhalb des appendTo()-Blocks. action() wurde in newtest() geändert, um sicherzustellen, dass kein Konflikt mit den integrierten Schlüsselwörtern besteht. Ich habe auch versucht, eine $('body').append('<li>{blah blah}</li>').find('li').click(function(){/*blah blah*/}); zu machen, aber es hat immer noch dasselbe zurückgegeben. Ich habe keine Ideen mehr!

11
Oscar Godson

Das Problem ist, dass "i" inkrementiert wird. Wenn das Click-Ereignis ausgeführt wird, ist der Wert von i gleich len . Eine mögliche Lösung besteht darin, den Wert von i in einer Funktion zu erfassen:

var len = menuitems.length;
for (var i = 0; i < len; i++){
    (function(i) {
      $('<li/>',{
          'html':'<img src="'+menuitems[i].icon+'">'+menuitems[i].name,
          'click':function(){
              menuitems[i].action();
          },
          'class':o.itemClass
      }).appendTo('.'+o.listClass);
    })(i);
}

Im obigen Beispiel erstellt die anonyme Funktion einen neuen Gültigkeitsbereich, der den aktuellen Wert von i erfasst. Wenn das Klickereignis ausgelöst wird, wird die lokale Variable anstelle des i aus der for-Schleife verwendet.

16
nxt

Normalerweise besteht dieses Problem darin, dass Sie in der letzten Iteration ein leeres Objekt oder ein undefiniertes Objekt haben. Verwenden Sie console.log () in Ihrem Cicle, um zu überprüfen, ob dies passiert ist.

Manchmal fügt ein Prototyp irgendwo ein zusätzliches Element hinzu.

0
Siedrix

Ich hatte das gleiche Problem mit dem 'Parallax' -Plugin Ich habe die jQuery-Bibliothek-Version in *jquery-1.6.4* von *jquery-1.10.2*._ geändert.

0
byJeevan