Tôi đang cố gắng tạo nội dung có thể chỉnh sửa chỉ chấp nhận văn bản thuần túy.Có thể chỉnh sửa nội dung chỉ cho phép văn bản thuần túy
Điều tôi muốn là lắng nghe để dán sự kiện và sau đó xóa tất cả html và dán nó trên nội dung có thể chỉnh sửa chỉ dưới dạng văn bản thuần túy.
Để làm điều đó, tôi đã thử hai cách tiếp cận khác nhau, câu trả lời dựa trên các câu hỏi tương tự, nhưng hai cách tiếp cận đó có vấn đề.
Đầu tiên: một này không được sử dụng "dán" người nghe, được thay vì lắng nghe các đầu vào (không lý tưởng cho trường hợp này), đây là một giải pháp để tránh sử dụng Clipboard API.
Vấn đề: này hoạt động tốt trên chrome nhưng không phải trên firefox và IE, khi bạn sao chép và dán html nó thành công loại bỏ html và chỉ dán văn bản, nhưng khi tiếp tục viết văn bản, caret luôn lấy vào đầu của contenteditable.
function convertToPlaintext() {
var textContent = this.textContent;
this.textContent = textContent;
}
var contentEditableNodes = document.querySelectorAll('.plaintext[contenteditable]');
[].forEach.call(contentEditableNodes, function(div) {
div.addEventListener("input", convertToPlaintext, false);
});
Bạn có thể thử nó ở đây/code trên mà tôi dựa trên:http://jsbin.com/moruseqeha/edit?html,css,js,output
Thứ hai: Kể từ khi là người đầu tiên đã thất bại và không được nghe "dán" sự kiện duy nhất, tôi sau đó đã quyết định dùng thử bằng cách sử dụng Clipboard API. Vấn đề ở đây là trên IE document.execCommand ("insertHTML", false, text); dường như không hoạt động. Hoạt động trên chrome, firefox (thử nghiệm trên v41 và v42) và cạnh.
document.querySelector(".plaintext[contenteditable]").addEventListener("paste", function(e) {
e.preventDefault();
var text = "";
if (e.clipboardData && e.clipboardData.getData) {
text = e.clipboardData.getData("text/plain");
} else if (window.clipboardData && window.clipboardData.getData) {
text = window.clipboardData.getData("Text");
}
document.execCommand("insertHTML", false, text);
});
Bạn có thể thử nó ở đây: http://jsfiddle.net/marinagon/461uye5p/
bất cứ ai có thể giúp tôi tìm một giải pháp cho một số vấn đề này hoặc bất cứ ai có một giải pháp tốt hơn so với những trình bày ở đây?
Tôi biết rằng tôi có thể sử dụng văn bản, nhưng tôi có lý do để không sử dụng nó.
Update - Giải pháp phát hiện
Tôi tìm thấy một giải pháp cho cách tiếp cận thứ hai. Kể từ document.execCommand ("insertHTML", false, text); không hoạt động trên IE Tôi đã tìm kiếm một giải pháp khác và tìm thấy số này https://stackoverflow.com/a/2925633/4631604.
Ở đây bạn có thể thấy cách tiếp cận thứ hai với giải pháp làm việc tốt trên mọi trình duyệt http://jsfiddle.net/marinagon/1v63t05q/
Tôi đã sử dụng phương pháp thứ 2 của bạn. (Tôi khuyên bạn nên tự trả lời và đánh dấu đúng). Tôi cần một thay đổi, đó cũng là để kiểm tra 'else if (ev.originalEvent.clipboardData ...' khi 'ev.clipboardData' chưa được đặt. –
Giải pháp tốt! Hãy nhớ rằng, thông qua kéo và thả bạn vẫn có thể thêm nội dung HTML vào khu vực của bạn – Markus
Vì mục đích của tôi, chỉ cần vô hiệu hóa thao tác kéo và thả là tốt. API cho điều đó là không hợp lý, nhưng bạn có thể làm như sau: 'function blockDragDrop (ev) {ev.dataTransfer.effectAllowed = 'none'; ev.dataTransfer.dropEffect = 'none'; ev.preventDefault(); trả về false;} el.addEventListener ('dragstart', blockDragDrop); el.addEventListener ('dragover', blockDragDrop); ' (Don Đừng quên cung cấp để loại bỏ các sự kiện nếu bạn cần) –