Ошибка JavaScript: [elementname] не имеет свойств - PullRequest
3 голосов
/ 26 сентября 2008

Я выполняю некоторое кодирование обслуживания в веб-приложении и получаю ошибку javascript в форме: «[elementname] не имеет свойств»

Часть кода генерируется на лету с помощью вызова AJAX, который изменяет innerHTML для части страницы, после того, как это закончено, мне нужно скопировать часть данных из скрытого поля ввода в видимое поле ввода. Итак, у нас есть поле назначения: <input id="dest" name="dest" value="0">
И поле источника: <input id="source" name="source" value="1">
Теперь, когда ajax запускается, он перезаписывает innerHTML div, в котором находится источник, поэтому поле источника теперь выглядит так: <input id="source" name="source" value="2">

Хорошо, после строки javascript, которая копирует данные ajax во innerHTML, следующая строка: document.getElementById('dest').value = document.getElementById('source').value;

Я получаю следующую ошибку: Error: document.getElementById("source") has no properties

(я тоже пробовал document.formname.source и document.formname.dest и та же проблема)

Чего мне не хватает?

Примечание 1: страница полностью загружена и элемент существует. Вызов ajax происходит только после действия пользователя и заменяет HTML-раздел, в котором находится элемент.

Примечание 2. Что касается неиспользования innerHTML, то именно так мне и была передана кодовая база, и для ее удаления мне нужно было бы переписать все вызовы ajax, что не входит в объем текущего цикла обслуживания.

Примечание 3: innerHTML обновляется новыми данными, копируется вся таблица с данными и форматированием, я пытаюсь добавить логическое значение в конец этого большого чанка, вместо того, чтобы создавать новый вызов ajax для одного логическое значение. Похоже, это то, что мне придется сделать ... так как мой хак в конце, то метод копирования не работает.

дополнительная пара глаз FTW.

Да, у меня была пара парней, которые посмотрели здесь на работе, и они обнаружили мою простую ошибку при печати ... Клянусь, у меня были права с самого начала, но эй, мы живем и учимся ...

Спасибо за помощь, ребята.

Ответы [ 6 ]

3 голосов
/ 26 сентября 2008

«[elementname] не имеет свойств» - это ошибка javascript для «элемент, на который вы пытались сослаться, не существует или равен nil»

Это означает, что у вас есть одна или несколько из возможных проблем:

  1. Ваша страница еще не обработана, и вы пытаетесь сослаться на нее, пока она не появилась
  2. У вас есть орфографическая ошибка
  3. Вы назвали свой идентификатор так же, как зарезервированное слово (например, нажмите кнопку "Отправить")
  4. То, на что, по вашему мнению, вы ссылаетесь, на самом деле не является (переданная переменная не соответствует тому, что, по вашему мнению, вы передаете)
2 голосов
/ 26 сентября 2008

Убедитесь, что ваш код запускается ПОСЛЕ полной загрузки страницы. Если ваш код выполняется до визуализации искомого элемента, произойдет ошибка этого типа.

1 голос
/ 26 сентября 2008

Как вы описываете эту функцию:

<div id="test2">
    <input id="source" value="0" />
</div>
<input id="dest" value="1" />

<script type="text/javascript" charset="utf-8">
//<![CDATA[
function pageLoad()
{
    var container = document.getElementById('test2');
    container.innerHTML = "<input id='source' value='2' />";
    var source = document.getElementById('source');
    var dest = document.getElementById('dest');
    dest.value = source.value;
}
//]]>
</script>

Это работает в обычных браузерах (я проверял в IE, Firefox и Safari); Вы используете какой-либо другой браузер или вы уверены, что он правильно создал элементы в действии innerHTML?

0 голосов
/ 26 сентября 2008

Это натяжка, но, может быть, в этом и заключается хитрость - я видел это раньше, и этот хак действительно сработал.

Итак, вы сказали:

Хорошо, после строки javascript, которая копирует данные ajax во innerHTML, следующая строка: document.getElementById ('dest'). value = document.getElementById ('source'). value;

Измените эту строку на:

setTimeout(function() {
   document.getElementById("dest").value = document.getElementById("source").value;
}, 10);

Вам действительно не нужно это, но вполне возможно, что время между настройкой innerHTML и попыткой доступа к элементу «source» будет настолько быстрым, что браузер не сможет его найти. Я знаю, это звучит совершенно неправильно, но я видел, как браузеры делают это в некоторых случаях по какой-то причине, которая мне не подходит.

0 голосов
/ 26 сентября 2008

Похоже, DOM не обновляется новыми элементами для меня.

В этом отношении, почему вы переписываете весь div только для того, чтобы изменить исходный ввод? Не было бы так же просто изменить значение источника напрямую?

0 голосов
/ 26 сентября 2008

Как правило, вы не должны использовать innerHTML, а создавать элементы, используя DOM-методы. Я не могу сказать, если это ваша проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...