【问题标题】:Need to add tags and normal text in same input box需要在同一个输入框中添加标签和普通文本
【发布时间】:2017-08-15 04:19:02
【问题描述】:

我需要在同一个输入框中添加标签和文本。普通文本可以一次删除一个字符。将从预先定义的特定单词集中选择的标签将被一次性删除。普通文本和标签将在同一个框中。

小提琴link的链接 到目前为止,我已经尝试过

document.querySelector('.selectable-icons').addEventListener('click', function(e) {
 
    document.querySelector('[contenteditable]').appendChild(e.target.cloneNode(true));
  
});


document.querySelector('div').addEventListener('keydown', function(event) {
    // Check for a backspace
    if (event.which == 8) {
        s = window.getSelection();
        r = s.getRangeAt(0)
        el = r.startContainer.parentElement
        // Check if the current element is the .label
        if (el.classList.contains('label')) {
            // Check if we are exactly at the end of the .label element
            if (r.startOffset == r.endOffset && r.endOffset == el.textContent.length) {
                // prevent the default delete behavior
                event.preventDefault();
                if (el.classList.contains('highlight')) {
                    // remove the element
                    el.remove();
                } else {
                    el.classList.add('highlight');
                }
                return;
            }
        }
    }
    event.target.querySelectorAll('span.label.highlight').forEach(function(el) { el.classList.remove('highlight');})
});
[contenteditable] {
  border: 1px solid #000;
  margin: 0.4em 0;
  line-height: 1.4em;
  -webkit-appearance: textfield;
  appearance: textfield;
}
img {
  vertical-align: top;
  max-height: 1.4em;
  max-width: 1.4em;
}
.selectable-icons img {
  cursor: pointer;
}

span.label.highlight {
    background: #E1ECF4;
    border: 1px dotted #39739d;
}

span.label  {
    background: #E1ECF4;
    border: 1px dotted #39739d;
}
<p>Just click on an icon to add it.</p>

<div class="custom-input">
  <div class="selectable-icons">
      <span class="label"> Tag </span> 
       <span class="label"> Tag 2 </span> 
      <span class="label">Tag 3</span>  
  </div>
  <div contenteditable="true">
    You can type here. Add an icon.
  </div>
</div>

添加标签,但问题是当点击标签时,它会将其添加到文本框中,当我在该标签之后写文本时,这一切都被添加到相同的标签范围中,并且标签 + 文本全部被删除,而不是我需要文本一次删除一个字符,一次删除所有标签。请提出一个更好的方法来使用 textarea 而不是 div 来实现这一点。

注意:如果我在 span 中更改标签数据,这些数据也是可编辑的。也体现在标签和文字的可编辑div中

【问题讨论】:

    标签: javascript jquery html css contenteditable


    【解决方案1】:

    标签添加到div后,将其contenteditable属性设置为false

    el.setAttribute('contenteditable', false);
    

    希望能解决您的问题 - 请参阅下面的演示:

    document.querySelector('.selectable-icons').addEventListener('click', function(e) {
      var el = e.target.cloneNode(true);
      el.setAttribute('contenteditable', false);
      document.querySelector('[contenteditable]').appendChild(el);
    
    });
    
    
    document.querySelector('div').addEventListener('keydown', function(event) {
      // Check for a backspace
      if (event.which == 8) {
        s = window.getSelection();
        r = s.getRangeAt(0)
        el = r.startContainer.parentElement
        // Check if the current element is the .label
        if (el.classList.contains('label')) {
          // Check if we are exactly at the end of the .label element
          if (r.startOffset == r.endOffset && r.endOffset == el.textContent.length) {
            // prevent the default delete behavior
            event.preventDefault();
            if (el.classList.contains('highlight')) {
              // remove the element
              el.remove();
            } else {
              el.classList.add('highlight');
            }
            return;
          }
        }
      }
      event.target.querySelectorAll('span.label.highlight').forEach(function(el) {
        el.classList.remove('highlight');
      })
    });
    [contenteditable] {
      border: 1px solid #000;
      margin: 0.4em 0;
      line-height: 1.4em;
      -webkit-appearance: textfield;
      appearance: textfield;
    }
    
    img {
      vertical-align: top;
      max-height: 1.4em;
      max-width: 1.4em;
    }
    
    .selectable-icons img {
      cursor: pointer;
    }
    
    span.label.highlight {
      background: #E1ECF4;
      border: 1px dotted #39739d;
    }
    
    span.label {
      background: #E1ECF4;
      border: 1px dotted #39739d;
    }
    <p>Just click on an icon to add it.</p>
    
    <div class="custom-input">
      <div class="selectable-icons">
        <span class="label"> Tag </span>
        <span class="label"> Tag 2 </span>
        <span class="label">Tag 3</span>
      </div>
      <div contenteditable="true">
        You can type here. Add an icon.
      </div>
    </div>

    【讨论】:

    • 效果很好。请提出一种我可以使用可编辑文本区域而不是 div @kukkuz 的方法
    • 没问题。如果我更改标签数据反映在可编辑的 div 上,您能否添加一个功能
    • 更改标签的文本没有反映在可编辑的 div 中?好吧,我想这可能是另一个 SO 问题,如果你坚持的话:)
    • 添加了一个[链接](stackoverflow.com/questions/45692016/…)
    猜你喜欢
    • 2015-09-23
    • 2015-12-02
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2015-08-10
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多