2014-01-24 13 views
9

Kürzlich die Anwendung, die ich arbeite, aktualisiert von jQuery 1.7.1 zu 1.10.2 mit Migrate 1.2.1 enthalten.Was wurde in jQuery 1.9.1 geändert, damit die .data-Erweiterungsmethode null statt undefiniert zurückgibt, wenn ein Selektor keine Ergebnisse zurückgibt?

Nach der Aktualisierung haben wir festgestellt, dass jQuery unterschiedliche Ergebnisse für die Erweiterungsmethode data zurückgegeben hat, abhängig davon, ob der Selektor Ergebnisse erzielt hat. Die Erweiterungsmethode attr gibt unabhängig von den Selektorergebnissen immer undefined zurück.

Mit dem folgenden HTML-Dokument habe ich Tests mit den Versionen 1.7.1, 1.8.3, 1.9.1 und 1.10.2 durchgeführt.

<html> 
<head></head> 
<body> 

    <div id="results">trying to access .data member off a selector that returns no results</div> 

    <script type="text/javascript" src="jQuery.js"></script> 
    <script type="text/javascript"> 
     $(function(){ 
      var target = $("#results"); 
      target.append("<div>jQuery " + $.fn.jquery + " => " + $("p").data("blah") + "</div>"); 
      target.append("<div>jQuery " + $.fn.jquery + " => " + $("p").attr("data-blah") + "</div>"); 

      target.append("<div>jQuery " + $.fn.jquery + " => " + $("body").data("blah") + "</div>"); 
      target.append("<div>jQuery " + $.fn.jquery + " => " + $("body").attr("data-blah") + "</div>"); 
     }); 
    </script> 
</body> 

In 1.7.1 und 1.8.3 alle Ergebnisse sind undefined. In 1.9.1 und 1.10.2 Ergebnisse für einen leeren Selektor mit .data("blah") von undefined zu null geschaltet.

Ich habe die 1.9.0 Upgrade-Dokumente sowie die Release Notes 1.10.0 überprüft und keine Hinweise auf diese Änderungen gefunden. Weiß jemand, warum das so ist? War es absichtlich?

Ich habe eine Geige eingefügt, um zu zeigen, wie die verschiedenen Versionen von jQuery das gehandhabt haben.

http://jsfiddle.net/T5L6Y/6/

+0

Es tut mir leid, dass Sie Recht haben. Ich habe die falsche Version der Geige aufgenommen. Aktualisiere es jetzt. –

+1

Beim Versuch, diese Commit zu verfolgen, kann es hilfreich sein, [this file] (https://github.com/jquery/jquery/blob/1.x-master/src/data.js) auf github nach Änderungen zwischen zu sehen 13. November 2012 und 15. Januar 2013 ([Quelle] (https://jquery.org/history/)) –

Antwort

3

Diese Verhaltensänderung nicht gesucht wurde, ist es (oder besser gesagt: es war) ein Fehler. Der Unterschied resultiert aus diesen Linien:

In jquery-1.8.3.js: 1772

if (value === undefined) { 
    data = this.triggerHandler("getData" + part, [parts[0]]); 

    // Try to fetch any internally stored data first 
    if (data === undefined && elem) { 
     data = jQuery.data(elem, key); 
     data = dataAttr(elem, key, data); 
    } 

    return data === undefined && parts[1] ? 
    this.data(parts[0]) : 
    data; 
} 

Wenn der Selektor leer ist, data zurückgeführt wird und an diesem Punkt ist dataundefined.

Aber in jquery-1.9.1.js: 1824

if (value === undefined) { 
    // Try to fetch any internally stored data first 
    return elem ? dataAttr(elem, key, jQuery.data(elem, key)) : null; 
} 

Wenn die Wahl leer ist, wird elem auf false ausgewertet und null zurückgegeben. Dies war nicht beabsichtigt und wurde tatsächlich von this commit im November angewendet behoben. Das Ausführen des Codes mit jquery-1.11.0 hat das ursprüngliche Verhalten: undefined wird zurückgegeben.

+0

Vielen Dank! Es ist sehr hilfreich, das genaue Code-Bit zu sehen. Ich habe ein bisschen mehr Nachforschungen gemacht und es scheint, als wäre das ein Fehler, der behoben wurde, dann möglicherweise rückgängig gemacht wurde oder nie wirklich behoben wurde (http://bugs.jquery.com/ticket/13785). Ich sehe den Komponententest, also bin ich zuversichtlich, dass das Problem behoben ist. –

+0

Wahr, ich war auch ein bisschen verwirrt mit der Geschichte. Das Update wurde versehentlich in einigen Zusammenführungen verloren und später erneut ausgeführt. – Djizeus

Verwandte Themen