2015-08-21 1 views
9

Я пишу расширение Chrome для Facebook и хочу программным образом инициировать отправку сфокусированного комментария на пост. Поведение по умолчанию заключается в том, чтобы отправить, когда пользователь нажимает клавишу Enter, поэтому я пытаюсь обмануть пользовательский интерфейс Facebook, думая, что пользователь сделал это.Triggering Synthetic Event in React App

Facebook использует React и contenteditable div для комментариев.

Вот набор вещей, которые я пробовал:

1) JQuery событие запуска $('<the contenteditable div>').trigger($.Event('keydown', {which: 13}))

  • Я попытался это как из среды контент-сценариев и реальной среде страницы (с помощью как вложенный сценарий, реагирующий на postMessage, так и на консоль Chrome)
  • Я также попытался запустить событие на document из каждого контекста.
  • Ничего похожего не происходит.

2) То же самое, но с запуском события VanillaJS. relevant StackOverflow question

  • также с обеих средах
  • Ничего не происходит

3) В этот момент я понял, что это React, и он использует свой собственный SyntheticEvents, поэтому я в основном копировать/вставить в Simulate function from ReactTestUtils, который предположительно чтобы помочь тестировать, моделируя события и запуская их в среде страницы (захватывая ссылки на объекты required через интерфейс Facebook require).

  • Также не работает. Функция выполняется полностью и без ошибок, но ответа от приложения нет.

Я пробовал это в основном с keydown событиями, потому что к нему прислушивается большинство слушателей.

Я в курсе этих вопросов, но они не помогли моему пониманию: Force React to fire event through injected JavaScript

+0

Вы пытаетесь изменить содержимое редактируемого div из событий клавиатуры? Не могли бы вы поделиться JSFiddle, показывающим вашу проблему? – Espen

+0

Привет, Мэтт! Вы нашли способ инициировать события так, как реагирует React? – Sergio

+0

У меня нет, извините! Я закончил тем, что отказался от этого направления и пошел с совершенно другим решением (требующим от пользователя ctrl/cmd-enter, который facebook интерпретирует как «ввести», но к которому у моего расширения может быть свой собственный обработчик, см. Https: // github. com/Shrugs/EMP/blob/master/app/scripts/contentscript.js для получения дополнительной информации) –

ответ

2

Неясно основано на описании того или нет, это вопрос, но SyntheticEvent вызвала у меня боль, прежде чем из-за факт, что объект повторно используется. Там записка в React docs об этом:

Если вы хотите получить доступ к свойствам событий в асинхронном режиме, вы должны вызвать event.persist() на событии, которое будет удалить синтетическое событие из пула и разрешить ссылки на событие, которое должно быть сохранено кодом пользователя.

Если вы не используете данное событие в данный момент, или если вы пытаетесь передать его в новую область действия, вам нужно будет persist().