HTML: расширение формы по нескольким столбцам td - PullRequest
16 голосов
/ 01 декабря 2009

Я бы хотел сделать что-то подобное в HTML. Это недействительный HTML, но цель есть:

<table>
    <tr>
        <th>Name</th>
        <th>Favorite Color</th>
        <th>&nbsp;</th>
        <th>&nbsp;</th>
    </tr>
    <tr>
        <form action="/updatePerson" method="post">
            <input name="person_uuid" value="550e8400-e29b-41d4-a716-446655440000"/>
            <td><input name="name" value="John"/></td>
            <td><input name="favorite_color" value="Green"/></td>
            <td><input type="submit" value="Edit Person"/></td>
        </form>
        <td>
            <form action="deletePerson" method="post">
                <input name="person_uuid" value="550e8400-e29b-41d4-a716-446655440000"/>
                <input type="submit" value="Delete Person"/>
            </form>
        </td>
    </tr>
    <tr>
        <form action="/updatePerson" method="post">
            <input name="person_uuid" value="f47ac10b-58cc-4372-a567-0e02b2c3d479"/>
            <td><input name="name" value="Sally"/></td>
            <td><input name="favorite_color" value="Blue"/></td>
            <td><input type="submit" value="Edit Person"/></td>
        </form>
        <td>
            <form action="deletePerson" method="post">
                <input name="person_uuid" value="f47ac10b-58cc-4372-a567-0e02b2c3d479"/>
                <input type="submit" value="Delete Person"/>
            </form>
        </td>
    </tr>
</table>

Очевидно, я не могу этого сделать, потому что у меня не должно быть тега формы внутри элемента <tr>. Единственные альтернативы, которые я вижу, - это использовать неприятный javascript или изменить поведение моей программы.

Какое может быть решение, которое позволило бы мне иметь форму, которая охватывает несколько столбцов, как это?

Ответы [ 11 ]

4 голосов
/ 01 декабря 2009

Один из вариантов - объединить столбцы с colspans следующим образом:

<table>
    <tr>
        <th>
            Name
        </th>
        <th>
            Favorite Color
        </th>
        <th>
            &nbsp;
        </th>
        <th>
            &nbsp;
        </th>
    </tr>
    <tr>
        <td colspan="4">
            <form action="/updatePerson" method="post">
                <input name="person_uuid" value="550e8400-e29b-41d4-a716-446655440000"/>
                    <input name="name" value="John"/>
                    <input name="favorite_color" value="Green"/>
                    <input type="submit" value="Edit Person"/>
            </form>
            <form action="deletePerson" method="post">
                <input name="person_uuid" value="550e8400-e29b-41d4-a716-446655440000"/>
                    <input type="submit" value="Delete Person"/>
            </form>
        </td>
    </tr>
    <tr>
        <td colspan="4">
            <form action="/updatePerson" method="post">
                <input name="person_uuid" value="f47ac10b-58cc-4372-a567-0e02b2c3d479"/>
                <input name="name" value="Sally"/>
                    <input name="favorite_color" value="Blue"/>
                    <input type="submit" value="Edit Person"/>
            </form>
            <form action="deletePerson" method="post">
                <input name="person_uuid" value="f47ac10b-58cc-4372-a567-0e02b2c3d479"/>
                    <input type="submit" value="Delete Person"/>
            </form>
        </td>
    </tr>
</table>

И стиль макета элемента формы с помощью CSS. Или вы можете использовать чистый макет на основе DIV.

3 голосов
/ 06 июля 2012

Старые сообщения я знаю, но для всех, кто ищет это ...

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

Может быть, это скрыто за вашим вопросом, есть причина, по которой вы не можете этого сделать. Но «правильный» HTML-верный способ сделать то, что вы пытаетесь сделать, это поместить всю таблицу в одну форму. Зачем вам нужно одну форму для редактирования, а другую для удаления?

<form action="/updatePerson" method="post">
<table>
    <thead>
        <tr><th>Person Name</th><th>Fave Color</th><th>&nbsp;</th><th>&nbsp;</th></tr>
    </thead>
    <tbody>
        <tr>
            <td><input type="text" size="30" value="John" name="name_1"></td>
            <td><input name="favorite_color_1" value="Green"/></td>
            <td><input type="submit" value="Update" name="submit_update_1"></td>
            <td><input type="submit" value="Delete" name="submit_delete_1"></td>
        </tr><tr>
            <td><input type="text" size="30" value="James" name="name_2"></td>
            <td><input name="favorite_color_2" value="Orange"/></td>
            <td><input type="submit" value="Update" name="submit_update_2"></td>
            <td><input type="submit" value="Delete" name="submit_delete_2"></td>
        </tr>
    </tbody>
</table>
</form>

Вам нужно немного логики в вашем ASP / PHP / серверном коде, чтобы вычислить, какое имя кнопки было нажато, но это нужно в любом случае, используя предложенное решение.

2 голосов
/ 01 декабря 2009

Я бы проголосовал за противный Javascript. Это позволило бы сохранить макет как есть.

2 голосов
/ 01 декабря 2009

Используйте дизайн без таблиц с Div и CSS.

Например.

<html>
<head>
<style type="text/css">
    #wrapper
    {
        width: 600px;
    }
    #header
    {
        width: 600px;
        height:30px;
    }
    #person
    {
       clear:both;
        width:600px;        }
    .name
    {
    clear:both;
        width: 200px;
        float: left;
        text-align: center;
    }
    .color
    {
        width: 200px;
        float: left;
        text-align: center;
    }
    .submit
    {
        width: 200px;
        float: left;
        text-align: center;
    }
</style>
</head>
<body>
<div id="wrapper">
    <div id="header">
        <div class="name">
            <b>Name</b></div>
        <div class="color">
            <b>Favorite Color</b></div>
    </div>
    <div id="Person">
        <form action="/updatePerson" method="post">
        <div class="name">
            <input name="name" value="John" /></div>
        <div class="color">
            <input name="favorite_color" value="Green" /></div>
        <div class="submit">
            <input type="submit" value="Edit Person" /></div>
        </form>
    </div>
</div>
</body>
</html>
1 голос
/ 01 декабря 2009

Вы могли бы

a) объединить всю строку таблицы в одной форме и обработать ее одним серверным скриптом.

или

б) установить form.action с помощью JavaScript.

1 голос
/ 01 декабря 2009

Нет, такой формы не существует. Но во многих браузерах ваше использование работает так, как вы ожидали, за исключением случаев, когда вы динамически создаете элементы DOM с такой структурой в FireFox.

Может быть, вы можете выбросить тег , используйте javascript для отправки; Или вы можете использовать

для создания таблицы.
1 голос
/ 01 декабря 2009

Одним из решений было бы, если бы несколько столбцов были фактически созданы в DIV с вместо таблиц.

0 голосов
/ 25 января 2018

Я столкнулся с той же проблемой, решил ее с помощью Javascript / jQuery. Проблема в том, что форма не может растягиваться на несколько столбцов в таблице, однако, если форма имеет идентификатор <form id="unique_per_page"...></form>, то каждый из автономных элементов формы, таких как input, select или даже textarea, может быть назначен этой форме с помощью атрибута формы <input type="text" name="userName" form="specific_form_id">

jquery / javascript для назначения этих вещей должен иметь генератор случайных строк, который я взял из следующего ответа Stackoverflow

Итак, в целом код будет выглядеть так:

    $("table tr").each(function(i, el){
        if(!$(el).find("form[name='updatePerson']").attr("id"))
        { //if the form does not have id attribute yet, assign a 10-character random string
            var fname = (Math.random().toString(36)+'00000000000000000').slice(2, 10+2);
            $(el).find("form[name='updatePerson']").attr("id",fname); //assign id to a chosen form
            $(el).find("input").attr("form",fname); //assign form attribute to all inputs on this line
            $(el).find("form[name='deletePerson'] > input").removeAttr("form"); //remove form attribute from inputs that are children of the other form
        }
    });

HTML-код, который вы включили, должен быть обновлен соответствующими атрибутами имени для форм

<table>
    <tr>
        <th>Name</th>
        <th>Favorite Color</th>
        <th>&nbsp;</th>
        <th>&nbsp;</th>
    </tr>
    <tr>
        <form action="/updatePerson" name="updatePerson" method="post">
            <input name="person_uuid" value="550e8400-e29b-41d4-a716-446655440000"/>
            <td><input name="name" value="John"/></td>
            <td><input name="favorite_color" value="Green"/></td>
            <td><input type="submit" value="Edit Person"/></td>
        </form>
        <td>
            <form action="deletePerson" name="deletePerson" method="post">
                <input name="person_uuid" value="550e8400-e29b-41d4-a716-446655440000"/>
                <input type="submit" value="Delete Person"/>
            </form>
        </td>
    </tr>
    <tr>
        <form action="/updatePerson" name="updatePerson" method="post">
            <input name="person_uuid" value="f47ac10b-58cc-4372-a567-0e02b2c3d479"/>
            <td><input name="name" value="Sally"/></td>
            <td><input name="favorite_color" value="Blue"/></td>
            <td><input type="submit" value="Edit Person"/></td>
        </form>
        <td>
            <form action="deletePerson" name="deletePerson" method="post">
                <input name="person_uuid" value="f47ac10b-58cc-4372-a567-0e02b2c3d479"/>
                <input type="submit" value="Delete Person"/>
            </form>
        </td>
    </tr>
</table>
0 голосов
/ 25 января 2014

Я всегда так делал:

<tr>
    <td><form><input name=1></td>
    <td><input name=2></td>
    <td><input type=submit></form></td>
</tr>

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

С вашим примером:

<tr>
    <td>
        <form action="/updatePerson" method="post">
            <input name="person_uuid" value="550e8400-e29b-41d4-a716-446655440000"/>
    </td>
    <td>    <input name="name" value="John"/></td>
    <td>    <input name="favorite_color" value="Green"/></td>
    <td>
            <input type="submit" value="Edit Person"/>
        </form>
    </td>
    <td>
        <form action="deletePerson" method="post">
            <input name="person_uuid" value="550e8400-e29b-41d4-a716-446655440000"/>
            <input type="submit" value="Delete Person"/>
        </form>
    </td>
</tr>
0 голосов
/ 03 июня 2012

Я пробовал множество способов решить ту же проблему; несколько форм в одной HTML-таблице. FF & Chrome автоматически закроются, если будут помещены перед или внутри или потому что это не семантически правильный HTML. Я ценю, что макет на основе решит проблему, но если вам «нужно» придерживаться макета на основе таблиц, вам нужно будет использовать несколько таблиц и переносить символы & непосредственно перед и после тегов &. В моем случае я сделал несколько небольших встроенных CSS-корректировок, чтобы удалить одну или две границы, а затем таблица упирается друг в друга, как будто это строки.

Пример по адресу: http://jsfiddle.net/chopstik/ve9FP/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...