Mam podstawowy edytor oparty na execCommand
przedstawionym tu przykładzie. Istnieją trzy sposoby wklejenia tekstu w tym execCommand
obszarze:
- Ctrl+V
- Kliknij prawym przyciskiem myszy -> Wklej
- Kliknij prawym przyciskiem myszy -> Wklej jako zwykły tekst
Chcę zezwolić na wklejanie tylko zwykłego tekstu bez żadnych znaczników HTML. Jak zmusić pierwsze dwie akcje do wklejenia zwykłego tekstu?
Możliwe rozwiązanie: przychodzi mi do głowy sposób, w jaki mogę ustawić nasłuchiwanie zdarzeń keyup dla ( Ctrl+ V) i usunąć znaczniki HTML przed wklejeniem.
- Czy to najlepsze rozwiązanie?
- Czy unikanie jakichkolwiek znaczników HTML w wklejaniu jest kuloodporne?
- Jak dodać odbiornik do Kliknij prawym przyciskiem -> Wklej?
javascript
html
dom-events
execcommand
Googlebot
źródło
źródło
Odpowiedzi:
Przechwyci
paste
zdarzenie, anulujepaste
i ręcznie wstawi tekstową reprezentację schowka:http://jsfiddle.net/HBEzc/ . To powinno być najbardziej niezawodne:
Nie jestem jednak pewien, czy obsługują różne przeglądarki.
źródło
text
zawiera HTML (np. Jeśli skopiujesz kod HTML jako zwykły tekst), w rzeczywistości wklei go jako HTML. Oto rozwiązanie tego problemu, ale nie jest zbyt ładne: jsfiddle.net/HBEzc/3 .var text = (event.originalEvent || event).clipboardData.getData('text/plain');
zapewnia nieco większą kompatybilność z<div></div>
, treść zostanie dodana jako element potomny elementu contenteditable. Naprawiłem to w ten sposób:document.execCommand("insertText", false, text);
insertHTML
iinsertText
nie działa w IE11, jednakdocument.execCommand('paste', false, text);
działa dobrze. Chociaż to wydaje się nie działać w innych przeglądarkach> _>.Nie mogłem uzyskać zaakceptowanej odpowiedzi tutaj, aby pracować w IE, więc trochę rozejrzałem się i doszedłem do tej odpowiedzi, która działa w IE11 i najnowszych wersjach Chrome i Firefox.
źródło
Bliskie rozwiązanie, takie jak pimvdb. Ale działa z FF, Chrome i IE 9:
źródło
content
przypisanie zmiennej zwarciowej . Zauważyłem, że używaniegetData('Text')
działa w różnych przeglądarkach, więc możesz wykonać to przypisanie tylko raz w ten sposób:var content = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
Wtedy będziesz musiał tylko użyć logiki dla polecenia wklej / wstaw w różnych przeglądarkach.document.selection.createRange().pasteHTML(content)
... właśnie przetestowałem na IE11 i tak to nie działa.document.execCommand('insertText', false, content)
nie działa od IE11 i Edge. Ponadto najnowsze wersje Chrome obsługują terazdocument.execCommand('paste', false, content)
, co jest prostsze. Mogą być deprecjonująceinsertText
.Oczywiście na pytanie już udzielono odpowiedzi i temat bardzo stary ale chcę podać swoje rozwiązanie gdyż jest to proste czyściutkie:
To jest w moim zdarzeniu wklejania w moim contenteditable-div.
Druga część pochodzi z innego wpisu SO, którego już nie mogłem znaleźć ...
UPDATE 19.11.2014: Drugi SO-post
źródło
Żadna z opublikowanych odpowiedzi nie wydaje się działać w różnych przeglądarkach lub rozwiązanie jest zbyt skomplikowane:
insertText
nie jest obsługiwane przez IEpaste
polecenia powoduje błąd przepełnienia stosu w IE11To, co zadziałało dla mnie (IE11, Edge, Chrome i FF), to:
Zauważ, że niestandardowy program obsługi wklejania jest potrzebny / działa tylko dla
contenteditable
węzłów. Ponieważ oba polatextarea
i zwykłeinput
pola w ogóle nie obsługują wklejania zawartości HTML, nie trzeba tu nic robić.źródło
.originalEvent
w module obsługi zdarzeń (wiersz 3), aby to zadziałało. Tak kompletne zestawy linię:const text = ev.clipboardData ? ev.clipboardData.getData('text/plain') : window.clipboardData.getData('Text');
. Działa w najnowszych przeglądarkach Chrome, Safari, Firefox.Firefox nie pozwala na dostęp do danych ze schowka, więc musisz zrobić „hack”, aby to zadziałało. Nie udało mi się znaleźć kompletnego rozwiązania, jednak możesz to naprawić dla past ctrl + v, tworząc zamiast tego obszar tekstowy i wklejając do niego:
źródło
Pracowałem też nad zwykłą pastą tekstową i zacząłem nienawidzić wszystkich błędów execCommand i getData, więc postanowiłem zrobić to w klasyczny sposób i działa to jak urok:
Kod z moimi notacjami można znaleźć tutaj: http://www.albertmartin.de/blog/code.php/20/plain-text-paste-with-javascript
źródło
Powyższy kod działa u mnie w IE10 i IE11, a teraz działa również w Chrome i Safari. Nie testowane w przeglądarce Firefox.
źródło
W IE11 execCommand nie działa dobrze. Używam poniższego kodu dla IE11
<div class="wmd-input" id="wmd-input-md" contenteditable=true>
to moja skrzynka div.Czytam dane ze schowka z window.clipboardData i modyfikuję tekst div's textContent i daję daszek.
Daję czas na ustawienie daszka, ponieważ jeśli nie ustawię limitu czasu, daszek przechodzi do końca div.
i powinieneś przeczytać clipboardData w IE11 w poniższy sposób. Jeśli tego nie zrobisz, znak nowej linii nie jest obsługiwany prawidłowo, więc błąd idzie źle.
Testowany na IE11 i Chrome. Może nie działać w IE9
źródło
Po długich poszukiwaniach i próbach znalazłem w jakiś sposób optymalne rozwiązanie
źródło
OK, ponieważ wszyscy próbują obejść dane schowka, sprawdzić zdarzenie keypress i użyć execCommand.
Myślałem o tym
KOD
źródło