Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не работает простой скрипт (Uncaught TypeError: object is not a function) (https://javascript.ru/forum/misc/11220-ne-rabotaet-prostojj-skript-uncaught-typeerror-object-not-function.html)

copenhagen 13.08.2010 15:17

Не работает простой скрипт (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

Где у функции закрывающая фигурная скобка } а у селекта закрывающий тег </select> ?

Octane 13.08.2010 17:04

Проблема в IE? Скорее всего из-за того, что есть глобальная функция newManufacturer и одноименный идентификатор элемента. Сначала создается функция, а потом она перезаписывается ссылкой на DOM-элемент, вот к нему вы и обращаетесь, и он is not a function…

copenhagen 16.08.2010 17:06

По совету 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) показывает ошибку. А вот почему так происходит? Вроде она локальная для функции, должна сохраняться.

copenhagen 20.08.2010 11:59

Народ, подскажите, скрипт то маленький совсем и всего про одну ошибку спрашиваю.

javs 20.08.2010 14:45

Цитата:

Сообщение от copenhagen
Суть вообще всего скрипта проста: по нажатии появляется форма для ввода текста

Если задача проста интуитивно, а решается сложно, то подход не верен. В данном случае, если все действительно обстоит так, как вы написали, что мешает просто оформить форму в контейнер и показывать или скрывать его по нажатию. Все заполненные значения полей будут запоминаться автоматически без каких-либо манипуляций с javascript.

MikhailGirshberg 20.08.2010 15:12

Цитата:

Сообщение от copenhagen (Сообщение 67561)
var inputPrevious;

в этом месте inputPrevious равно undefined, как и его тип.

Поэтому следующее вхождение
if(inputPrevious.length > 0) ...
не есть гут, ИМХО.

Я бы предпочёл сразу написать
var inputPrevious = "";
так и тип определён и значение проставлено корректное.

добавлено позже:
понял, что выступил не по делу. СТЫДНО...

copenhagen 23.08.2010 15:30

Цитата:

Сообщение от javs (Сообщение 68061)
Если задача проста интуитивно, а решается сложно, то подход не верен. В данном случае, если все действительно обстоит так, как вы написали, что мешает просто оформить форму в контейнер и показывать или скрывать его по нажатию. Все заполненные значения полей будут запоминаться автоматически без каких-либо манипуляций с javascript.

нюанс в том, что display:none форма скрывается только в браузере, а код остается, значит переменная из input тэга передается. Если в php коде у меня стоит if(переменная), эта проверка будет всегда "истина". Мне не надо ее передавать переменную формы в случае если она не видна, передавать значение надо только если пользователь в нее ввел что-то. Внес в форму - код php работает, не внес в форму - ничего делать не надо.
В общем, подсказать никто не хочет. Будут делать с костылями через display:none для формы и прописывать/убирать через innerHTML флаг-переменную определяющую учитывать/не учитывать содержимое этой скрываемой формы...

Цитата:

Сообщение от MikhailGirshberg (Сообщение 68068)
в этом месте inputPrevious равно undefined, как и его тип.

Поэтому следующее вхождение
if(inputPrevious.length > 0) ...
не есть гут, ИМХО.

Я бы предпочёл сразу написать
var inputPrevious = "";
так и тип определён и значение проставлено корректное.

без разницы, работать от этого не стало.

MikhailGirshberg 24.08.2010 11:03

Вы, наверное, пытались сотворить чего-то вроде этого:
<!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 браузерах

copenhagen 24.08.2010 14:21

Да, по замыслу похоже, но реализация для моих условий менее удобная.


Часовой пояс GMT +3, время: 16:29.