Javascript для итераций цикла в буфере обмена с методом добавления - PullRequest
0 голосов
/ 18 декабря 2018

Когда я создаю новые элементы div с помощью метода append, что-то в моем цикле вызывает вставку добавочных итераций содержимого буфера обмена в элемент .editable.

Нажмите здесь Нажмите кнопку «Создать новый div» 4 или 5 раз и вставьте в поля и увидите проблему.

Фрагмент стека:

$("button").click(function () {
        $(".body").append("<div class=\"editable\" style=\"border:1px solid red\" contenteditable></div><br />")
        myFunction();
    })

    $(".editable").on("paste", function() {
        myFunction();
    })

    function myFunction() {
            var editors = $(".editable");
        for (var i = 0, l = editors.length; i < l; i++) {
            editors[i].addEventListener("paste", function (e) {
                e.preventDefault();
                var text = e.clipboardData.getData("text/plain");
                document.execCommand("insertHTML", false, text);
            });
        }
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

<div style="color:blue"><span style="font-size:2em">HTML</span></div>

<button>
  Create new div
</button>

<div class="body">

  <div class="editable" style="border:1px solid red" contenteditable></div><br />
  <div class="editable" style="border:1px solid red" contenteditable></div><br />
  
</div>

1 Ответ

0 голосов
/ 18 декабря 2018

Как это выглядит для вас?

// When something has been pasted to an editable element. 
const onPaste = (e) => {
  e.preventDefault();
  const text = e.clipboardData.getData("text/plain");
  document.execCommand("insertHTML", false, text);
};


// Add some new editable element to the DOM.
const buttonClickHandler = () =>  {
  const template = "<div class=\"editable\" " + 
    " style=\"border:1px solid red\" contenteditable></div><br/>";
  $(".body").append(template);
  onAppend();
};


// Simply iterate over an array and add a past event listener.
const manager = a => a.forEach(i => i.addEventListener("paste", e => onPaste(e)));


// Fire this method when a new editable item has been added to the DOM.
const onAppend = () => {
  const list = document.querySelectorAll(".editable");
  manager([list[list.length - 1]]);
};


// On load. 
$(document).ready(() => {
  $("button").click(buttonClickHandler);
  manager(document.querySelectorAll(".editable"));
});
div[contenteditable] {
  height: 50px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div style="color:blue"><span style="font-size:2em">HTML</span></div>

<button>
  Create new div
</button>

<div class="body">

  <div class="editable" style="border:1px solid red" contenteditable></div><br />
  <div class="editable" style="border:1px solid red" contenteditable></div><br />

</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...