The Problem

在HTML中,我的编辑和删除按钮之间有默认间距.但是,当我用具有完全相同的 struct 和类名的JavaScript追加一个新的列表项时,这些按钮之间没有空格.

Desired Behavior个 以使附加的按钮与HTML标记中的"默认"按钮显示相同.

Codepen

HTML

            <ul id="list">
                <li class="item">
                    <div>Milk</div>
                    <button class="edit-button">edit</button>
                    <button class="delete-button">X</button>
                </li>
                <li class="item">
                    <div>Cheerios</div>
                    <button class="edit-button">edit</button>
                    <button class="delete-button">X</button>
                </li>
                <li class="item">
                    <div>Cheese</div>
                    <button class="edit-button">edit</button>
                    <button class="delete-button">X</button>
                </li>  
            </ul>

CSS

.title {
    text-align: center;
}

.main {
    border: 1px solid black;
    width: 50%;
    margin: auto;
}

#add-item {
    border: 1px solid black;
}

.input {
    width: 100%;
    padding: 12px 20px;
    margin: 8px 0;
    display: inline-block;
    border: 1px solid #ccc;
    border-radius: 4px;
    box-sizing: border-box;
}

.label {
    margin: 10px;
}

#list {
    flex-direction: column;
    display: flex;
}

#list > li{
    list-style-type: none;
    margin: 10px auto;
}

#list div {
    margin-bottom: 10px;
    text-align: center;
}

/* #list button {
    margin: 0px 4px;
} */

Javascript

// TODO: Grab the list
const shoppingList = document.getElementById("list")
// TODO: Grab the input field
const titleInput = document.getElementById("title")
// TODO: Grab the buttons.
const submitButton = document.getElementById("submit-item")
// const editButtons = document.querySelectorAll(".edit-button")
// const delButtons = document.querySelectorAll(".delete-button")

// TODO: Add click event to the button.
submitButton.addEventListener('click', (e) => {
    e.preventDefault()
    addItem(titleInput.value)
});

// TODO: Create a function to add item.
    // ! Requirement: Must have:
    // !   - item text
    // !   - edit button
    // !   - delete button
    // !   - input field
    // ! Requirement: Add event listeners to buttons

    // TODO: Edit button must get pass the Parent node.

function addItem(title) {
    console.log("Running addItem")
    let newItem = document.createElement("li")
    newItem.classList.add("item")

    let newTitle = document.createElement("div")
    newTitle.textContent = title

    let editBtn = document.createElement("button")
    editBtn.classList.add("edit-button")
    editBtn.innerText = "edit"

    let delBtn = document.createElement("button")
    delBtn.classList.add("delete-button")
    delBtn.innerText = "X"

    editBtn.addEventListener('click', (e) => {
        console.log("Pressed the edit button", e)
        editItem(e.target.parentElement)
    });

    newItem.appendChild(newTitle)
    newItem.appendChild(editBtn)
    newItem.appendChild(delBtn)
    shoppingList.appendChild(newItem)
}


// TODO: Create a function to edit item.
    // ! Requirement: Parent Node (Element) parameter

    // TODO: Remove the Edit, Delete buttons.
    // TODO: Grab text content of the div and assign to variable.
    // TODO: Add an input element to the parent node.
    // TODO: Set input's value to the variable with the text content.
    // TODO: Add the save button.

function editItem(listItem) {
    let title;
    listItem.childNodes.forEach(element => {
        console.log(element.tagName)
        if(element.tagName === "DIV") {
            title = element.innerText
        }
    });

    listItem.innerHTML = ""

    let editInput = document.createElement("input")
    editInput.value = title

    let saveBtn = document.createElement("button")
    saveBtn.classList.add("save-button")
    saveBtn.innerText = "save"

    listItem.append(editInput, saveBtn)

    saveBtn.addEventListener('click', (e) => {
        saveItem(e.target.parentNode)
    });
}

// TODO: Create a function to save item.
    // ! Requirement: Parent Node (Element) parameter
    // TODO: Get the value of the input field and assign to variable
    // TODO: Remove the input and save button.
    // TODO: Create the div, edit, and delete buttons.
    // TODO: Set the div's text content to the variable with the input's value.
    // TODO: Add all those elements to the parent element.

function saveItem(listItem) {
    let titleEdit;

    listItem.childNodes.forEach(element => {
        if(element.tagName === "INPUT") {
            titleEdit = element.value
        }
    });

    listItem.innerHTML = "";

    let changedTitle = document.createElement("div");
    changedTitle.textContent = titleEdit;

    let editBtn = document.createElement("button");
    editBtn.classList.add("edit-button");
    editBtn.innerText = "edit";

    let delBtn = document.createElement("button");
    delBtn.classList.add("delete-button");
    delBtn.innerText = "X";

    listItem.appendChild(changedTitle);
    listItem.appendChild(editBtn);
    listItem.appendChild(delBtn);
}

// TODO: Create a function to delete item.
    // ! Requirement: Parent Node (Element) paramter
    // I believe you can figure this one out yourself. <3 :) 

What I've Tried

  • 但是,在按钮中添加样式后,附加列表项中的按钮之间的间距仍然减小.(我希望它可能会解决这个问题,如果按钮有样式应用,这将是正确的间距为所有他们.HTML元素有4px的间距,但看起来追加的元素有2px的间距.
  • 已判断多个浏览器以查看浏览器的呈现方式是否不同,但是,间隔错误在所有浏览器中都存在.(我希望在其中一个浏览器中看到正确的版本,以确定这是否是浏览器之间的渲染问题.)
  • 我try 了一个CSS重置,结果是HTML按钮之间的默认间距和附加按钮之间没有间距.(我期待CSS重置以删除按钮之间的所有间距,但它似乎具有codepen中所示的默认效果.
  • 我try 将我的代码放在CodePen环境中,但仍然遇到了同样的问题.(如果我的当地环境出现问题,我预计它会起作用.)
  • 我判断了代码,可能是回车空格/回车,但我什么也没找到.(我预计隐藏的空间可能是原因,移除它会产生预期的结果.)
  • 我甚至问过我的教练,他们也不确定.(他们告诉我,作为一种解决办法,只删除默认的列表项,但我发帖是因为我真的很好奇为什么会发生这种情况.)

StackOverflow Articles I've Looked At (我试着链接这些,但它说这些链接使我的问题看起来像"垃圾邮件"-所以,这里的标题.

为什么初始的CSS样式在DOM元素样式字段中不可见?

这里讨论的是访问样式的css属性与访问完全呈现的css属性之间的问题.这并不真正适用,因为在本例中默认情况下没有任何样式.

缺少样式的隐藏元素

样式不是缺失的,它们是应用的,但是相同的样式在附加的元素之间以不同的方式apply.

在HTML CSS中删除按钮之间的空格

我进行了一次css重置,但问题仍然存在.此外,这是水平间距,而不是垂直间距.

我可以在列表项中使用DIV吗?

判断HTML struct 是否有效,并且根据HTML规范,我可以在li中包含div和其他块级元素.

隐藏的内容无法获得正确的css效果

这个人有一个问题,div被附加在UL元素内部,并导致事情破裂.这不是我的问题

使用缩进间距将元素映射到DOM

这个特别的问题是附加的DIV的HTML struct 格式不正确.我也不会有这个问题.我的HTML struct 在开发工具中似乎完全相同.

在JavaScript中追加元素时出现奇怪错误

此特定问题遇到类型错误.控制台中没有错误.这似乎是一个奇怪的格式化/css错误.

这些文章似乎都不适用于这个特殊的问题.我不确定这是不是一个错误,但考虑到这主要是默认样式,跨浏览器持久存在,即使添加了样式也会持久存在.我不知所措.

推荐答案

您的问题是如何在JavaScript中处理像换行符(\n)这样的空白字符.当你用普通的字符串连接构建按钮时,一个换行符(当你在代码编辑器中按Enter键时)将出现在按钮之间.你假设有一个隐藏的字符是正确的,但它实际上是回车键,你可能没有怀疑-但这就是在HTML中呈现额外间距的原因.

要解决这个问题,您需要使用模板文字-它更干净,而且您不必担心意外的空白.

try 用以下代码替换您的"addItem"代码:

function addItem(title) {
  let newItem = document.createElement("li");
  newItem.classList.add("item");
  newItem.innerHTML = `
    <div>${title}</div>
    <button class="edit-button">edit</button>
    <button class="delete-button">X</button>
  `;
  
  shoppingList.appendChild(newItem);
}

这是你的CodePen with the changes

Javascript相关问答推荐

如何在NightWatch.js测试中允许浏览器权限?

有Angular 的material .未应用收件箱中的价值变化

*ngFor和@代表输入decorator 和选角闭合

我试图实现用户验证的reduxstore 和操作中出了什么问题?

Google图表时间轴—更改hAxis文本 colored颜色

docx.js:如何在客户端使用文档修补程序

Chrome是否忽略WebAuthentication userVerification设置?""

Angular:动画不启动

将自定义排序应用于角形数字数组

Javascript json定制

JS:XML insertBefore插入元素

在HTML语言中调用外部JavaScript文件中的函数

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

通过解构/功能组件接收props-prop验证中缺少错误"

在没有任何悬停或其他触发的情况下连续交换图像

我的NavLink活动类在REACT-ROUTER-V6中出现问题

如何正确地在ComponentWillUnmount中卸载状态以避免内存泄漏?

无法使用Redux异步函数读取未定义的useEffect钩子的属性';map';

将延迟加载的模块转换为Eager 加载的模块

已在EventListener中更新/更改异步的React.js状态对象,但不会导致组件重新呈现