javascript - contenteditable 中的嵌套列表

标签 javascript html css contenteditable nested-lists

我目前正在尝试在树层次结构中自动创建元素符号点,当您按 Tab 键时,您将转到要点的子点。

它类似于 Microsoft Word 中的大纲。但是,我正在努力根据下面的代码目前应该采取什么方法,我只能创建一个点列表,但我希望能够缩进一些点,它们会随着元素符号向右移动点。

function list() {
  let ul = document.getElementById("ul");
  let li = document.createElement("li");
  ul.appendChild(li);
}
<div id="ul" contenteditable="true" class="editor" draggable="true" onfocus="list()" style="font-weight:normal;">
</div>

最佳答案

如果我没猜错,你只需要在父 ul 上设置一个填充,这很有趣,它们已经设置好了,如果你想进一步缩进它,你可以添加更多的填充,但是从你的示例不够清楚,您没有为 li 设置 innerHtml 或 innerText,另一方面,如果您想聚焦 div,您可能应该设置 tabindex

编辑:我之前没有发现你使用的是 id 为 ul 的 div,你仍然可以添加一个内部子 li,但这没有多大意义,如果你仍然决定这样做,你可以将每个 li 子级设置为具有相同的剩余边距,并将 before 属性设置为具有 '*'

编辑 2:

初始标记:

<div class="outline-editor">
  <button>+ Add child</button>
  <input type="text" name="content" id="add-text" />
  <ul>
    Items go here:
  </ul>
</div>

<script>
  const button = document.querySelector('button')
  const input = document.querySelector('input')
  const ul = document.querySelector('ul')

  function addChild(li) {
    let ul = li.querySelector('ul');
    if (!ul) {
      ul = document.createElement('ul')
      li.appendChild(ul)
    }

    let childLi = document.createElement('li')
    let childButton = document.createElement('button')
    childButton.innerText = '+ Add child'

    let childSpan = document.createElement('span')
    childSpan.innerText = input.value;
    childButton.addEventListener('click', () => {
      addChild(childLi)
    })
    childLi.style.marginLeft = '15px'
    childLi.appendChild(childSpan)
    childLi.appendChild(childButton)
    ul.appendChild(childLi)
  }

  function handleClick(e) {
    let li = document.createElement('li')
    let childButton = document.createElement('button')
    childButton.innerText = '+ Add child'

    let childSpan = document.createElement('span')
    childSpan.innerText = input.value;
    childButton.addEventListener('click', () => {
      addChild(li)
    })
    li.style.marginLeft = '15px'
    li.appendChild(childSpan)
    li.appendChild(childButton)
    ul.appendChild(li)
  }

  button.addEventListener('click', handleClick)
</script>

你可以在codepen上查看行为:

https://codepen.io/jenaro94/pen/RwNwyBr

当然,您可以进一步设置每个 li 元素的样式,并且您可能应该使用模态来检查用户作为 child 为每个 li 写的内容。

编辑 3:

好的,这是我最后一次也是最后一次编辑,希望这对你有用。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <style>
  .outline-editor {
    margin: 100px auto;
  }

  ul {
    position: relative;
  }

  button {
    border: 1px solid black;
  }

  input {
    border: none;
  }
</style>

<div class="outline-editor">
  <ul id="top-level">
    Items go here:

    <li>
      <input type="text" name="content" id="add-text" />
    </li>
  </ul>
</div>

<script>
  const input = document.querySelector('#add-text')
  const ul = document.querySelector('#top-level')

  function addChild(li) {
    let ul = li.tagName === 'UL' ? li : li.querySelector('ul')
    if (!ul) {
      ul = document.createElement('ul')
      li.appendChild(ul)
    }

    let childLi = document.createElement('li')

    let text = document.createElement('input')
    text.type = 'text'
    text.rows = 1
    text.cols = 10
    text.focus()
    text.addEventListener('keydown', e => {
      e.preventDefault()
      if (e.keyCode === 9) {
        addChild(childLi)
      } else if (e.keyCode === 13) {
        addChild(li)
      }
    })
    childLi.appendChild(text)
    ul.appendChild(childLi)
  }

  function handleKeyDown(e) {
    e.preventDefault();
    e.stopPropagation();
    let li = document.createElement('li')
    if (e.keyCode === 9) {
      addChild(this.parentElement)
    } else if (e.keyCode === 13) {
      addChild(this.parentElement.parentElement)
    }
  }

  input.addEventListener('keydown', handleKeyDown)
</script>
  </body>
</html>

关于javascript - contenteditable 中的嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59145566/

相关文章:

javascript - 如何在 execCommand formatBlock 'p' 标签中添加 class 或 id 或 CSS 样式?

javascript - 如何临时设置所有元素的 tabindex 属性并能够将所有元素重置为其原始 tabindex?

html - 将 Accordion 菜单默认设置为显示内容而不是将其隐藏在 Liquid 中

javascript - 隐藏初始 3d 变换动画

javascript - 使用 jQuery 在单击按钮时在输入中插入 <p> 元素

javascript - 使用 document.createElement 创建 html 元素时更改其在父标记中的位置

javascript - 将选项视为选择下拉列表上的单击事件

javascript - 警告框关闭后如何将按钮的文本更改为 "No Sign Ups!"?

javascript - 页面完全加载时 Dart 中的回调

javascript - Vercel next.js 环境变量不起作用