Несколько конструкций thead/tbody

У меня вопрос об удобстве использования/дизайне. В настоящее время я использую JQuery для скрытия/отображения целых областей. В настоящее время все они находятся в одной большой таблице, а thead на самом верху в качестве основного заголовка, а затем второй thead, который является заголовком того, что будет отображаться. Далее находится еще один апад, который является заголовком того, что скрыто, которое отображается в теле. Я знаю, что это ужасный стиль, но проблема, которую я пытаюсь преодолеть, - это то, что я хочу, чтобы все строки были такими же, как все они отображали один и тот же тип данных.

Пример кода

<table id="report">
    <thead>
    <tr id="header">
        <th>Country</th>
        <th>Population</th>
        <th>Area</th>
        <th>Official languages</th>
        <th></th>
    </tr>
    </thead>

    <thead>
    <tr>
        <td>United States of America</td>
        <td>306,939,000</td>
        <td>9,826,630 km2</td>
        <td>English</td>
        <td><div class="arrow"></div></td>
    </tr>
    </thead>

    <thead>
        <tr>
            <td>First Row</td>
            <td>Second Row</td>
            <td>Third Row</td>
            <td>Fourth Row</td>
            <td>Fifth Row</td>
        </tr>
    </thead>
    <tbody>
    <tr>
        <td colspan="5">
            <img src="../125px-Flag_of_the_United_States.svg.png" alt="Flag of USA" />
            <h4>Additional information</h4>
            <ul>
                <li><a href="#" onclick="location.href='http://en.wikipedia.org/wiki/Usa'; return false;">USA on Wikipedia</a></li>
                <li><a href="#" onclick="location.href='http://nationalatlas.gov/'; return false;">National Atlas of the United States</a></li>
                <li><a href="#" onclick="location.href='http://www.nationalcenter.org/HistoricalDocuments.html'; return false;">Historical Documents</a></li>
             </ul>   
        </td>
    </tr>
            <tr><td>some other stuff</td></tr>
    </tbody>
</table>

Ниже показано, что будет отображаться: alt text http://img694.imageshack.us/img694/9773/screenshot20100708at100.png alt text http://img822.imageshack.us/img822/9206/screenshot20100708at101.png

Теперь причина, по которой я это делал, состоит в том, что, как правило, у меня будет 4 строки для фактического отображаемого заголовка (этот пример - данные страны) и только 3 столбца из скрытого заголовка (первая строка, вторая и т.д.), Эти данные внутри имеют 1 строку - это URL-адрес, который может быть от 10 символов до 100+ (обычно 100+), что приводит к изменению всего отображения, а мои заголовки становятся 2 или 3 строками. В то время как я хотел, чтобы все строки оставались неизменными, есть способ связать только одно тело с 1 ада внутри таблицы, чтобы оно не повлияло на других. Так как это, вероятно, довольно запутанно, есть лучший способ фактически иметь несколько таблиц, но каждый из них остается таким же, независимо от данных, вводимых для тела. Я знаю, что будут вопросы, но любая помощь будет очень признательна и заметьте, я полностью открыт для этого по-другому. Однако требуется, чтобы данные могли быть скрыты, что является таблицей, и будет иметь заголовок для этой информации. Может быть отображаемый раздел, который не должен совпадать (он может быть div), а данные внутри каждого раздела должны иметь одинаковый формат.

PS: Если вы заинтересованы ниже, это JQuery, который я использую для всего этого.

    <script type="text/javascript">  
    $(document).ready(function(){
        $("#report thead").children("tr:odd").not("#header").addClass("odd");
        $("#report thead").children("tr:odd").not("#header").each(function(index){$(this).attr("id", "id" + index);});

        $("#report thead").children("tr:even").not("#header").addClass("bodyhead");
        $("#report thead:even").not(":first-child").each(function(index){$(this).attr("id", "bhid" + index);});

        $("#report tbody").each(function(index){$(this).attr("id", "bid" + index);});
        //$("#report tbody").each(function(index){$(this).attr("id", "id" + index);});
        //$("#report tbody").children("tr:not(.odd)").hide();
        $("#report tbody").hide();
        $("#report thead:even").not(":first-child").hide();

        //$("#report tbody #id0").show();
        //For header of headers.
        $("#report thead").children("tr:first-child").show();
        $("#report thead").children("tr").not("#header").not(".bodyhead").click(function(){ 
            $("#report #b" + this.id).toggle();
            $("#report #bh" + this.id).toggle();
            $(this).find(".arrow").toggleClass("up");
        });
    });
</script>  

Ответ 1

Несколько <thead> s в таблице недействительны HTML. Большинство строк, которые у вас есть в <thead> s, содержат данные без заголовков, поэтому они должны быть в <tbody>.

существует ли способ связать только одно тело с 1 ада внутри таблицы, чтобы он не влиял на других.

Да, используйте отдельную таблицу.

Если вы хотите, чтобы ширины столбцов были статическим размером полностью вниз, чтобы таблицы совпадали друг с другом, установите стили table-layout: fixed; width: 100% в каждой таблице и установите стили width для каждой из ячеек в в первой строке (или, лучше <col> s), что вы не хотите делиться равной пропорцией ширины макета.

(Рекомендуется использовать table-layout: fixed везде, где это возможно, так как он быстрее визуализируется и намного более предсказуем, чем алгоритм автоматической компоновки таблиц, особенно в IE, который имеет слегка испорченную реализацию, re используя colspan.)

Ответ 2

обычно у меня будет 4 строки для фактический отображаемый заголовок (это пример - данные страны) и только 3 столбца из скрытого заголовка (первая строка, вторая и т.д.).

thead должен включать только фактические заголовки, т.е. "Страна - население - Область - Официальные языки". Остальное - это данные и относится к телу.

Что вы назвали "Первая строка, вторая строка...", это столбцы, а не строки. Кажется, вы пытаетесь скрыть все строки после первой строки. Ваша таблица должна выглядеть так:

<table id="report">
    <thead>
    <tr id="header">
        <th>Country</th>
        <th>Population</th>
        <th>Area</th>
        <th>Official languages</th>
        <th></th>
    </tr>
    </thead>

    <tbody>
    <tr>
        <td>United States of America</td>
        <td>306,939,000</td>
        <td>9,826,630 km2</td>
        <td>English</td>
        <td id="tableToggle"><div class="arrow"></div></td>
    </tr>
    <tr>
        <td>First Row</td>
        <td>Second Row</td>
        <td>Third Row</td>
        <td>Fourth Row</td>
        <td>Fifth Row</td>
    </tr>
    <tr>
        <td colspan="5">
            <img src="../125px-Flag_of_the_United_States.svg.png" alt="Flag of USA" />
            <h4>Additional information</h4>
            <ul>
                <li><a href="#" onclick="location.href='http://en.wikipedia.org/wiki/Usa'; return false;">USA on Wikipedia</a></li>
                <li><a href="#" onclick="location.href='http://nationalatlas.gov/'; return false;">National Atlas of the United States</a></li>
                <li><a href="#" onclick="location.href='http://www.nationalcenter.org/HistoricalDocuments.html'; return false;">Historical Documents</a></li>
             </ul>   
        </td>
    </tr>
    <tr>
        <td>some other stuff</td>
    </tr>
    </tbody>
</table>

И вы можете скрыть все строки после первого с чем-то вроде этого (если они начнут скрываться):

$('#tableToggle').toggle(
    function() {
        $(this).nextAll().show();
    },
    function() {
        $(this).nextAll().hide();
    });

Если у вас более одного скрываемого раздела в одной и той же таблице, используйте

$(this).nextAll().slice(0, n).show();

где n - количество строк в секции. Или вы можете просто использовать новую таблицу для каждого скрываемого раздела.

Эти данные внутри имеют 1 строку - это URL-адрес который может быть от 10 символов до 100+ (100+ является общим) в результате чего весь дисплей изменение, и мои заголовки становятся 2 или 3 строки.

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