首发于 前端学习

JS多个按钮相同功能,更新不同元素

初学前端经常用getElementById来修改元素内容,但遇到需要反复用同种功能时不太可能反复使用getElementById,然后创建多个不同id的元素来实现

此时通常用getElementsByClassName来实现,因其返回的是一个数组结构,有时会出现无法对映上想修改的元素等问题。

以下用创建一个可修改的treeView为例,来展示如何实现类似的操作以及其中有哪些常见错误。

可添加,删除,修改名称的TreeView
<!DOCTYPE html>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
</head>
        <button id='createParent'>Create Parent</button>
        <ul id="backend"></ul>
    </div>
    <script src='script.js'></script>
</body>
</html>

Create Parent按钮创建新的父节点

<ul id="backend"></ul>是我们要加入新内容的地方

.createChild {
    background-color: grey;
    color: white;
    padding: 0.1rem 0.5rem;
    margin-left: 5px;
    cursor: pointer;
.closeIt {
    background-color: grey;
    color: white;
    padding: 0.1rem 0.5rem;
    margin-left: 5px;
    cursor: pointer;
.click {
    background-color: grey;
    color: white;
    padding: 0.1rem 0.5rem;
    margin-left: 5px;
    cursor: pointer;
}

style.css文件

createParent = document.getElementById('createParent')
backend = document.getElementById('backend')
//给createParent按钮添加点击添加父节点事件,新事件会添加在id='backend'的元素中
createParent.addEventListener('click', function() {
    backend.innerHTML += ` <li>
    <span class='name'>Node</span>
    <span class="click">m</span>
    <span class='createChild'>+</span>
    <span class='closeIt'>x</span>
    <span class='timer'>0</span>
    </li>`
    myfunction()
backend.addEventListener('click', function(e) {
//点击删除当前节点,因要删除整个<li>中内容因此要删掉parentElement
    if (e.target.classList == 'closeIt') {
        e.target.parentElement.remove();
    if (e.target.classList == 'createChild') {
        createChildBtn = e.target;
        parentNode = createChildBtn.parentElement;
        var x = ` <li>
        <span class='name'>Node</span>
        <span class="click">m</span>
        <span class='createChild'>+</span>
        <span class='closeIt'>x</span>
        <span class='timer'>0</span>
        </li>`
        parentNode.innerHTML += `<ul>${x}</ul>`;
//myfunction()的位置必须在末尾,保证新的元素添加完才会运行,不然会导致getElementsByClassName返回的数组index出错
        myfunction()
function myfunction() {
    //这里可能会出错,如果不用let会导致后续i的值不统一
    for(let i=0;i<document.getElementsByClassName("click").length;i++){
        document.getElementsByClassName("click")[i].onclick=function(){
            var text=document.getElementsByClassName("name")[i];
            var val=text.innerHTML;
            text.innerHTML="<input type='text' id='n' value="+val+" />";
            document.getElementById("n").addEventListener("blur",function(e){
                text.innerHTML=document.getElementById("n").value;
var timer = setInterval(count, 1000);
function count() {
    for(let i=0;i<document.getElementsByClassName("timer").length;i++){