可编辑内容中的嵌套列表

Emre Karayalcin

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

它的含义类似于Microsoft Word中的Outliner。但是,我正在努力从下面的代码中采取当前的方法,我只能创建一个点列表,但是我希望能够缩进其中一些点以及它们与项目符号一起移到右侧的位置点。

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>

杰纳罗·卡尔维尼奥(JenaroCalviño)

如果我做对了,您需要做的是在父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>

您可以检查代码笔上的行为:

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

当然,您可以进一步为每个li元素设置样式,并且您可能应该使用模式检查用户在写给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>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使内容可编辑div中的跨度不可编辑

来自分类Dev

使内容可编辑div中的跨度不可编辑

来自分类Dev

可编辑div中的内容为空

来自分类Dev

使DIV中的内容不可编辑

来自分类Dev

jQuery嵌套可排序列表项可编辑

来自分类Dev

文本编辑器弹出时,内容可编辑光标位置在可编辑div中

来自分类Dev

使用React更新内容可编辑容器中的内容

来自分类Dev

使某些关键字在内容可编辑div中不可编辑

来自分类Dev

如何从angularjs中的可编辑div中获取内容

来自分类Dev

在内容可编辑的div中设置光标位置

来自分类Dev

将尖号放置在可编辑内容的ReactJS组件中

来自分类Dev

如何模糊可编辑内容中的表格单元

来自分类Dev

Chrome似乎忽略了内容可编辑div中的用户选择

来自分类Dev

如何使div中的某些文本内容在点击时可编辑?

来自分类Dev

聆听React.js中可编辑内容的变化

来自分类Dev

在每一行的内容可编辑div中换行

来自分类Dev

使用Webkit在内容可编辑的控件中按Tab

来自分类Dev

如何使div中的某些文本内容在点击时可编辑?

来自分类Dev

完全在内容可编辑div标签中显示文本

来自分类Dev

jQuery在内容可编辑的div中输入粘贴

来自分类Dev

剔除内容可编辑绑定

来自分类Dev

停止可编辑的内容散焦

来自分类Dev

如何使UIWebView内容可编辑?

来自分类Dev

停止可编辑的内容散焦

来自分类Dev

使单个项目在列表控件(C ++,MFC)中可编辑

来自分类Dev

Angular 6 中的内联可编辑对象列表

来自分类Dev

CSS样式的可编辑列表?

来自分类Dev

如何模拟内容可编辑元素上的可编辑点击

来自分类Dev

获取内容可编辑innerHTML的子内容

Related 相关文章

热门标签

归档