Как переназначить id всех элементов <input> в форме при добавление нового <input>
Есть форма с таблицей, где в каждой строке имеется input:
<input id="chek1" <input id="chek2" <input id="chek3" В каждой строке есть кнопка "+", которая копирует строку с текущим id при помощи функции JS. Получается следующее: <input id="chek1" <input id="chek2" <input id="chek2" <input id="chek3" Теперь значения id не уникальны, и невозможно обратиться к ним по id. Как же дополнить уже имеющуюся функцию JS циклом, чтобы получить: <input id="chek1" <input id="chek2" <input id="chek3" <input id="chek4" Буду очень благодарен. |
Цитата:
|
Цитата:
Если вставка не лимитируется со стороны SQL, значит при загрузке страницы получить в форме элементы, которые клонируются, среди них найти максимальный номер, например: var max = element.id.match(/\d+$/); - где element это полученный каким либо способом элемент. при каждом клонировании увеличивая его на 1, и добавляя к значению атрибута элемента. |
Прежде всего можно попробовать переписать функцию клонирования. Что бы она добавляла цифру в id при клонировании.
А тот цикт который ты просишь довольно прост: <body> <div id="ma1"></div> <div id="ma1"></div> <div id="ma2"></div> <div id="ma3"></div> <div id="ma4"></div> <div id="ma4"></div> <div id="ma5"></div> <div id="ma7"></div> </body> var elem=document.getElementsByTagName("div") var i = 0; for (i = 0;i<elem.length;i++){ elem[i].id="chek"+i; } |
Цитата:
Прокрутить по name и назначить id в цикле!!! СПАСИБО! Просто потом надо будет при пометке чекбокса скрывать или показывать этот элемент. И у него должно быть уникальное значение. Нет, все же JS -это класс, хотя я больше в php работаю. :) |
Функция клонирования - не моя.
Она отлично работает. Ее не хотелось бы трогать. Если что, вот эти функции клонирования и удаления строк:Н <script type="text/javascript"> //Удаление строки function droptr(btn){ if(document.getElementById) { tr = btn; while (tr.tagName != 'TR') tr = tr.parentNode; tr.parentNode.removeChild(tr); checkForLast(); } } //Добавление строки function addtr(btn){ if(document.getElementById) { tr = btn; while (tr.tagName != 'TR') tr = tr.parentNode; var idSuffix = Math.round(Math.random()*1000); var newTr = tr.parentNode.insertBefore(tr.cloneNode(true),tr.nextSibling); thisChilds = newTr.getElementsByTagName('td'); checkForLast(); } } } //Активация/дезактивация кнопки минус ( - ) //Неактивна, когда строка строка одна или нет ни одной добавленной строки function checkForLast(){ btns = document.getElementsByName('drop'); for (i = 0; i < btns.length; i++){ btns[i].disabled = (btns.length == 1) ? true : false; } } </script> Надо ли изменять эти функции или просто в них добавить вышеуказанный цикл? |
Цитата:
Вам id вообще не нужны. Пользователь выбирает и показывает _что_ скопировать (равно удалить, редактировать). Выбрал - скопировали - осталось выбранное - можно редактировать. Все просто. Ну то есть после копирования надо лишь перенести фокус на копию чтоб она осталась активной. |
Цитата:
Пользователь копирует строку. А в строке помимо прочего есть еще и чекбоксы. Это форма. Так вот необходимо, чтобы в скрипт передавались не только помеченные чекбоксы, а еще и непомеченные, для чего до чекбокса стоит Hidden с таким же названием и value=0. И при пометке чекбокса надо сделать этот hidden style="display=none". В общем там все сложно. :) Перебор id по getElementsByTagName мне подходит. |
А если начать с этого - Пользователь копирует строку. - цель?
|
Цитата:
Если вам для веры нужен id, то значит нужен. А вообще он там в упор не нужен, ибо есть пользователь и значит интерфейс попросту интерактивный. Элемент копируется (клонируется) со всем своим барахлом - с хиденами и протча - как два пальца об асфальт. |
Да, само собой имена всех инпутов должны быть заточены под передачу массивом, то есть кончаться на []
|
Цитата:
Так как вы копируете целую строку таблицы, крутить безумное решение о том что-бы скрипт находил все id в таблице и добавлял или изменял их, бессмысленно. Вопрос такой, не возникают ли у вас проблемы с name в чекбоксах. Потому как при клонировании, 2 строчки с чеками будут работать как единый механизм не давая выбрать 2 элемента в этих двух строчках. При вашем способе клонирования и подобном скрипте клонирования, переписывать скрипт клонирования не имеет смысла. |
Если интересно, объясняю.
На самом дело идет об админке на сайте. Менеджер должен ввести цены на отель. Отель имеет основной тип размещения - одноместный, двухместный и пр. Это одна таблица htl_cost_types. Еще есть дополнительный тип размещения - стандарт, делюкс, супериор и пр. Это другая таблица htl_room_types. То есть одноместный может быть как стандарт, так и супериор и т.д. А может и вообще не иметь дополнительного типа. Просто - одноместный, двухместный и т.д. Цены хранятся в третьей таблице, которая имеет, в частности, поля: htl_cost_type_id и htl_room_type_id. Так вот. На страницу выводятся в таблице ВСЕ основные типы размещения с соответствующими чекбоксами, и в той же строке есть селект для выбора дополнительного типа, в котором присутствуют все доп. типы. В этой же строке кнопки "+" и "-". Добавить строку или удалить. К примеру менеджеру нужно ввести тип DBL и еще раз DBL, но уже с типом супериор. Он копирует (вернее клонирует) строку DBL и в клонированной строке в селекте выбирает доп. тип "супериор". В итоге вся проблема в том, что $_POST передает ВСЕ селекты, которые даже имеют value="", но не передает чекбоксы, которые непомеченные. В итоге для сохранения данных в таблице цен пары "основной" и "дополнительный" тип размещения не совпадают, поскольку передаваемые ПОСТ массивы имеют разные ключи. Чтобы ключи совпадали, мне надо передать в скрипт ВСЕ, даже пустые значения чекбоксов. Для этого вставляю дополнительный input Hidden value="" с тем же name. Но теперь массив дополнительных типов бодет больше основных, поскольку при добавлении строки массив доп. типов включит и новый Hidden. Именно поэтому мне нужны уникальные id, чтобы при пометке чекбокса спрятать соответствующий ему Hidden (style="display: none") Сумбурно объяснил, но как сумел. Может, это и криво, но я вижу только такой вариант. Второй вариант, который был бы более простым - сделать так, чтобы непомеченный select (Ну, в первом option которого, скажем, выводится --- НЕТ ---, не передавался в скрипт. Тогда всю остальную мутотень можно и выкинуть на фиг. Но лично я не представляю, как это сделать. Вот и пришлось мудрить... :) |
Цитата:
Попробуйте написать если и не универсальное на все случаи, но хотя бы в рамках этого администрирования, если вставка нужна не только для данной задачи. А делать это лучше так, например, пусть сам тег формы или иной удобный родитель содержит html-код вставки. Не времени все подробно пояснять, поэтому кратко: 1) html-код вставки - описывает полностью структуру "строки" в форме в которая добавляется, а не только поля формы. То есть, например, если элементы формы находятся в ячейках таблицы, то вставляемый код будет: <tr><td><input name="name(k1:)[]"></td>td><input name="name(k2:)[]"></td>...</td>. 2) :k1:, :k2:,... условно значения имен, ключей и т.п., которые после вставки нужно заменить значениями. 3) кнопка добавления новой строки в атрибутах data должна описывать замещаемые значения и значения на которые они будут замещены. Например, data-rem=":k1:,name1/:k2,<?=$id?>:",... Подобным образом задаются любые иные параметры, которые необходимо изменять, добавлять или же передавать как значения в функцию, как и содержать ссылки на функции, которые нужно выполнить, если нельзя написать универсально для любой вставки, и требуется выполнение неких специфичных функций. 4) если имена привязываются к первичному ключу/ключам, это означает, на значение сверху наложен лимит. Поэтому вставка должна иметь счетчик, значения которого используются при вставке, и ссылка на счетчик указана в data-rem. 5) html-код вставки храниться также в атрибуте data-ins, а кнопка "Добавить" имеет ссылку на этот атрибут, по ins. то есть вставляемых "html_вариаций" может быть сколь угодно, как и кнопок добавления, каждая из которых будет добавлять свой html-код. При чем вставляемый html-код также может иметь кнопку "Добавить" - добавление внутри добавляемого. 6) кнопка "Добавить" также должна иметь атрибут содержащий указатель родительского элемента в который вставляется код. В примере с таблицей, это будет например, data-prt="table". 7) вставляемый код содержит кнопку "Удалить" содержащую указатель на удаляемого родителя, для пример это будет data-prt="tr". Непосредственно спрятать в атрибут data html-код не получиться, поэтому можно прибегнуть к base64, но лучше url кодирование, значения будут короче. То есть типа <form data-ins="<?=rawurlencode(вставляемый html-код)?>", а на клиенте в обработчике кнопки "Добавить" получать его - decodeURIComponent(this.getAttribute("data-ins")). Если все обдумать, то единый обработчик будет добавлять любой html-код на страницу, параметры которого описаны в атрибутах. |
Laimas. Интересно. Но я сейчас добью первый вариант из принципа. Если будет ок, то пусть уже менеджеры начнут работать. А потом спокойно разберусь с Вашим вариантом. Если он будет проще и правильнее - заменить - как два пальца :)
|
Есть еще один вариант. Простейший. Но самый тупой :) Вообще без скриптов.
Вывести все основные типы размешения и рядом все доп.типы. Если учесть, что основных типов штук 100, а дополн тельных штук 50, то получим таблицу в 5000 строк :) А если еще учесть, что из них в каждом отеле надо выбрать в среднем 3-5, то у менеджера это займет кучу времени. Потому и заморочился... :) |
Если добавление в данном, это частный и единственный случай, делайте ajax запрос и получайте html-код вставки от сервера, или пропишите его в каком либо скрытом элементе на странице. Это же не проблематично. А вот плодить лишнее "кашу маслом не испортишь", так это не только проблемы на клиенте для менеджера, но и обработка пустого и не нужного на сервере.
|
Цитата:
Если бы речь шла о конечном пользователе, то я бы вылизал все, что можно. А работники - им главное чтобы ввести данные. К сожалению, со вчерашнего дня не смог работать. С завтрашего утра начну. Там посмотрим, чья правда. Кстати. В данном случае про аякс не понял. Что я должен от него получить? У отеля нет вообще никаких данных в БД. Какой php скрипт мне что выдаст? Я только собираюсь забить в БД данные и выбираю, какие. Упс. Получить данные об основных и дополнительных типах размещения? Да они у меня вот уже есть. Бес всякого аякса. Простым sql запросом. |
Цитата:
|
Цитата:
Это потому что у вас там колхоз. Вы даже слова такого не знаете - datagrid - которую вы и делаете. В качестве годного примера - phpMyAdmin видели? - это datagrid в основе. Само собой термин тянется небось с микрософта, я не проверял, но так все кто пишет называют эту интерактивную таблицу. Теперь про колхоз. Пустые чекбоксы не successful элементы и конечно не приходят с браузера на сервер вообще. Что никак не мешает опознать отсутствие по наличию модели. Скрипт обработки данных "знает" что должно быть и если его нет - ставит не выбрано, null, 0, или значение по умолчанию. Еще про колхоз. Размножать инпуты вообще не обязательно. Их можно подставлять по координатам выбранной строки - как в том самом PMA и делается и делается это в общем-то довольно просто. Как тогда отгружать? Ну либо сразу аяксом - по кнопке сохранить или какому-то явному событию, или собирать все добавленные и обновленные данные в json и отгружать через одно текстовое поле, на сервере декодировать и с колес юзать без мороки с постами всякими там. |
Цитата:
Ну то есть без клонирования можно скопировать innerHTML с любой строки и тут же его вставить в новую строку. Заводить шаблон - запомните это слово laimas, им называется тот самый "вставляемый код" - имеет смысл если рендер полностью в браузере. Иначе любая строка будет тем самым шаблоном. Короче, laimas, вы опять начали объяснять то, чего не понимаете и чего не делали. Интерактивные таблицы делаются не так и вообще таблицами являются только внешне. Потому что с настоящей таблицей, ну, которая table-tr-td - просто заколебешься. |
Цитата:
Примерно так вы пишите, если перевести на язык смысла. АЯКС - Асинхронный Яваскрипт и иКСмль - технология передачи данных на сервер с уже загруженной страницы и получения данных с сервера в уже загруженную страницу. То есть это - транспорт, трубопровод, проволока по которой страница соединяется с сервером для оперативного решения вопросов. SQL - язык. Какое отношение язык запросов имеет к аяксу? Ну такое же как самовар к выборам по партийным спискам. |
Цитата:
Это первая таблица, которая и создает офер, артикул, товар и тп. То есть все в точности наоборот. Назовем третью таблицу htl_prices, тогда отношения будет такое htl_prices - базовая таблица предложений htl_cost_types - список типов размещения htl_room_types - список типовых номеров Теперь чтобы вывести все это барахло в интерфейс надо сделать 2 списка запрос select id,name from htl_cost_types; и форичем рендерим select option value=id >name< То же самое с румами. Добавляем в форму поля для ид, названия, цены и готово. Теперь эти инпуты подставляем к ячейкам таблицы которая сама выведена запросом select p.id, p.name, c.name, r.name, p.price from html_prices p left join htl_cost_types c on c.id=p.cost_type_id left join htl_room_types r on r.id=p.room_type_id order by p.name limit 1, 20 Если вы думали что базовая таблица htl_cost_types - то запрос у вас будет другой, а если что прайсовая базовая со списками - такой же. |
Цитата:
|
Если прр колхоз, как вы говорите. Скрипт обработки данных вообще ничего не знаетпро непомеченные чекбоксы.
А если про аякс, то он толь ко тем отличается от простого пхп, что страницу не перезагружает. |
Эдди,
Не слушайте вы его, это пустышка ничего не знающая, чтобы убедиться в этом, можно почитать его бредядину, которой он сдобрил здесь массу постов. То что выше, это очередной бред. Вам чего нужно именно на данный момент - сделать что-то быстрое конкретно и для единственной таблицы. Ну так в чем проблема, спрячьте в скрытый элемент "заготовки" полей необходимых, вставляйте. А насчет Ajax так административный раздел можно на все 100 использовать его. Можно вообще для административного раздела не иметь страниц определяемых сервером, он отдает по асинхронному запросу только данные, а страницы формируются на клиенте по шаблонам, которые всегда находятся на клиенте. Форма добавления данных в таблицу, будет полностью идентична форме редактирования данных этой же таблицы. То есть, то что ранее говорилось "таблица пуста" в этом и вся проблема, ну так это заблуждение - поля sql-таблицы и тип данных этих полей, это как раз то, что и определяет поля формы. |
Таааак. Не ссоримся. Живем мирно. А то начинает напоминать говеный форум phpclub.ru, где слишком много умников.
Если речь пошла о запросах, kostyanet, то у меня через часик будет вопрос к Вам по этой же теме. Вот там Вы мне очень поможете. Готов буду даже ящик пива выслать. Ну, наложенным платежом :) Шучу. Реальный ящик самовывозом. :) laimas. Ну не умею я аякс нормально отлаживать. В отличие от чистого php. |
Больно он мне нужен, чтобы я еще базаром с ним занимался, пустое оно и есть пустое. Просто бред о РМА, таблицах конкретно к вопросу "вставить html-код в форму" ну никакого отношения не имеет.
А я сделал вывод после его последнего ляпа - все что он тут несет, это копирование чужого или из руководств, с попыткой пояснения с растопыренными пальчиками. А конкретно по вставить код, так решений может быть масса, включая и такое - форма добавляющая данные отдается клиенту с пустыми полями, и с полями с установкой по умолчанию. Получив форму эту, можно сразу сделать клон этих полей, который потом и использовать при добавлении. Но это не удобно тем, что при редактировании нужно очищать поля (с чего собственно и начинается ваша тема), и чем больше полей и чем разнообразнее типы данных определяемые этими полями, тем сложнее операция. Потому вам и говорят - для вставки нужны заготовки полей, и делать это желательно так, чтобы все это работало едино для любого добавления в любую форму. |
Цитата:
|
Темы не хочу плодить. Спрошу здесь.
В общем, я получил уникальные ID элементов. При onchange чекбокса скрытое поле удаляется методом remove. А если снять галку с чекбокса, можно ли вернуть это скрытое поле на место? Или надо его в функции снова создать? То есть, есть антипод методу remove? Повторюсь. JS использую только в крайнем случае. Потому не знаю его досконально. И даже не досконально. Работаю на php. Так что если вопрос глупый, камнями не кидаться. input Hidden удаляю так: function removeHid(id) { var elem = document.getElementById("check"+id); elem.parentNode.removeChild(elem); } |
Цитата:
Советов как сделать datagrid быть не может, вещь сложная и емкая на находки и даже изобретения. Одно вполне ясно - как вы начали - так оно кончится очень быстро. Например когда вместо обычных полей и чекбоксов у вас пойдут списки, мультисписки, файловые кнопки и всякие особенные поля типа паролей, стилей, символов, цвета, даты, времени и тп тп. |
Цитата:
А если по делу? Убрал input методом remove - можно его восстановить, чтобы не писать в функции его снова? |
Ну ладно, я понял что не искали, ну гляньте как оно выглядит у людей - http://www.phpgrid.org/demo-center/ - это просто демка бесплатного скрипта по словам php datagrid Скачайте, приделайте к своим лесбиянкам и не мучайте эту как ее, ну вы поняли же.
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Идет обезьяна по пустыне, жаpко, пить хочется. И вдpуг видит: стоит пальма, а на ней - кокос. Hу обезьяна начинает тpясти ее, а внутpенний голос говоpит: " Обезьяна, подумай ! ". Обезьяна подумала, взяла палку, сбила кокос и напилась ... Идет студент по пустыне, жаpко, пить хочется. И вдpуг видит: стоит пальма, а на ней - кокос. Hу студент начинает тpясти ее, а внутpенний голос говоpит: " Студент, подумай ! ". - Чего тут думать, тpясти надо ! |
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 18:15. |