Невозможно установить для свойства nodeValue значение null

Я просматриваю книгу, и это кажется правильным, но следующий код продолжает выдавать мне ошибку: Невозможно установить для свойства 'nodeValue' значение null. Код имеет смысл для меня, но я не понимаю, почему он не может очистить текстовое значение при нажатии кнопки очистки.

var clear = function(){

        $("miles").firstChild.nodeValue = "";
        $("gallons").firstChild.nodeValue = "";
        $("mpg").firstChild.nodeValue = "";
         }

    window.onload = function () {
        $("calculate").onclick = calculateMpg;
        $("miles").focus();
        $("clear").onclick = clear;
    }   

HTML

<section>
    <h1>Calculate Miles Per Gallon</h1>
    <label for="miles">Miles Driven:</label>
    <input type="text" id="miles"><br>
    <label for="gallons">Gallons of Gas Used:</label>
    <input type="text" id="gallons"><br>
    <label for="mpg">Miles Per Gallon</label>
    <input type="text" id="mpg" disabled><br>
    <label>&nbsp;</label>
    <input type="button" id="calculate" value="Calculate MPG"><br>
    <input type="button" id="clear" value="clear"><br>
</section>

person oxxi    schedule 26.04.2013    source источник
comment
измените на $(miles).get(0).firstChild.nodeValue = и аналогично для других. Это должно решить вашу проблему.   -  person vishakvkt    schedule 27.04.2013
comment
@elclanrs - я не уверен, что они используют jQuery, потому что $("miles") тоже не будет работать, если это jQuery. Интересно, является ли $ синонимом document.getElementById(). Также нет, в вопросе нет тега jQuery.   -  person jfriend00    schedule 27.04.2013
comment
К ОП. Что такое $ в вашем проекте. Это jQuery? Или это document.getElementById()? Кроме того, покажите нам соответствующий HTML-код, чтобы мы могли увидеть, правильно ли ваш javascript нацелен на нужные объекты.   -  person jfriend00    schedule 27.04.2013
comment
О, вижу, тега jQuery нет... Да, нам нужно больше информации, чтобы понять, что такое $...   -  person elclanrs    schedule 27.04.2013
comment
Я думаю, это прототип.js   -  person vishakvkt    schedule 27.04.2013
comment
Да, это не jQuery. вот полный код: pastebin.com/ufGgAq74   -  person oxxi    schedule 27.04.2013
comment
Так что это просто ярлык для document.getElementById.   -  person elclanrs    schedule 27.04.2013
comment
да, просто ярлык. не следует firstchild.nodeValue = ""; очищать текстовое поле?   -  person oxxi    schedule 27.04.2013


Ответы (3)


Элементы ввода не имеют дочерних узлов, поэтому firstChild дает вам нуль, более того, если вы пытаетесь очистить значение полей ввода, используйте свойство value.

var clear = function(){
    $("miles").value = "";
    $("gallons").value = "";
    $("mpg").value = "";
}
person Musa    schedule 26.04.2013

Я думаю, что вы хотите, чтобы вы напрямую использовали свойство .value в полях ввода:

var clear = function() {
    $("miles").value = "";
    $("gallons").value = "";
    $("mpg").value = "";
 }

Вот объяснение происходящего. Теперь, когда мы можем видеть вашу полную страницу и видеть, что $ это document.getElementById(), проблема в том, что некоторые из этих узлов не имеют firstChild.

Например, объект с id="miles" является входным тегом и не имеет дочерних элементов, поэтому .firstChild равен null.

В этой строке:

$("miles").firstChild.nodeValue = "";

$("miles") дает вам объект DOM.

$("miles").firstChild возвращает значение null, потому что у этого объекта DOM нет дочерних элементов.

$("miles").firstChild.nodeValue = ""; является ошибкой, поскольку $("miles").firstChild равно null, а null не имеет свойства .nodeValue.

person jfriend00    schedule 26.04.2013
comment
ок, остальное я понял. Мне просто пришлось использовать $("miles").value = "";. Спасибо за прояснение! - person oxxi; 27.04.2013
comment
@oxxi - почему вы выбрали другой ответ как лучший ответ, когда я много работал с вами в комментариях, чтобы вы показали нам, что нам нужно, чтобы помочь вам, и я также предоставил правильный ответ, и я предоставил первый ответ, и я подробно объяснил, что не так с вашим исходным кодом? - person jfriend00; 27.04.2013
comment
@ jfriend00 Вы думаете, что помощь, тяжелая работа и отличное объяснение заслуживают того, чтобы их приняли? :) - person Ian; 27.04.2013
comment
@ Ян - можно только надеяться, но, увы, я достаточно взрослый, чтобы знать, что мир не всегда справедлив, но, по крайней мере, я могу спросить. Или, возможно, ОП увидел что-то уникально проницательное в ответе, который они приняли? :) - person jfriend00; 27.04.2013
comment
@jfriend00 Это происходит со мной постоянно, и я уверен, что вы видели это много раз. Просто продолжайте усердно работать, и иногда это окупается :) Я не вижу ничего лучше в другом ответе, но он по-прежнему актуален :) - person Ian; 27.04.2013

Глядя на код, который вы разместили в комментариях, проблема в том, что $("miles") и другие элементы не имеют дочерних элементов.

Похоже, вы пытаетесь сделать что-то вроде этого:

var clear = function() {
    $("miles").value = "";
    $("gallons").value = "";
    $("mpg").value = "";
}
person p.s.w.g    schedule 26.04.2013
comment
Теперь, когда вы можете видеть HTML, становится совершенно ясно, что объекты, на которые мы нацелены, являются полями ввода и никогда не имеют потомков. - person jfriend00; 27.04.2013