Выходная таблица HTML/JS не показывает горизонтальные границы

avatar
SMARZ
1 июля 2021 в 16:23
86
3
-1

Я не могу понять, почему мои горизонтальные границы не отображаются в разделе вывода. См. код и скриншот ниже: Я хотел бы иметь горизонтальные границы и, если возможно, сохранить поля даты от перенос в следующую строку ниже себя. enter image description here

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

           <td align="center"><input type="button" value="Submit" name="submit" id="submit" onClick="display()" /></button></td>
    </tr>
</table>
<table width="400px" align="center" colspan="40" table border="5">

    <tr style="background-color:#8FBC8F;">
        <td align="center"><b>Name</b></td>
        <td align="center"><b>Company</b></td>
        <td align="center"><b>Time In</b></td>
        <td align="center"><b>Time Out</b></td>
        <td align="center"><b>Description of Work</b></td>
    </tr>
    <tr>
        <td align="center"><div id="displayarea"></div></td>
        <td align="center"><div id="displayarea1"></div></td>
        <td align="center"><div id="displayarea2"></div></td>
        <td align="center"><div id="displayarea3"></div></td>
        <td align="center"><div id="displayarea4"></div></td>
    </tr>

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

function getValue() {
        var Items = "";
        var td1 = document.getElementById("displayarea").innerHTML.split("<br>");
        var td2 = document.getElementById("displayarea1").innerHTML.split("<br>");
        var td3 = document.getElementById("displayarea2").innerHTML.split("<br>");
        var td4 = document.getElementById("displayarea3").innerHTML.split("<br>");
        var td5 = document.getElementById("displayarea4").innerHTML.split("<br>");

        for (var i = 0; i < td1.length; i++) {
            if (td1[i])
                Items += td1[i] + " ,";
            if (td2[i])
                Items += td2[i] + " ,";
            if (td2[i])
                Items += td2[i] + " ,";
            if (td3[i])
                Items += td3[i] + " ,";
            if (td4[i])
                Items += td4[i] + " ";
            Items += "\n";
            
            
        }
        console.log(Items);
        return Items;
    }

    function display() {
        document.getElementById("displayarea").innerHTML += document.getElementById("fname").value + "<br />";
        document.getElementById("fname").value = "";
        document.getElementById("displayarea1").innerHTML += document.getElementById("lname").value + "<br />";
        document.getElementById("lname").value = "";
        document.getElementById("displayarea2").innerHTML += document.getElementById("sname").value + "<br />";
        document.getElementById("sname").value = "";
        document.getElementById("displayarea3").innerHTML += document.getElementById("pname").value + "<br />";
        document.getElementById("pname").value = "";
        document.getElementById("displayarea4").innerHTML += document.getElementById("jname").value + "<br />";
        document.getElementById("jname").value = "";
    }
Источник
Andy Ray
1 июля 2021 в 16:27
1

Не похоже, что вы поместили какие-либо <tr> (строки таблицы) в свою таблицу

Jaromanda X
1 июля 2021 в 16:30
1

у вас есть 1 строка заголовка и 1 строка для данных, судя по всему, данные разбиты на строки с использованием <br> ... это не то же самое, что создание новой строки

Ответы (3)

avatar
Heretic Monkey
1 июля 2021 в 17:27
1

Я настоятельно рекомендую вам начать отделять свои данные от представления этих данных.

Итак, разделите функцию display на две: createRow и renderRows. Аналогично, getValues может быть просто getRows.

Обратите внимание, что для этого требовался другой способ работы с вашим кодом, поэтому я также провел рефакторинг вашего HTML и CSS, чтобы привести его в большее соответствие с современными методами.

function getRows(data) {
  return data.map(datum => Object.values(datum).join(',')).join('\n');
}

function createRow(data) {
  const datum = {
    fname: document.getElementById("fname").value,
    lname: document.getElementById("lname").value,
    sname: new Date(document.getElementById("sname").valueAsNumber).toLocaleString(),
    pname: new Date(document.getElementById("pname").valueAsNumber).toLocaleString(),
    jname: document.getElementById("jname").value
  };
  data.push(datum);
  document.getElementById("dataForm").reset();
  renderRows(data);
}

function renderRows(data) {
  const body = document.getElementById("renderedData");
  body.innerHTML = "";
  for (let datum of data) {
    let tr = document.createElement('tr');
    let tdFName = document.createElement('td');
    tdFName.appendChild(document.createTextNode(datum.fname));
    tr.appendChild(tdFName);
    let tdLName = document.createElement('td');
    tdLName.appendChild(document.createTextNode(datum.lname));
    tr.appendChild(tdLName);
    let tdSName = document.createElement('td');
    tdSName.appendChild(document.createTextNode(datum.sname));
    tr.appendChild(tdSName);
    let tdPName = document.createElement('td');
    tdPName.appendChild(document.createTextNode(datum.pname));
    tr.appendChild(tdPName);
    let tdJName = document.createElement('td');
    tdJName.appendChild(document.createTextNode(datum.jname));
    tr.appendChild(tdJName);
    body.appendChild(tr);
  }
}
window.addEventListener('load', () => {
  const data = [];
  document.getElementById('add').addEventListener('click', function(e) {
    createRow(data);
  });
  document.getElementById('getData').addEventListener('click', function(e) {
    console.log(getRows(data));
  });
});
form {
  width: max-content;
  margin: 0 auto 1rem;
}
.control-group {
  display: flex;
  justify-content: space-between;
}
fieldset {
  display: flex;
  flex-flow: column nowrap;
}

fieldset button {
  align-self: flex-end;
}
<form id="dataForm">
  <fieldset>
    <legend>Enter Data</legend>
    <div class="control-group">
      <label for="fname">Name:</label>
      <input id="fname" type="text">
    </div>
    <div class="control-group">
      <label for="lname">Company:</label>
      <input id="lname" type="text">
    </div>
    <div class="control-group">
      <label for="sname">Time In:</label>
      <input id="sname" type="datetime-local">
    </div>
    <div class="control-group">
      <label for="pname">Time Out:</label>
      <input id="pname" type="datetime-local">
    </div>
    <div class="control-group">
      <label for="jname">Description of Work:</label>
      <textarea id="jname"></textarea>
    </div>
    <button type="button" id="add">Add</button>
  </fieldset>
</form>
<table width="400px" align="center" colspan="40" table border="5">
  <thead>
    <tr style="background-color:#8FBC8F;" id='header'>
      <td align="center"><b>Name</b></td>
      <td align="center"><b>Company</b></td>
      <td align="center"><b>Time In</b></td>
      <td align="center"><b>Time Out</b></td>
      <td align="center"><b>Description of Work</b></td>
    </tr>
  </thead>
  <tbody id="renderedData">
  </tbody>
</table>
<button type="button" id="getData">Get Data</button>
SMARZ
2 июля 2021 в 00:32
0

Что вы имели в виду отделить данные от данных презентации? В настоящее время я работаю в Notepad ++ и только начинаю.

Heretic Monkey
2 июля 2021 в 12:29
1

@Zedu Идея в том, что данные, с которыми вы хотите работать, не привязаны к DOM. То есть элементы на экране. Итак, в моем ответе данные хранятся в массиве как объекты. При желании вы можете использовать эти данные для создания диаграммы вместо таблицы или в дополнение к ней. Это также упрощает работу с данными; например, сортировка проще, так как это просто сортировка объектов в массиве, а не попытка сортировки строк таблицы.

avatar
Jaromanda X
1 июля 2021 в 16:52
0

Вот простой способ добавить строку с каждым добавлением, используя элемент — доступный во всех хороших браузерах (не такой быстрый Internet Explorer, я не с вами разговаривал)

Я также изменил способ чтения значений

обратите внимание, используя class вместо id в ячейках в строках - чтобы было проще получить их все с минимальными изменениями в коде

Хотя лично я бы получил данные строки по-другому (показано в alternativeGetValues)

function getValue() {
    var Items = "";
    var td1 = [...document.querySelectorAll(".displayarea")].map(e => e.innerHTML);
    var td2 = [...document.querySelectorAll(".displayarea1")].map(e => e.innerHTML);
    var td3 = [...document.querySelectorAll(".displayarea2")].map(e => e.innerHTML);
    var td4 = [...document.querySelectorAll(".displayarea3")].map(e => e.innerHTML);
    var td5 = [...document.querySelectorAll(".displayarea4")].map(e => e.innerHTML);

    for (var i = 0; i < td1.length; i++) {
        if (td1[i])
            Items += td1[i] + " ,";
        if (td2[i])
            Items += td2[i] + " ,";
        if (td3[i])
            Items += td3[i] + " ,";
        if (td4[i])
            Items += td4[i] + " ,";
        if (td5[i])
            Items += td5[i] + " ";
        Items += "\n";

    }
    console.log(Items);
    return Items;
}

function display() {
    const template = document.getElementById("row");
    const clone = template.content.cloneNode(true);
    const additem = (dest, src) => {
        const s = document.querySelector(src);
        clone.querySelector(dest).innerHTML = s.value;
        s.value = "";
    };
    additem(".displayarea", "#fname");
    additem(".displayarea1", "#lname");
    additem(".displayarea2", "#sname");
    additem(".displayarea3", "#pname");
    additem(".displayarea4", "#jname");
    template.insertAdjacentElement('beforebegin', clone.firstElementChild);
}

// IMHO this is better
function alternateGetValue() {
    const Items = [...document.querySelectorAll('.data')]
        .map(row => [...row.querySelectorAll('td>div')]
            .map(d => d.textContent).join(',')
        ).join('\n');
    console.log(Items);
    return Items;
}
.wide {
  min-width:12em;
}
F: <input id="fname"> <br>
L: <input id="lname"> <br>
S: <input id="sname"> <br>
P: <input id="pname"> <br>
J: <input id="jname"> <br>
<input type="button" value="add" onclick="display()"/>
<input type="button" value="show" onclick="getValue()"/>
<input type="button" value="Better" onclick="alternateGetValue()"/>
<table width="400px" align="center" colspan="40" table border="5">
  <thead>
    <tr style="background-color:#8FBC8F;" id='header'>
        <td align="center"><b>Name</b></td>
        <td align="center"><b>Company</b></td>
        <td align="center" class="wide"><b>Time In</b></td>
        <td align="center" class="wide"><b>Time Out</b></td>
        <td align="center"><b>Description of Work</b></td>
    </tr>
  </thead>
  <tbody>
    <template id="row">
        <tr style="background-color:#8F8FBC;" class="data">
            <td align="center"><div class="displayarea"></div></td>
            <td align="center"><div class="displayarea1"></div></td>
            <td align="center"><div class="displayarea2"></div></td>
            <td align="center"><div class="displayarea3"></div></td>
            <td align="center"><div class="displayarea4"></div></td>
        </tr>
    </template>
  </tbody>
</table>
avatar
Johannes
1 июля 2021 в 16:31
1

Чтобы получить границы для всех ячеек, добавьте это вверху вашего html-кода (внутри head):

<style>
  table { 
    border-collapse: collapse; 
  }
  td {
    border: 1px solid #555;
  }
</style>

Настройте толщину, стиль и цвет границы по своему усмотрению (в настройке border параметра td)

Heretic Monkey
1 июля 2021 в 16:49
1

Это не поможет, если OP не использует ячейки таблицы, а использует элементы br в существующей ячейке для имитации строк данных.

Jaromanda X
2 июля 2021 в 12:18
1

@HereticMonkey - извините ... моя страница испортилась, и я думал, что этот комментарий был к моему ответу !! много извинений за мой старший момент!!!

Heretic Monkey
2 июля 2021 в 12:22
1

@JaromandaX Не беспокойтесь, это случается с лучшими из нас.