Problema raro con arrastrar y soltar internos - Contenido soltado === "null"
Gracias por el informe @arachnosoft Por cierto, puedo reproducirlo, pero solo cuando se active la primera instancia de CKEditor, ¿puedes confirmarlo?
Lee la respuesta completa abajo ↓Pregunta
Hola @artf,
Me estoy enfrentando a un problema muy extraño relacionado con el arrastrar y soltar en HTML5.
Cuando selecciono algunos contenidos mixtos dentro de grapesjs, incluyendo contenido de texto editable y los componentes circundantes como una selección completa con el ratón, el contenido eliminado (copiado) a veces es "null" (una cadena que contiene el valor de texto "null", no un null de JavaScript).
He conseguido reproducir el problema con la demo del boletín, con Chrome 71.0.3578.98. No sé si pasa con otros navegadores o no...
Cuando surge el problema, he notado que, al capturar el evento canvas:dragdata, la variable result.content es "null" (cadena). He mirado la pila de llamadas y he visto que este valor proviene de la llamada dataTransfer.getData("text/html") en la función principal Droppable.getContentByData() de grapesjs:
'} si no ((0, _underscore.indexOf)(types, 'text/html') >= 0) { content = dataTransfer.getData('text/html').replace(/</?meta[^>]*>/g, '');'
No sé por qué, ni en qué circunstancias el navegador envía "null" mientras busca datos en formato texto/html. Todos los demás formatos parecen tener un valor correcto. Verás que uso el plugin CKEditor, por eso tengo algunos "formatos" adicionales relacionados con CKEditor en dataTransfer:
¿Podrías comprobar si puedes reproducir esto por tu cuenta y si puedes hacer algo para manejar este caso dentro de grapesjs? (suponiendo que pueda ser un error relacionado con el navegador).
Mientras tanto, gestioné esto por mi cuenta eligiendo el valor de dataTransfer.getData("text/plain") cuando era posible, y devolviendo el contenido vacío de lo contrario:
'''js
myGrapesJsObject.on('canvas:dragdata', function (dataTransfer, result) {
si (resultado && resultado.contenido) {
if (typeof (result.content) == "string" && result.content === "null" && dataTransfer.getData("text/html") === result.content) {
resultado.contenido = "";
if (dataTransfer.types && dataTransfer.types.length > 0) {
for (var i = 0; i < dataTransfer.types.length; i++) {
if (dataTransfer.types[i] == "texto/plano") {
var altValue = dataTransfer.getData(dataTransfer.types[i]);
si (altValue && altValue != "") {
result.content = altValue;
pausa;
}
}
}
}
}
}
}
Como dato adicional, a veces he visto que el objeto dataTransfer lleva algunos contenidos "antiguos" que se han dejado caer de arrastres anteriores, y no lo más reciente. Pero hasta ahora no he podido encontrar cuándo ni por qué, así que no te molestaré con esto por ahora (a menos que sea un problema conocido y necesites más información sobre este asunto en particular).
¡Gracias por vuestras opiniones!
Respuestas (3)
Gracias por el informe @arachnosoft Por cierto, puedo reproducirlo, pero solo cuando se active la primera instancia de CKEditor, ¿puedes confirmarlo?
Sí, @artf, parece ser el caso exacto de prueba...
Si actualizo la página para obtener un contexto limpio, vacío el lienzo, suelto un componente de Grid (bastante complejo), selecciono parte de su texto y celdas circundantes SIN activar CKEditor, y lo arrastro/suelto desde el texto, funciona correctamente.
Pero en cuanto hago doble clic en una celda para activar CKEditor, hago clic en otro sitio para desactivar la edición y sigo exactamente los mismos pasos que antes (haciendo exactamente la misma selección y arrastrar/soltar), el contenido dejado cae "nulo".
Y, a menos que actualice la página para eliminar todas las instancias de CKEditor en el DOM, el problema sigue siendo, incluso si vacio primero el lienzo:
Me alegro de que también lo hayas reproducido, porque fue bastante complicado descubrir qué estaba fallando.
He notado que se crea una nueva instancia de CKEditor en el DOM cada vez que se edita un nuevo componente, aunque el plugin CKEditor usa el método inline() de CKEditor. No sé si esto es "intencionado" o si podría explicar ese tipo de problema.
noté que cada vez que se edita un nuevo componente de CKEditor se crea una nueva instancia de CKEditor, aunque el plugin de CKEditor usa el método inline() de CKEditor. No sé si esto es "intencionado" o si podría explicar ese tipo de problema.
Sí, así es como funcionan sus plugins en línea, pero no creo que esto tenga nada que ver con ello
Por cierto, definitivamente CKEditor añade su tipo al objeto dataTransfer y edita, por alguna razón (probablemente para manejar algunos de sus casos límite), el 'texto/plano' (GrapesJS depende completamente de objetos nativos sin tocarlos).
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #1618
¿Los componentes hijos no se rastrean en los modelos?
Hola, estoy enfrentando un problema extraño y necesito vuestra ayuda. cuando muevo componentes dentro de bloques, en el modelo de vista los...
Issue #3713
Los componentes almacenados con script no pueden renderizarse correctamente
Estoy teniendo algún problema cuando intento guardar algunos componentes, incluyendo algunos scripts, y recargar la página, los componentes...
Issue #2961
BUG: Los componentes en modal personalizado no son editables
Hola, estoy intentando añadir un bloque modal personalizado a mi proyecto y quiero cambiar el contenido de este modal también con arrastrar...
Issue #3329
¿Cómo debería recibir modificaciones de rasgos personalizados en el script?
Hola, @artf, este es un marco estupendo, muchas gracias. Ahora lo estoy usando para crear componentes del framework móvil de BUI y me encon...
Plugins de pago que cumplen con este problema
Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.
Cargando recomendaciones de plugins de pago...
Consulta los plugins de código abierto de GrapesJS en GitHub O haz una búsqueda rápida en nuestro catálogo gratuito.
Explora plugins gratuitos →Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.
Explora plugins premium →Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.