Что нужно для установки значения текстового поля HTML в null? - PullRequest
4 голосов
/ 28 апреля 2009

У нас есть ответ JSON, который может содержать нулевые значения (например, {myValue: null}) - мы присваиваем это значение текстовому полю в форме: (на самом деле мы используем JQuery, но это эквивалентно

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

Если мы присвоим это значение значению текстового поля HTML, поведение будет зависеть от браузера:

  • Firefox и Chrome отображают пустое текстовое поле, и когда вы читаете «значение» обратно, вы получаете ноль.

  • IE помещает строку 'null' в текстовое поле, и когда вы читаете 'value' обратно, вы получаете строку 'null' (т. Е. Установка 'value' и ее чтение изменили данные)

(это здесь: http://jsbin.com/uleno/edit, если кто-то хочет попробовать)

Какой браузер делает правильные вещи здесь, или это неопределенное поведение? И есть ли более умный и изящный обходной путь, чем выполнение многих (myValue == null? '': MyValue) вещей?

Ответы [ 4 ]

3 голосов
/ 29 апреля 2009

На самом деле, самое простое, что можно сделать, это:

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

Вы знаете, что значение должно получить назначенную строку, поэтому, если это любое другое 'ложное' * значение, вы возвращаете пустую строку.

* ноль, не определено, 0, ложь, ''

2 голосов
/ 29 апреля 2009

Что на самом деле происходит, так это то, что нулевой объект подвергается строковому форматированию, например, null.toString (). В окне сообщения alert () браузер обычно интерпретирует объект, а не просто переводит его в строку, поэтому результат будет другим. И, конечно, браузеры (особенно IE) по-разному интерпретируют и структурируют.

Для чего бы то ни было, есть логика возврата нуля, когда ожидается строка. Все, что возвращает это значение, вероятно, делает это для того, чтобы обеспечить ложное значение для простого условного тестирования, но все же указывает, что результат скорее пустой, чем, например, неопределенный Методы DOM, которые возвращают объекты коллекции, делают то же самое. Кроме того, хотя пустой строковый литерал ('') является ложным значением, пустой объект String (new String ('')) не является; и последний может быть создан из первого случайно с дальнейшей обработкой. Таким образом, «безопасный» способ предотвратить случайный сброс потребителем кода допустимой строки - это вернуть строковый литерал или объект String в одном случае, а в другом - null.

1 голос
/ 28 апреля 2009

Я не уверен, что мое решение сработает для вас, но вот пример проблемы, которая, я должен признать, является новой для меня. Его главное преимущество в том, что он не будет загромождать код, и у вас будет единственное место, которое обрабатывает эту логику. Насколько я знаю, это специфично для 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 голосов
/ 28 апреля 2009

Почему бы не использовать пустую строку? Сначала обрежьте значение. Затем проверьте наличие пустой строки.

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
    return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
    return this.replace(/\s+$/,"");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...