2010-12-02 19 views
2

Ich benutze jQuery data(), um Metadaten zu speichern, aber es scheint, dass jQuery 1.4.4 und 1.4.3 beide Probleme haben. Einige Teile funktionieren und einige andere Teile funktionieren nicht.jQuery data() gibt undefined zurück

Zum Beispiel, ich habe

const UimConst = { 
    NODE_OBJECT: "nodeObject", 
    CHILDREN: "children", 
    PARENT: "parent", 
    SID: "sid", 
    COUNT: "count", 
    EXCLUDE: "exclude", 
    PARENT_COUNT: "pcount", 
    HEIGHT: "UimHeight" 
}; 

Workspace.prototype.findAncestor = function(element){ 
    if(this.ancestor == null){ 
     this.ancestor = $(element); 
     this.ancestor.data(UimConst.HEIGHT, 0); 
    } else { 
... 

} 

wo Element das DOM-Element ist. Dann erhalte ich den Wert, den ich wie folgt gespeichert habe,

var height = this.ancestor.data(UimConst.HEIGHT); 
logger.debug("Current UI module height " + height); 

leider ist der Rückgabewert nicht definiert.

das Problem weiter zu verfolgen, änderte ich den Code

if(this.ancestor == null){ 
    this.ancestor = $(element); 
    this.ancestor.data(UimConst.HEIGHT, 0); 
    logger.debug("After set the ancestor height, the value is " + this.ancestor.data(UimConst.HEIGHT)); 
} else { 

Der Rückgabewert im Protokoll ist „undefined“ wie auch zu sein. Wirklich frustriert.

Ich habe Daten() an einigen anderen Orten verwendet und sie funktionierten gut. Ich bin mir nicht sicher, was passiert ist. Irgendwelche Hinweise?

Das Projekt ist hier, wenn jemand will, um einen Blick nehmen:

http://aost.googlecode.com/svn/trunk/tools/tellurium-ide.

Nur prüfe Subversion und den folgenden Befehl ausführen:

mvn install 

und dann die erzeugte .xpi Datei zu Firefox installieren.

Danach können Sie das Tellurium IDE Firefox-Plugin und JavaScript-Debugger-Firefox-Plugin öffnen, um die Ausführung zu verfolgen.

Für dieses Problem gehen Sie zu workspace.js und setzen Sie einen Breakpointer am Anfang der findAncestor() -Methode.

Mehr Details über Tellur IDE sind hier:

http://code.google.com/p/aost/wiki/TelluriumIde080RC1

Vielen Dank im Voraus,

John

+0

Sind Sie sicher, dass 'Workspace.prototype.findAncestor' genannt wird? Vielleicht versuchen Sie, eine Art Ausgabe hinzuzufügen, die beweist, dass sie unmittelbar danach gesetzt wird: 'console.log ('Daten wurden gesetzt:' + this.ancestor.data (UimConst.HEIGHT));' – clarkf

+0

Ja. Es wird genannt. Ich habe JavaScript-Debugger verwendet, um den Ausführungsablauf zu verfolgen. –

Antwort

0

Code in jslint Einfügen helfen. Sie können dort viele gute Hinweise bekommen.

Die const-Deklaration funktioniert nicht mit jedem Browser, daher ist das Ändern zu var ein Tipp.

Aber es gibt nicht genug Code, um sehr viel zu tun.

Schauen Sie sich diese Tipps auf der Javascript module design pattern an, die Sie für weitere Hilfe verwenden.

+0

Nun, ich arbeite an einem Firefox-Plugin und es gibt viele Dateien und es ist schwierig, sie in jslint zu schneiden und einzufügen. Allerdings habe ich jslint Maven Plugin ausgeführt und es gab zu viele Warnungen sogar für jQuery-Bibliothek. Nicht wirklich so nützlich. –

2

Dies würde passieren, wenn elementnull oder eine Zeichenfolge, die nicht mit Elementen im Dokument übereinstimmen würde.

$(element).data(key, value) tut nichts wenn $(element).length == 0.

jQuery weigert sich auch leise zum Speichern von Daten auf bestimmte Elemente (embed, applet und jede object außer Flash), aber das scheint nicht das Problem zu sein.

Update: Wenn das Firefox Add-on-Code versucht, auf Elemente in einer Webseite zu arbeiten, ist es keine große Überraschung für mich, dass es nicht funktioniert. Elemente verhalten sich nur ein wenig anders, wenn sie von einem Add-On verwendet werden, so dass Bibliotheken (wie jQuery), die auf normalen Webseiten gut funktionieren, in Add-ons nicht funktionieren können.

Update 2: Mein neuer Tipp ist, eine Entwicklungsversion von jQuery, wie http://code.jquery.com/jquery-latest.js, zu verwenden und die Datenmethode im Debugger zu durchlaufen. Die interessanten Teile passieren in jQuery.data, die knapp über 40 Zeilen lang ist:

data: function(elem, name, data) { 
    [...] 

    var isNode = elem.nodeType, 
     id = isNode ? elem[ jQuery.expando ] : null, 
     cache = jQuery.cache, thisCache; 

    if (isNode && !id && typeof name === "string" && data === undefined) { 
     return; 
    } 

    // Get the data from the object directly 
    if (!isNode) { 
     cache = elem; 

    // Compute a unique ID for the element 
    } else if (!id) { 
     elem[ jQuery.expando ] = id = ++jQuery.uuid; 
    } 

    // Avoid generating a new cache unless none exists and we 
    // want to manipulate it. 
    if (typeof name === "object") { 
     if (isNode) { 
      cache[ id ] = jQuery.extend(cache[ id ], name); 

     } else { 
      jQuery.extend(cache, name); 
     } 

    } else if (isNode && !cache[ id ]) { 
     cache[ id ] = {}; 
    } 

    thisCache = isNode ? cache[ id ] : cache; 

    // Prevent overriding the named cache with undefined values 
    if (data !== undefined) { 
     thisCache[ name ] = data; 
    } 

    return typeof name === "string" ? thisCache[ name ] : thisCache; 
}, 
+0

Element ist das DOM-Element, das das Firefox-Plug-in erfasst hat, und es ist nicht null. Ich habe das im JavaScript-Debugger überprüft. Es ist eigentlich ein Eingabefeld. –

+0

Danke. Wenn das der Fall ist, muss ich nach einer anderen Implementierung suchen. Aber die verdrahtete Sache ist, dass ich jQuery Daten() ziemlich stark an anderen Orten des gleichen Projektes verwendete und sie arbeiteten. –

Verwandte Themen