簡體   English   中英

如何在長度改變的nodeList上使用insertBefore?

[英]How do I use insertBefore on a nodeList thats length is changing?

我對JS很陌生,所以如果這很愚蠢,請原諒我,DOM工作對我來說很痛苦。

當我運行此命令時, if塊執行良好。 它添加了一個新節點,其長度為2。但是,當我嘗試添加另一個項目時, else塊將返回以下內容:

未發現NotFoundError:在“節點”上無法執行“ insertBefore”:要在其之前插入新節點的節點不是該節點的子節點。

這似乎不可能。 正確的方法是什么?

JS

'use strict';

let todoList = document.getElementById("todo-list");

let todoSubmit = () => {
    // User input
        let todoTextInput = document.getElementById("todo-form-text").value;
    // New item
        let todoItem = document.createElement("span");
        let todoItemInput = document.createElement("input");
        todoItemInput.setAttribute("type", "hidden");
        let todoText = document.createTextNode(todoTextInput);
        let todoLineBreak = document.createElement("br");
        todoItem.appendChild(todoItemInput);
        todoItem.appendChild(todoText);
        todoItem.appendChild(todoLineBreak);
    // Add to list
        if (todoList.childNodes.length === 1) {
            todoList.appendChild(todoItem);
        } else {
            todoItem.insertBefore(todoList.childNodes["1"], todoList);
        }
    return false;
}

標記

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

    <form onsubmit="return todoSubmit()" id="todo-form">
        <input id="todo-form-text" type="text">
        <input id="todo-form-submit" type="submit">
    </form>

    <div id="todo-list">
    </div>

    <script src="script.js"></script>
</body>
</html>

您的insertBefore順序錯誤

var insertedNode = parentNode.insertBefore(newNode, referenceNode);

https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore

JS

'use strict';

let todoList = document.getElementById("todo-list");

let todoSubmit = () => {
    // User input
        let todoTextInput = document.getElementById("todo-form-text").value;
    // New item
        let todoItem = document.createElement("span");
        let todoItemInput = document.createElement("input");
        todoItemInput.setAttribute("type", "hidden");
        let todoText = document.createTextNode(todoTextInput);
        let todoLineBreak = document.createElement("br");
        todoItem.appendChild(todoItemInput);
        todoItem.appendChild(todoText);
        todoItem.appendChild(todoLineBreak);
    // Add to list
        if (todoList.childNodes.length === 1) {
            todoList.appendChild(todoItem);
        } else {
            todoList.insertBefore(todoItem, todoList.childNodes[1]);
        }
    return false;
}

參見https://jsfiddle.net/6j6a6eq8/1/

當您不使用前端框架時,可能會發生這種情況。 諸如react.js和Angular.js之類的前端監視DOM的更改並對其進行更新。 他們有點更新可用DOM項目的列表。 因此,當您添加項目時,瀏覽器不會意識到新節點的添加。 這就是瀏覽器給您錯誤的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM