You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为insertAdjacentHTML创建的li元素添加类?附代码示例

问题描述

我想用insertAdjacentHTML创建li元素,但不知道怎么根据todo.complete状态修改li的类名和按钮文本——之前用append的方式能实现,但换成insertAdjacentHTML后就卡壳了。相关代码如下:

function todosGenerator(todosList) {
todoListElem.innerHTML = ''

    // let newTodoLiElem, newTodoLabalElem, newTodoCompleteBtn, newTodoDeleteBtn


    todosList.forEach(function (todo) {
    //     console.log(todo);
    //     newTodoLiElem = $.createElement('li')
    //     newTodoLiElem.className = 'completed well'

    //     newTodoLabalElem = $.createElement('label')
    //     newTodoLabalElem.innerHTML = todo.title

    //     newTodoCompleteBtn = $.createElement('button')
    //     newTodoCompleteBtn.className = 'btn btn-success'
    //     newTodoCompleteBtn.innerHTML = 'Complete'
    //     newTodoCompleteBtn.setAttribute('onclick', 'editTodo(' + todo.id + ')')

    //     newTodoDeleteBtn = $.createElement('button')
    //     newTodoDeleteBtn.className = 'btn btn-danger'
    //     newTodoDeleteBtn.innerHTML = 'Delete'
    //     newTodoDeleteBtn.setAttribute('onclick', 'removeTodo(' + todo.id + ')')

        // if (todo.complete) {
        //     newTodoLiElem.className = 'uncompleted well'
        //     newTodoCompleteBtn.innerHTML = 'UnComplete'
        // } // 换成insertAdjacentHTML后不知道怎么写这段逻辑了

        // newTodoLiElem.append(newTodoLabalElem, newTodoCompleteBtn, newTodoDeleteBtn)

        // todoListElem.append(newTodoLiElem)

        todoListElem.insertAdjacentHTML('beforeend','<li class="completed well is"><label>'+todo.title+'</label><button class="btn btn-success" onclick="editTodo('+todo.id+')">Complete</button><button class="btn btn-danger" onclick="removeTodo('+todo.id+')">Delete</button></li>')

    
    })
    
}
解决方案

给你两种可行的处理方式:

方式1:动态拼接HTML字符串(推荐)

直接在拼接HTML的时候,根据todo.complete的值动态生成对应的类名和按钮文本,用ES6模板字符串会比传统字符串拼接更清晰,还能避免转义麻烦:

function todosGenerator(todosList) {
  todoListElem.innerHTML = ''

  todosList.forEach(function (todo) {
    // 根据状态确定类名和按钮文字
    const liClass = todo.complete ? 'uncompleted well' : 'completed well is';
    const completeBtnText = todo.complete ? 'UnComplete' : 'Complete';

    // 用模板字符串拼接HTML,直接插入动态内容
    todoListElem.insertAdjacentHTML('beforeend', `
      <li class="${liClass}">
        <label>${todo.title}</label>
        <button class="btn btn-success" onclick="editTodo(${todo.id})">${completeBtnText}</button>
        <button class="btn btn-danger" onclick="removeTodo(${todo.id})">Delete</button>
      </li>
    `);
  })
}

方式2:插入后再修改元素

如果不想改动现有的字符串拼接逻辑,可以在insertAdjacentHTML插入完成后,获取刚添加的元素再修改:

function todosGenerator(todosList) {
  todoListElem.innerHTML = ''

  todosList.forEach(function (todo) {
    // 先插入基础HTML
    todoListElem.insertAdjacentHTML('beforeend','<li class="completed well is"><label>'+todo.title+'</label><button class="btn btn-success" onclick="editTodo('+todo.id+')">Complete</button><button class="btn btn-danger" onclick="removeTodo('+todo.id+')">Delete</button></li>');
    
    // 获取刚插入的li(因为是beforeend插入,所以最后一个子元素就是它)
    const newLi = todoListElem.lastElementChild;
    // 获取里面的完成按钮
    const completeBtn = newLi.querySelector('.btn-success');

    // 根据状态修改类名和按钮文本
    if (todo.complete) {
      newLi.className = 'uncompleted well';
      completeBtn.textContent = 'UnComplete';
    }
  })
}

两种方式对比:方式1只需要一次DOM操作,性能更优;方式2逻辑拆分更直观,适合不想重构原有字符串的场景。

内容的提问来源于stack exchange,提问作者joyi61

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:10:33