Как фильтровать текстовое содержимое при операции копирования / вставки в редактируемом компоненте (vue) - PullRequest
0 голосов
/ 22 февраля 2019

Я реализовал компонент, который использует contenteditable = "true", чтобы получить возможность редактировать содержимое этого div (например, текстовое поле).

Следуйте фрагменту из моего кода:

export default {
  name: 'divArea',
  props: ['value'],
  mounted() {
    this.$el.innerHTML = this.value;
  },
  methods: {
    updateHTML(e) {
      const html = e.target.innerHTML;
      this.$emit('input', html);
    },
  },
}
<template>
  <div contenteditable="true"
    v-once
    v-html="value"
    @input="updateHTML"
    @paste="onPaste"
    class="txtArea"></div>
</template>

Я пытаюсь реализовать функцию вставки в этой области, чтобы скопировать блок содержимого со страницы html, но после этого я хотел бы иметь только текстовую версиюоперация вставки (без html).

В настоящее время я использую атрибут v-html с пропеллером в своем компоненте, потому что мне нужно добавить пользовательский тег html в вставляемый текст, но только если пользователь нажимает кнопку.

Как я могу реализовать это поведение?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Первый contenteditable настоящий Дьявол , и я рекомендую не использовать его, но в любом случае это было мое решение

        let contenteditable = document.querySelector('[contenteditable]')
        contenteditable.addEventListener('paste', function(e){           
            // Prevent the default pasting event and stop bubbling            
            e.preventDefault()
            e.stopPropagation()
            // Get the clipboard data
            let paste = (e.clipboardData || window.clipboardData).getData('text/plain')

            // Do something with paste like remove non-UTF-8 characters            
            paste = paste.replace(/\x0D/gi, "\n")          
            e.target.textContent += paste
        })

вторая часть, если вы хотите добавить пасту гдеcursor было

  instead of 
            e.target.textContent += paste

, которое вы можете использовать Selection()

       // Find the cursor location or highlighted area
        const selection = window.getSelection()
        // Cancel the paste operation if the cursor or highlighted area isn't found
        // if (!selection.rangeCount) return false
        // Paste the modified clipboard content where it was intended to go            
        if(selection.getRangeAt(0).collapsed){
            // TextareaManager.AddToCursor(document.createTextNode(paste))
            if(selection.getRangeAt(0).endContainer.nodeName != "DIV"){
                selection.getRangeAt(0).insertNode(document.createTextNode(paste))
            }else {
                e.target.childNodes[0].textContent += paste
            }
            selection.getRangeAt(0).collapse(false)
        }else {
           e.target.appendChild(document.createTextNode(paste))
        }
0 голосов
/ 22 февраля 2019

, но я хотел бы иметь только текстовую версию после операции вставки (без HTML).

Вы можете создать элемент DOM или использовать DOMParser() для установки value из <textarea> и получите .textContent элемента.

const textarea = document.querySelector("textarea");
let parser = new DOMParser();
let parsedHTML = parser.parseFromString(textarea.value, "text/html");
console.log(parsedHTML.body.textContent);
<textarea style="width:240px;height:50px;">
  <div>a<span>b</span><b>c</b></div>
</textarea>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...