Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.08.2010, 15:17
Интересующийся
Отправить личное сообщение для copenhagen Посмотреть профиль Найти все сообщения от copenhagen
 
Регистрация: 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>

В чем проблема?
Ответить с цитированием
  #2 (permalink)  
Старый 13.08.2010, 16:08
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Где у функции закрывающая фигурная скобка } а у селекта закрывающий тег </select> ?
Ответить с цитированием
  #3 (permalink)  
Старый 13.08.2010, 17:04
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Проблема в IE? Скорее всего из-за того, что есть глобальная функция newManufacturer и одноименный идентификатор элемента. Сначала создается функция, а потом она перезаписывается ссылкой на DOM-элемент, вот к нему вы и обращаетесь, и он is not a function…
Ответить с цитированием
  #4 (permalink)  
Старый 16.08.2010, 17:06
Интересующийся
Отправить личное сообщение для copenhagen Посмотреть профиль Найти все сообщения от copenhagen
 
Регистрация: 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) показывает ошибку. А вот почему так происходит? Вроде она локальная для функции, должна сохраняться.
Ответить с цитированием
  #5 (permalink)  
Старый 20.08.2010, 11:59
Интересующийся
Отправить личное сообщение для copenhagen Посмотреть профиль Найти все сообщения от copenhagen
 
Регистрация: 01.07.2010
Сообщений: 18

Народ, подскажите, скрипт то маленький совсем и всего про одну ошибку спрашиваю.
Ответить с цитированием
  #6 (permalink)  
Старый 20.08.2010, 14:45
Новичок на форуме
Отправить личное сообщение для javs Посмотреть профиль Найти все сообщения от javs
 
Регистрация: 14.08.2010
Сообщений: 8

Сообщение от copenhagen
Суть вообще всего скрипта проста: по нажатии появляется форма для ввода текста
Если задача проста интуитивно, а решается сложно, то подход не верен. В данном случае, если все действительно обстоит так, как вы написали, что мешает просто оформить форму в контейнер и показывать или скрывать его по нажатию. Все заполненные значения полей будут запоминаться автоматически без каких-либо манипуляций с javascript.
Ответить с цитированием
  #7 (permalink)  
Старый 20.08.2010, 15:12
Аспирант
Отправить личное сообщение для MikhailGirshberg Посмотреть профиль Найти все сообщения от MikhailGirshberg
 
Регистрация: 27.07.2010
Сообщений: 72

Сообщение от copenhagen Посмотреть сообщение
var inputPrevious;
в этом месте inputPrevious равно undefined, как и его тип.

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

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

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

Последний раз редактировалось MikhailGirshberg, 24.08.2010 в 10:33. Причина: пригляделся - устыдился
Ответить с цитированием
  #8 (permalink)  
Старый 23.08.2010, 15:30
Интересующийся
Отправить личное сообщение для copenhagen Посмотреть профиль Найти все сообщения от copenhagen
 
Регистрация: 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.
Ответить с цитированием
  #9 (permalink)  
Старый 24.08.2010, 11:03
Аспирант
Отправить личное сообщение для MikhailGirshberg Посмотреть профиль Найти все сообщения от MikhailGirshberg
 
Регистрация: 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 браузерах
Ответить с цитированием
  #10 (permalink)  
Старый 24.08.2010, 14:21
Интересующийся
Отправить личное сообщение для copenhagen Посмотреть профиль Найти все сообщения от copenhagen
 
Регистрация: 01.07.2010
Сообщений: 18

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


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
скрипт работает только в IE, а в остальных браузерах нет. melodicman Firefox/Mozilla 0 23.06.2010 15:18
Помогите не работает скрипт MAX_NS Общие вопросы Javascript 2 24.03.2009 16:25
Скрипт меню-гармошки работает выборочно Extern Элементы интерфейса 2 23.02.2009 15:32
Простой скрипт не работает в Firefox'e... Aik Firefox/Mozilla 2 03.02.2009 22:30
Скрипт, который должен листать объекты не работает. Mike Abasov jQuery 4 12.08.2008 11:16