Tengo un editor básico basado en execCommand
seguir el ejemplo presentado aquí. Hay tres formas de pegar texto dentro del execCommand
área:
- Ctrl+V
- Clic derecho -> Pegar
- Clic derecho -> Pegar como texto sin formato
Quiero permitir pegar solo texto sin formato sin ningún marcado HTML. ¿Cómo puedo forzar las dos primeras acciones para pegar texto sin formato?
Posible solución: La forma en que puedo pensar es configurar el oyente para los eventos de activación para ( Ctrl+ V) y eliminar las etiquetas HTML antes de pegar.
- ¿Es la mejor solución?
- ¿Es a prueba de balas para evitar cualquier marcado HTML en la pasta?
- ¿Cómo agregar oyente al clic derecho -> Pegar?
javascript
html
dom-events
execcommand
Googlebot
fuente
fuente
Respuestas:
Interceptará el
paste
evento, cancelarápaste
e insertará manualmente la representación de texto del portapapeles:http://jsfiddle.net/HBEzc/ . Este debería ser el más confiable:
Sin embargo, no estoy seguro de la compatibilidad con varios navegadores.
fuente
text
contiene HTML (por ejemplo, si copia código HTML como texto sin formato), lo pegará como HTML. Aquí hay una solución, pero no es muy bonita: jsfiddle.net/HBEzc/3 .var text = (event.originalEvent || event).clipboardData.getData('text/plain');
proporciona un poco más de compatibilidad entre navegadores<div></div>
el contenido se agregará como un elemento secundario del elemento contenteditable. Lo arreglé así:document.execCommand("insertText", false, text);
insertHTML
yinsertText
no trabajo en IE11, sin embargo,document.execCommand('paste', false, text);
funciona bien. Aunque eso no parece funcionar en otros navegadores> _>.No pude obtener la respuesta aceptada aquí para que funcione en IE, así que busqué un poco y encontré esta respuesta que funciona en IE11 y las últimas versiones de Chrome y Firefox.
fuente
Una solución cercana como pimvdb. Pero funciona con FF, Chrome e IE 9:
fuente
content
asignación de variables de cortocircuito . Descubrí que el uso degetData('Text')
varios navegadores funciona, por lo que podría hacer esa asignación solo una vez como esta:var content = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
Entonces solo tendría que usar la lógica para el comando pegar / insertar entre navegadores.document.selection.createRange().pasteHTML(content)
... solo probé en IE11 y no funciona así.document.execCommand('insertText', false, content)
no funciona a partir de IE11 y Edge. Además, las últimas versiones de Chrome ahora son compatiblesdocument.execCommand('paste', false, content)
, lo que es más simple. Podrían estar desaprobandoinsertText
.Por supuesto, la pregunta ya está respondida y el tema es muy antiguo, pero quiero brindar mi solución, ya que es simple y limpio:
Esto está dentro de mi paste-event en mi contenteditable-div.
La otra parte es de otra publicación SO que ya no pude encontrar ...
ACTUALIZACIÓN 19.11.2014: El otro SO-post
fuente
Ninguna de las respuestas publicadas parece funcionar en todos los navegadores o la solución es demasiado complicada:
insertText
no es compatible con IEpaste
comando da como resultado un error de desbordamiento de pila en IE11Lo que funcionó para mí (IE11, Edge, Chrome y FF) es lo siguiente:
Tenga en cuenta que el controlador de pegado personalizado solo es necesario / funciona para los
contenteditable
nodos. Como tanto los campostextarea
simples como losinput
campos sin formato no permiten pegar contenido HTML en absoluto, no es necesario hacer nada aquí.fuente
.originalEvent
controlador de eventos (línea 3) para que esto funcione. Por lo que las miradas línea completa de esta manera:const text = ev.clipboardData ? ev.clipboardData.getData('text/plain') : window.clipboardData.getData('Text');
. Funciona en los últimos Chrome, Safari, Firefox.Firefox no le permite acceder a los datos del portapapeles, por lo que deberá realizar un "truco" para que funcione. No he podido encontrar una solución completa, sin embargo, puede solucionarlo para las pastas ctrl + v creando un área de texto y pegándola en su lugar:
fuente
También estaba trabajando en una pasta de texto sin formato y comencé a odiar todos los errores execCommand y getData, así que decidí hacerlo de la manera clásica y funciona como un encanto:
El código con mis notaciones se puede encontrar aquí: http://www.albertmartin.de/blog/code.php/20/plain-text-paste-with-javascript
fuente
El código anterior funciona para mí en IE10 e IE11 y ahora también funciona en Chrome y Safari. No probado en Firefox.
fuente
En IE11, execCommand no funciona bien. Yo uso el siguiente código para IE11
<div class="wmd-input" id="wmd-input-md" contenteditable=true>
es mi caja div.Leo los datos del portapapeles de window.clipboardData y modifico el textContent de div y le doy un intercalado.
Doy un tiempo de espera para establecer un símbolo de intercalación, porque si no establezco un tiempo de espera, un símbolo de intercalación va al final de div.
y debe leer clipboardData en IE11 de la siguiente manera. Si no lo hace, el carácter de nueva línea no se maneja correctamente, por lo que el símbolo de intercalación sale mal.
Probado en IE11 y Chrome. Puede que no funcione en IE9
fuente
Después de buscar y probar, he encontrado de alguna manera una solución óptima
fuente
Bien, ya que todo el mundo está tratando de trabajar con los datos del portapapeles, verificando el evento de pulsación de tecla y usando execCommand.
Pensé en esto
CÓDIGO
fuente