13.08.2010, 15:17
|
Интересующийся
|
|
Регистрация: 01.07.2010
Сообщений: 18
|
|
Не работает простой скрипт (Uncaught TypeError: object is not a function)
function newManufacturer() {
var form = document.getElementById('newManufacturer');
var form2 = document.getElementById('chooseManufacturer');
if(form.innerHTML=='') {
form.innerHTML='<br><input name="newManufacturer" type="text">';
form2.disabled='true';
}
else {
form.innerHTML='';
form2.disabled='';
}
Первый раз когда нажимается кнопка выполняется функция срабатывает, второй раз нет - google chrome пишет "Uncaught TypeError: object is not a function".
Код соответствующий
<select name="m_id" id="chooseManufacturer">
<input type="button" onClick="newManufacturer()" value="Новый" style="margin-left:20;">
<div id="newManufacturer"></div>
В чем проблема?
|
|
13.08.2010, 16:08
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,124
|
|
Где у функции закрывающая фигурная скобка } а у селекта закрывающий тег </select> ?
|
|
13.08.2010, 17:04
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Проблема в IE? Скорее всего из-за того, что есть глобальная функция newManufacturer и одноименный идентификатор элемента. Сначала создается функция, а потом она перезаписывается ссылкой на DOM-элемент, вот к нему вы и обращаетесь, и он is not a function…
|
|
16.08.2010, 17:06
|
Интересующийся
|
|
Регистрация: 01.07.2010
Сообщений: 18
|
|
По совету Octane поменял имя, все заработало. Потребовалось сделать еще одно изменение в скрипт. Суть вообще всего скрипта проста: по нажатии появляется форма для ввода текста, повторным нажатием скрывается. При этом при появлении/скрытии введенный текст в поле не должен исчезать, а должен сохраняться (а то вдруг случайно нажали). При этом еще один выпадающий список делается нерабочим/рабочим - конкретно тут проблемы нет.
function addManufacturer() {
form = document.getElementById('newManufacturerDivTag');
form2 = document.getElementById('chooseManufacturer');
form3 = document.getElementById('newManufacturerInputTag');
var inputPrevious;
if(form.innerHTML=='') {
if(inputPrevious.length>0) form.innerHTML='<input name="newManufacturerName" id="newManufacturerInputTag" type="text" value="'+inputPrevious+'">';
else form.innerHTML='<br><input name="newManufacturerName" id="newManufacturerInputTag" type="text">';
form2.disabled='true';
}
else {
inputPrevious = form3.value;
form.innerHTML='';
form2.disabled='';
}
}
<select name="m_id" id="chooseManufacturer">
...
<div id="newManufacturerDivTag"><br><input name="newManufacturerName" id="newManufacturerInputTag" type="text" value=""></div>
Вот такой код не работает, у меня ощущение что переменная inputPrevious после выполнения функции получает значение, но не сохраняется, и поэтому условие if(inputPrevious.length>0) показывает ошибку. А вот почему так происходит? Вроде она локальная для функции, должна сохраняться.
|
|
20.08.2010, 11:59
|
Интересующийся
|
|
Регистрация: 01.07.2010
Сообщений: 18
|
|
Народ, подскажите, скрипт то маленький совсем и всего про одну ошибку спрашиваю.
|
|
20.08.2010, 14:45
|
Новичок на форуме
|
|
Регистрация: 14.08.2010
Сообщений: 8
|
|
Сообщение от copenhagen
|
Суть вообще всего скрипта проста: по нажатии появляется форма для ввода текста
|
Если задача проста интуитивно, а решается сложно, то подход не верен. В данном случае, если все действительно обстоит так, как вы написали, что мешает просто оформить форму в контейнер и показывать или скрывать его по нажатию. Все заполненные значения полей будут запоминаться автоматически без каких-либо манипуляций с javascript.
|
|
20.08.2010, 15:12
|
Аспирант
|
|
Регистрация: 27.07.2010
Сообщений: 72
|
|
Сообщение от copenhagen
|
var inputPrevious;
|
в этом месте inputPrevious равно undefined, как и его тип.
Поэтому следующее вхождение
if(inputPrevious.length > 0) ...
не есть гут, ИМХО.
Я бы предпочёл сразу написать
var inputPrevious = "";
так и тип определён и значение проставлено корректное.
добавлено позже:
понял, что выступил не по делу. СТЫДНО...
Последний раз редактировалось MikhailGirshberg, 24.08.2010 в 10:33.
Причина: пригляделся - устыдился
|
|
23.08.2010, 15:30
|
Интересующийся
|
|
Регистрация: 01.07.2010
Сообщений: 18
|
|
Сообщение от javs
|
Если задача проста интуитивно, а решается сложно, то подход не верен. В данном случае, если все действительно обстоит так, как вы написали, что мешает просто оформить форму в контейнер и показывать или скрывать его по нажатию. Все заполненные значения полей будут запоминаться автоматически без каких-либо манипуляций с javascript.
|
нюанс в том, что display:none форма скрывается только в браузере, а код остается, значит переменная из input тэга передается. Если в php коде у меня стоит if(переменная), эта проверка будет всегда "истина". Мне не надо ее передавать переменную формы в случае если она не видна, передавать значение надо только если пользователь в нее ввел что-то. Внес в форму - код php работает, не внес в форму - ничего делать не надо.
В общем, подсказать никто не хочет. Будут делать с костылями через display:none для формы и прописывать/убирать через innerHTML флаг-переменную определяющую учитывать/не учитывать содержимое этой скрываемой формы...
Сообщение от MikhailGirshberg
|
в этом месте inputPrevious равно undefined, как и его тип.
Поэтому следующее вхождение
if(inputPrevious.length > 0) ...
не есть гут, ИМХО.
Я бы предпочёл сразу написать
var inputPrevious = "";
так и тип определён и значение проставлено корректное.
|
без разницы, работать от этого не стало.
Последний раз редактировалось copenhagen, 23.08.2010 в 19:41.
|
|
24.08.2010, 11:03
|
Аспирант
|
|
Регистрация: 27.07.2010
Сообщений: 72
|
|
Вы, наверное, пытались сотворить чего-то вроде этого:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<script type="text/javascript">
function addNewManufacturer(){
var inp = document.createElement('INPUT')
inp.type = "text"
var but = document.createElement('INPUT')
but.type="button"
but.value="Add"
var node = document.getElementById('selDIV')
but.onclick=function(event){
var opt = document.createElement('OPTION')
opt.value = inp.value
opt.innerHTML = inp.value
var sel = node.getElementsByTagName('SELECT')[0]
sel.appendChild(opt)
node.removeChild(but)
node.removeChild(inp)
sel.selectedIndex = 0
}
node.appendChild(inp)
node.appendChild(but)
}
</script>
</head>
<body>
<div id="selDIV">
<select name="chooseManufacturer" id="m_id" onchange="if(this.selectedIndex == 1)addNewManufacturer()">
<option selected disabled>... choose the manufacturer ...</option>
<option >... enter new one ...</option>
</select>
</div>
</body>
</html>
ЗЫ у меня (WInXP) работает в 5 браузерах
|
|
24.08.2010, 14:21
|
Интересующийся
|
|
Регистрация: 01.07.2010
Сообщений: 18
|
|
Да, по замыслу похоже, но реализация для моих условий менее удобная.
|
|
|
|