2013-02-18 5 views
6

Wir haben diese "seltsame" Situation, in der einige Produktcodes, zum Beispiel 11E6, die in Datenattribute (ex Data-prodcode) gespeichert sind, werden in 11000000 konvertiert, wenn innerhalb abgerufen jquery Klickfunktion. Etwas wie folgt aus:Verhindern Umwandlung von Zeichenfolge mit einem E und Zahlen zu Nummer

<a data-prodcode="11E6">click</a> 
    var code = $(this).data('prodcode'); 
    console.log(code); --> 11000000 

Alle Ratschläge, wie man dieses Verhalten zu vermeiden, oder was kann es verursachen?

+3

Das ist, weil '.data' versucht, Werte in Zahlen oder Booleans wenn möglich umzuwandeln, und der String' 11E6' sieht wie [eine Zahl in wissenschaftlicher Notation] aus (http://en.wikipedia.org/wiki/ Scientific_notation # E_notation) zu einem Computer. – Blazemonger

Antwort

7

Vom documentation:

Jeder Versuch unternommen wird, den String in einen JavaScript-Wert (dies schließt booleans, Zahlen, Objekte, Arrays und null) zu konvertieren sonst es als String gelassen wird. Um das Attribut des Werts als Zeichenfolge ohne Versuch, es zu konvertieren, abzurufen, verwenden Sie die Methode attr().

Sie können attr verwenden, um die automatische Analyse zu vermeiden:

var code = $(this).attr('data-prodcode'); 

genauer zu sein: dies sollte nicht passieren. Und tatsächlich passiert es nicht in den letzten Versionen. Hier ist der Code der aktuellen jQuery (der interessanteste Teil ist der Kommentar):

if (typeof data === "string") { 
     try { 
      data = data === "true" ? true : 
       data === "false" ? false : 
       data === "null" ? null : 
       // Only convert to a number if it doesn't change the string 
       +data + "" === data ? +data : 
       rbrace.test(data) ? jQuery.parseJSON(data) : 
        data; 
     } catch(e) {} 

Und es funktioniert in jQuery 1.8 und 1.9: es konvertiert nicht den String in eine Zahl, wenn eine Rückumwandlung nicht produzieren die gleiche Zeichenfolge. Aber es funktionierte nicht in jQuery 1.7.

+0

Achten Sie darauf, dass Sie in Ihrem Code einen Kommentar hinzufügen, der erklärt, warum Sie dies tun, damit ein gut gemeinter Optimierer sie später nicht wieder ändert. – Blazemonger

+1

In der Tat, jQuery 's Daten Funktion ist sehr gefährlich für Saiten meiner Meinung nach. Es sieht wirklich so aus, als wollten sie hier zu schlau sein ... –

+1

Nun, das ist wahrscheinlich ein Randfall. Jeder, der in allen Fällen Strings BENÖTIGT, kann und sollte Ihre Lösung verwenden, die wahrscheinlich sowieso effizienter ist als '.data'. – Blazemonger

Verwandte Themen