1
resposta

[Dúvida] Gostaria de saber se é possível travar o foco da seleção de um texto web??? (meu texto perde o foco da seleção)

**Oi pessoal, estou implementando uma biblioteca de ColorPicker para um editor de páginas. Estou tentando obter a seleção atual de um texto específico. No entanto, o que acontece é que quando vou mudar o valor da cor em formato hexadecimal ou RGB, ele acaba perdendo o foco da seleção e fica como uma string vazia, não permanecendo selecionado. O que resulta na não troca de cor. **

Estou utilizando o window.getSelection().toString().trim() para selecionar o texto em especifico.

**Gostaria de saber se é possível travar o foco da seleção???. **

Tentei resolver utilizando as seguintes opções: 1- Pegando a div, porém não funcionou, não tem como pegar a posição que o texto se encontra (as divs variam dependendo da posição do bloco) 2- Utilizando a função getSelection. A função getSelection é muito instável, qualquer clique ela acaba perdendo o foco no texto. 3-Armazenando o valor. Não tem como armazenar o valor também pq preciso que o texto esteja selecionado, e mesmo armazenando o valor. Não vai ser mudado o texto. ( precisa da seleção)

Biblioteca utilizada: react-pick-color.

Parte do código da validação:

useEffect(() => {
    const handleSelectionChange = () => {
      const selectedText = window.getSelection().toString().trim();
      if (selectedText != "") {
        setOpenTextProperties(true);
      } else {
        setOpenTextColor(false);
        setOpenHighlighter(false);
        setOpenTextProperties(false);
      }
    };
    document.addEventListener("mouseup", handleSelectionChange);
    document.addEventListener("selectionchange", handleSelectionChange);
    return () => {
      document.removeEventListener("mouseup", handleSelectionChange);
      document.removeEventListener("selectionchange", handleSelectionChange);
    };
  }, []);
1 resposta

Oi Vitória, tudo bem?

Infelizmente, não é possível travar diretamente o foco da seleção usando as APIs padrão do navegador. A seleção de texto é gerenciada pelo próprio navegador e não há uma maneira direta de manter a seleção quando ocorrem alterações no DOM.

Uma possível solução para o seu problema é armazenar a posição inicial e final da seleção antes de alterar a cor e, em seguida, restaurar a seleção após a alteração. Aqui está uma abordagem possível:

  1. Antes de alterar a cor, armazene a posição inicial e final da seleção:
const selection = window.getSelection();
const range = selection.getRangeAt(0);
const startOffset = range.startOffset;
const endOffset = range.endOffset;
  1. Altere a cor conforme necessário.

  2. Restaure a seleção após a alteração:

const updatedSelection = window.getSelection();
const updatedRange = updatedSelection.getRangeAt(0);
updatedRange.setStart(range.startContainer, startOffset);
updatedRange.setEnd(range.endContainer, endOffset);

Essa abordagem armazena as informações da seleção antes de alterar a cor e, em seguida, usa essas informações para restaurar a seleção após a alteração. Dessa forma, você pode manter a seleção do texto mesmo após a mudança de cor.

Lembre-se de adaptar o código acima para se adequar à sua implementação específica.

Um abraço e bons estudos.