Acionando o Evento Sintético no Aplicativo Reagir

9

Estou escrevendo uma extensão do Chrome para o Facebook e desejo ativar programaticamente o envio do rascunho de comentário focado em uma postagem. O comportamento padrão é enviar quando o usuário pressiona a tecla Enter, então estou tentando enganar a interface do Facebook para pensar que o usuário fez isso.

O Facebook usa o React e um contenteditable div para formulários de comentários.

Aqui está um conjunto de coisas que eu tentei:

1) jQuery Event acionando $('<the contenteditable div>').trigger($.Event('keydown', {which: 13}))

  • Experimentei isso tanto no ambiente de script de conteúdo quanto no ambiente de página real (por meio de um script injetado que responde a postMessage e ao console do Chrome)
  • Eu também tentei acionar o evento no document de cada contexto.
  • Nada parece acontecer.

2) A mesma coisa, mas com o acionamento do evento VanillaJS. questão relevante do StackOverflow

  • também de ambos os ambientes
  • Nada acontece

3) Neste ponto eu percebi que isso é React e ele usa seu próprio SyntheticEvents , então eu basicamente copiei / colei o Simulate de ReactTestUtils deve ajudar no teste simulando eventos e executando isso no ambiente da página (pegando referências ao required de objetos através da função require do frontend do Facebook).

  • Também não funciona. A função é executada totalmente e sem erros, mas não há resposta do aplicativo.

Eu tentei isso com a maioria dos keydown eventos, porque ele tem mais ouvintes ligados a ele.

Estou ciente dessas perguntas, mas elas não ajudaram a entender: Force Reage para disparar o evento por meio de JavaScript injetado

    
por Matt Condon 21.08.2015 в 06:56
fonte

1 resposta

2

Não está claro, com base na sua descrição, se isso é ou não um problema, mas SyntheticEvent me causou dor antes, devido ao fato de o objeto ser reutilizado. Há uma observação no Reagir documentos sobre isso:

  

Se você quiser acessar as propriedades do evento de maneira assíncrona, deverá chamar event.persist() no evento, o que removerá o evento sintético do pool e permitirá que referências ao evento sejam mantidas pelo código do usuário.

Se você não estiver usando o evento imediatamente ou se estiver tentando passá-lo para um novo escopo, precisará persist() .

    
por sighrobot 03.11.2016 / 00:54
fonte