HTML: возможно ли иметь тег формы в каждой строке таблицы допустимым способом XHTML?
Я могу лучше всего описать следующим образом:
Я хочу это (вся таблица в editmode
и сохранить кнопку в каждой строке).
<table>
<tr>
<td>Id</td>
<td>Name</td>
<td>Description</td>
<td> </td>
</tr>
<tr>
<td><input type="hidden" name="id" value="1" /></td>
<td><input type="text" name="name" value="Name" /></td>
<td><input type="text" name="description" value="Description" /></td>
<td><input type="submit" value="Save" /></td>
</tr>
<tr>
<td><input type="hidden" name="id" value="2" /></td>
<td><input type="text" name="name" value="Name2" /></td>
<td><input type="text" name="description" value="Description2" /></td>
<td><input type="submit" value="Save" /></td>
</tr>
<!-- and more rows here ... -->
</table>
куда я должен поставить <form>
теги?
8 ответов:
вы не можете. Ваш единственный вариант-разделить это на несколько столов и поставил тег форма вне его. Вы можете в конечном итоге вложить свои таблицы, но это не рекомендуется:
<table> <tr><td><form> <table><tr><td>id</td><td>name</td>...</tr></table> </form></td></tr> </table>
Я бы полностью удалил таблицы и заменил их стилизованными html-элементами, такими как divs и spans.
стоит отметить, что это возможно в HTML5, используя атрибут "форма" для входных элементов:
<table> <tr> <td>Id</td> <td>Name</td> <td>Description</td> <td> </td> </tr> <tr> <td><form id="form1"><input type="hidden" name="id" value="1" /></form></td> <td><input form="form1" type="text" name="name" value="Name" /></td> <td><input form="form1" type="text" name="description" value="Description" /></td> <td><input form="form1" type="submit" value="Save" /></td> </tr> <tr> <td><form id="form2"><input type="hidden" name="id" value="1" /></form></td> <td><input form="form2" type="text" name="name" value="Name" /></td> <td><input form="form2" type="text" name="description" value="Description" /></td> <td><input form="form2" type="submit" value="Save" /></td> </tr> </table>
в то время как чистый в его отсутствие JS и использование оригинальных элементов, к сожалению, это не работает в IE10.
у меня был аналогичный вопрос и ответ на вопрос HTML: таблица форм? решил это для меня. (Не уверен, что это XHTML, но он работает в браузере HTML5.)
вы можете использовать css, чтобы дать макет таблицы для других элементов.
.table { display: table; } .table>* { display: table-row; } .table>*>* { display: table-cell; }
затем вы используете следующий допустимый html.
<div class="table"> <form> <div>snake<input type="hidden" name="cartitem" value="55"></div> <div><input name="count" value="4" /></div> </form> </div>
Я бы сказал, что вы можете, хотя он не проверяет, и Firefox перестроит код (так что то, что вы видите в "просмотре сгенерированного источника" при использовании веб-разработчика, вполне может удивить). Я не эксперт, но
<form action="someexecpage.php" method="post">
перед
<tr>
и затем с помощью
</tr></form>
В конце строки, безусловно, дает функциональность (проверено в Firefox, Chrome и IE7-9). Работа для меня, даже если количество ошибок проверки, которые она произвела, было новым личные лучшие / худшие! Никаких проблем не видно как следствие, и у меня есть довольно сильно стилизованный стол. Я думаю, у вас может быть динамически создаваемая таблица, как и у меня, поэтому разбор строк таблицы немного неочевиден для нас, смертных. Таким образом, в основном, откройте форму в начале строки и закройте ее сразу после окончания строки.
Если вы попытаетесь добавить форму, деформирующую элемент tr, как это
<table> <form> <tr> <td><input type="text"/></td> <td><input type="submit"/></td> </tr> </form> </table>
некоторые браузеры в процессе рендеринга закрывают тег формы сразу после объявления оставляя входы за пределами элемента
что-то вроде этого
<table> <form></form> <tr> <td><input type="text"/></td> <td><input type="submit"/></td> </tr> </table>
эта проблема по-прежнему актуальна для деформации нескольких ячеек таблицы
как stereoscott сказал выше, таблицы вложенности являются возможным решением, которое не рекомендуется. Избегайте использования таблиц.
на самом деле у меня есть проблема с формой на каждой строке таблицы, с javascript (на самом деле jquery) :
как сказал Лотре1, "некоторые браузеры в процессе рендеринга закрывают тег формы сразу после объявления, оставляя входы за пределами элемента"
что делает мои поля ввода вне формы, поэтому я не могу получить доступ к дочерним элементам моей формы через DOM с JAVASCRIPT..
как правило, следующий код JQUERY не будет работать :
$('#id_form :input').each(function(){/*action*/}); // this is supposed to select all inputS // within the form that has an id ='id_form'
но приведенный выше пример не работает с визуализированным HTML:
<table> <form id="id_form"></form> <tr id="tr_id"> <td><input type="text"/></td> <td><input type="submit"/></td> </tr> </table>
Я все еще ищу чистое решение (хотя использование параметра TR ' id ' для обхода DOM исправит эту конкретную проблему)
грязное решение будет (для jquery):
$('#tr_id :input').each(function(){/*action*/}); // this will select all the inputS // fields within the TR with the id='tr_id'
приведенный выше пример будет работать, но он не совсем "чистый", потому что он ссылается на TR вместо формы, и для этого требуется AJAX ...
редактировать : полный процесс с jquery / ajax будет:
//init data string // the dummy init value (1=1)is just here // to avoid dealing with trailing & // and should not be implemented // (though it works) var data_str = '1=1'; // for each input in the TR $('#tr_id :input').each(function(){ //retrieve field name and value from the DOM var field = $(this).attr('name'); var value = $(this).val(); //iterate the string to pass the datas // so in the end it will render s/g like // "1=1&field1_name=value1&field2_name=value2"... data_str += '&' + field + '=' + value; }); //Sendind fields datawith ajax // to be treated $.ajax({ type:"POST", url: "target_for_the_form_treatment", data:data_string, success:function(msg){ /*actions on success of the request*/ }); });
таким образом," target_for_the_form_treatment " должен получать данные POST, как если бы ему была отправлена форма (appart из post[1] = 1, но для реализации этого решения я бы рекомендовал иметь дело с трейлингом '&' data_str вместо этого).
все равно мне не нравится это решение, но я вынужден использовать структуру таблицы из-за плагина dataTables jquery...
Я опоздал на вечеринку, но это отлично сработало для меня, и код должен объяснить себя;
<script type="text/javascript"> function formAJAX(btn){ var $form = $(btn).closest('[action]'); var str = $form.find('[name]').serialize(); $.post($form.attr('action'), str, function(data){ //do stuff }); } <script>
HTML:
<tr action="scriptURL.php"> <td> Field 1:<input type="text" name="field1"/> </td> <td> Field 2:<input type="text" name="field2" /> </td> <td><button type="button" onclick="formAJAX(this)">Update</button></td> </tr>