2009-04-28 7 views
4

Wir haben eine JSON-Antwort, die Nullwerte enthalten können (zB {myValue: null}) - wir weisen Sie diesen Wert auf eine Textbox auf einem Formular: (eigentlich verwenden wir JQuery, aber dies ist äquivalentWas sollte einen HTML-Textbox-Wert auf null setzen?

var nullString = null; 
document.getElementById('myInput').value = nullString; 

wenn wir diesen Wert zu einem HTML-Textfeld Wert zuweisen, scheint das Verhalten Browser-abhängig.

  • Firefox und Chrome sowohl ein leeres Textfeld angezeigt werden, und wenn Sie ‚Wert‘ zu lesen bekommen Sie zurück null

  • IE setzt die Zeichenfolge "Null" in das Textfeld, und wenn Sie "Wert" zurück lesen, erhalten Sie die Zeichenfolge "null" (d. h. ‚Wert‘ Setzen und Lesen hat wieder die Daten geändert)

(Es ist hier: http://jsbin.com/uleno/edit wenn jemand will, es versuchen)

Welchen Browser hier das Richtige tut, oder ist dies nicht definiertes Verhalten ? Und gibt es einen eleganteren Workaround als viel (myValue == null? '': MyValue)?

Antwort

2

Was tatsächlich passiert ist, das Null-Objekt Zeichenfolge wird, wie null.toString(). In einem Alert() - Meldungsfeld interpretiert der Browser das Objekt normalerweise, anstatt es einfach zu stringieren, daher wird das Ergebnis anders sein. Und natürlich interpretieren und kategorisieren Browser (insbesondere IE) unterschiedlich.

Für was es wert ist, gibt es eine Logik zum Zurückgeben von null, wenn eine Zeichenfolge erwartet wird. Was auch immer diesen Wert zurückgibt, tut dies wahrscheinlich, um einen falschen Wert für einfache konditionelle Tests bereitzustellen, während immer noch angezeigt wird, dass das Ergebnis leer ist und nicht, z. B. undefiniert. DOM-Methoden, die Sammlungsobjekte zurückgeben, machen dasselbe. Während ein leeres String-Literal ('') ein falscher Wert ist, ist ein leeres String-Objekt (neuer String ('')) nicht; und letzteres kann versehentlich aus dem ersteren mit der weiteren Verarbeitung erzeugt werden. Der "sichere" Weg, zu verhindern, dass der konsumierende Code versehentlich eine gültige Zeichenfolge verwirft, besteht darin, ein String-Literal oder ein String-Objekt in einem Fall und null in einem anderen Fall zurückzugeben.

0

Warum nicht eine leere Zeichenfolge verwenden? Schneiden Sie zuerst den Wert ab. Dann überprüfe die leere Zeichenfolge.

+0

Die Null kommt von JSON, die woanders erzeugt werden - offensichtlich ist es trivial, eine Null in eine leere Zeichenkette umzuwandeln. Ich interessiere mich dafür, wie die verschiedenen Browser die Zuweisung der Null zu einer Textbox handhaben. –

1

Ich bin mir nicht sicher, ob meine Lösung für Sie funktioniert, aber hier ist ein Blick auf das Problem, das ich zugeben muss, ist neu für mich. Sein Hauptvorteil ist, dass es keinen Code überstürzt und dass Sie einen einzigen Platz haben, der diese Logik verarbeitet. Soweit ich weiß, ist das IE.

var input = document.getElementById('myInput'); 

if (input.attachEvent) { 
    input.attachEvent("onpropertychange", function() { 
     var event = window.event; 

     if (event.propertyName === "value" && event.srcElement.value === "null") { 
      event.srcElement.value = ""; 
     } 
    }); 
} 

input.value = null; 

alert(input.value); 
+0

Danke dafür - ordentliche Technik, von der ich nichts wusste. Ich benutze tatsächlich jQuery, daher ist es wahrscheinlich genauso einfach für mich, einen Ersatz für die 'val()' Funktion zu schreiben, um den Inhalt der Textbox sicher zu setzen.Ich war eher auf der Suche nach einigen Tipps, was ich erwarten sollte * der Browser zu tun. –

+0

Meiner Meinung nach macht es keinen Sinn, seinen Wert auf die Zeichenkette "null" zu setzen, solange Sie ihn auf den literalen Nullwert setzen. Auf der anderen Seite sind sowohl das Verhalten von FF als auch das von Chrome etwas merkwürdig, da ein einfaches "alert (null)" die Zeichenkette "null" anstatt nichts anzeigt, während das Verhalten des Formularelements unterschiedlich ist. Also ich denke, IE ist in dieser Hinsicht konsistenter, obwohl es nicht so hilfreich ist. –

3

Eigentlich ist die einfachste Sache zu tun, ist dies:

document.getElementById('myInput').value = nullString || ''; 

Sie wissen, dass Wert muss eine Zeichenfolge zugewiesen bekommt so, wenn seine andere ‚falsy‘ * Wert, können Sie die leere Zeichenfolge zurück.

* null, nicht definiert, 0, false, ''

Verwandte Themen