 
			
				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,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Где у функции закрывающая фигурная скобка }  а у селекта закрывающий тег </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
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Да, по замыслу похоже, но реализация для моих условий менее удобная. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |