2

我试图在每个元素前面返回带有索引的数组,并在每个元素之后删除逗号。我能够将每个元素返回到一个新行,push()但仍然无法获得编号列表。我已经尝试在我的 js 中使用<li>and 。我在这里想念什么?<ol><div>

// TODO keep the student list state in a global list

var roster = new Array("");

function addStudent() {
    // TODO lookup the user entered text

    var newStudent = document.getElementById("student").value;

    // TODO store the new student name in global list

    roster.push("<div>" + newStudent + "</div>");

    // TODO render the entire list into the output div

    roster.innerHTML = roster.join('');
    document.getElementById("output").innerHTML = "Student List" + roster;

    return false;
} 

function init() {
    // TODO register the onsubmit for 'theForm' to use addStudent

    if (document && document.getElementById) {
        document.getElementById('theForm').onsubmit = addStudent;
    }
} 
window.onload = init;
    <form action="#" method="post" id="theForm" novalidate>
        <fieldset>
            <legend>Enter a student name to add to the roster</legend>
            <div><label for="student">Student Name</label><input type="text" name="student" id="student"></div>
            <input type="submit" value="Add to Roster" id="submit">
            <div id="output"></div>
        </fieldset>
    </form>
    <!-- <script src="js/students.js"></script> -->

4

3 回答 3

1

而不是依赖于innerHtml,您应该只从roster. 为了将其转换为有序列表,您应该用<ol>and将结果字符串括起来</ol>,并为每个元素添加一个<li>标签。请注意,该roster数组应初始化为一个空数组,而不是包含以下内容的数组""

var roster = new Array();

function addStudent() {
    // TODO lookup the user entered text

    var newStudent = document.getElementById("student").value;

    // TODO store the new student name in global list

    roster.push("<div>" + newStudent + "</div>");

    // TODO render the entire list into the output div

    rosterStr = '<ol>' + roster.map(r => `<li>${r}</li>`).join('') + '</ol>';
    document.getElementById("output").innerHTML = "Student List" + rosterStr;

    return false;
}
于 2020-09-27T21:56:11.940 回答
1

改变:

roster.innerHTML = roster.join('');
document.getElementById("output").innerHTML = "Student List" + roster;

到(或类似的)

document.getElementById("output").innerHTML = `
Student List:
<ol>
 <li>${roster.join('</li><li>')}</li>
</ol>`

的原因,"Student List" + roster因为它是一个字符串数组,即roster.toString()


扩展示例:

let roster = ['Steve', 'Bill']

// wrong
console.log('toString:', roster.toString())

// wrong
document.getElementById("output").innerHTML = 'Wrong<br>'
document.getElementById("output").innerHTML += "Student List" + roster;

// right (using join, there is various other ways to build output)
document.getElementById("output").innerHTML += '<br><hr>Right<br>'
document.getElementById("output").innerHTML += `
Student List:
<ol>
 <li>${roster.join('</li><li>')}</li>
</ol>
`
<div id="output"></div>

于 2020-09-27T21:56:41.683 回答
0

这是另一种方法,它在占位符元素内创建有序列表。它不使用数组,而是将文档用作状态。

它没有使用 sting 连接,而是使用编程方法来创建新元素并将其附加到文档中。

// Creates an `<ol>` element in the target node if none can be found
// or returns an existing list
function createList(target) {
  let list = output.querySelector('ol') || document.createElement("ol");
  // append the element if its a newly created element
  if (!list.parentNode) target.appendChild(list);
  return list;
}

// Appends a <li> element to the list with the text provided by the name argument
function addStudent(name, list){
  let student = document.createElement('li');
  student.appendChild(document.createTextNode(name));
  list.appendChild(student);
  return student;
};

// This adds an event listener which catches the 
// submit event as it bubbles up to the top of the dom.
// Since we are not attaching the handler directly 
// to the element we don't have to wait for the document to be ready
document.addEventListener('submit', function(event){
  let form = event.target;
  let output = document.getElementById('output');
  // bail early if this isn't the right form or there is no output
  if (form.id !== 'theForm' || !output) return; 
  event.preventDefault(); // prevents the normal form submission
  addStudent(form["student"].value, createList(output));
});
<div id="output"></div>

<form action="#" method="post" id="theForm" novalidate>
  <fieldset>
    <legend>Enter a student name to add to the roster</legend>
    <div><label for="student">Student Name</label><input type="text" name="student" id="student"></div>
    <input type="submit" value="Add to Roster" id="submit">
    <div id="output"></div>
  </fieldset>
</form>

我选择动态创建元素的原因是没有任何项目的列表元素是无效的 HTML。

于 2020-09-27T23:11:45.047 回答