El selector de color permanece abierto si el clic ocurre en el lienzo
Pregunta
Hola @artf, espero que estés bien.
Estoy viendo algunos problemas con el selector de color: si uno está abierto y después se hace un clic en el lienzo, el selector de color no se cierra aunque la opción clickoutFiresChange del plugin esté configurada como true, esto es porque la propagación del evento la toma el iframe del lienzo y no se pasa a través de ella.
La única solución que he encontrado es añadir un evento secundario que pueda captar el clic en el lienzo, que ahora mismo estoy usando
componente:selected
Pero estoy pensando en una solución mejor. Aquí está mi propuesta:
getColorEl() {
if (!this.colorEl) {
const self = esto;
const ppfx = this.ppfx;
var model = this.model;
var em = this.em;
var colorEl = $('<div class="${this.ppfx}field-color-picker"></div>');
var cpStyle = colorEl.get(0).style;
var elToAppend = this.em && this.em.config ? this.em.config.el : '';
var colorPickerConfig =
(this.em && this.em.getConfig && this.em.getConfig('colorPicker')) ||
{};
const getColor = color => {
Sea cl =
color.getAlpha() == 1 ? color.toHexString() : color.toRgbString();
return cl.replace(/ /g, '');
};
Sea cambiado = 0;
sea previousColor;
this.$el.find('[data-colorp-c]').append(colorEl);
colorEl.spectrum({
containerClassName: '${ppfx}one-bg ${ppfx}two-color',
appendTo: elToAppend || 'cuerpo',
maxSelectionSize: 8,
mostrarPaleta: cierto,
mostrarAlpha: cierto,
chooseText: 'Vale',
cancelTexto: '⨯',
Paleta: [],
Config expandida aquí para que las funciones siguientes no sean sobrescritos
... colorPickerConfig,
mover(color) {
const cl = getColor(color);
cpStyle.backgroundColor = cl;
model.setValueFromInput(cl, 0);
},
cambiar(color) {
cambiado = 1;
const cl = getColor(color);
cpStyle.backgroundColor = cl;
model.setValueFromInput(cl);
auto.ningunoColor = 0;
},
mostrar(color) {
cambiado = 0;
previousColor = getColor(color);
},
hide(color) {
if (!changed && previousColor) {
if (self.noneColor) {
previousColor = '';
}
cpStyle.backgroundColor = previousColor;
colorEl.spectrum('set', previousColor);
model.setValueFromInput(previousColor, 0);
}
}
});
Evento añadido
si (em) {
em.on('component:selected', () => {
cambiado = 1;
colorEl.spectrum('ocultar');
});
}
// ++++++++++///
this.colorEl = colorEl;
}
return this.colorEl;
},
Intentaba añadir esta acción dentro de las llamadas de los selectores, pero no pude y no conseguí el contexto adecuado para hacerlo.
¿Qué opinas? ¿Debería probar algo diferente o puedo enviar una solicitud de tirada?
Muchas gracias por esta excelente biblioteca, estoy aprendiendo mucho profundizando en el código fuente.
Un cordial saludo,
Juan.
Respuestas (2)
La imagen pública sería genial 👍
@artf @jcamejo alguna novedad al respecto?
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #2850
[PREGUNTA] Añadir un desplegable para bloquear usando Rasgos
Hola @artf, Espero que estés bien, Me preguntaba si podríais ayudarme con algún problema sencillo que estoy teniendo (recientemente he empe...
Issue #1719
Evento mientras haces clic en la imagen desde el modal del recurso
Hola @artf, Espero que estés bien. Estoy trabajando en gestión de activos. Tengo un total de 5 imágenes como imagen predeterminada del gest...
Issue #1662
Cómo podemos reinicializar el editor
Hola @artf, Espero que estés bien. Cómo podemos reinicializar el editor con datos json. Queremos reinicializar el editor con algunos de los...
Issue #1748
Cómo evitar que los elementos arrastren dentro del editor
Hola @artf Lo estás haciendo muy bien con grapesjs y es extremadamente útil hacer que nuestra funcionalidad sea más fácil de usar. Gracias...
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.