Ich schreibe eine Chrome-Erweiterung für Facebook und möchte die Einreichung des Entwurfs des fokussierten Kommentars programmgesteuert auf einen Beitrag auslösen. Das Standardverhalten besteht darin, zu senden, wenn der Benutzer die Eingabetaste drückt, also versuche ich, die Facebook-Benutzeroberfläche zu glauben, dass der Benutzer dies getan hat.
Facebook verwendet React und ein contenteditable
div für Kommentarformulare.
Hier ist eine Reihe von Dingen, die ich ausprobiert habe:
1) jQuery Event triggert $('<the contenteditable div>').trigger($.Event('keydown', {which: 13}))
postMessage
und die Chrome-Konsole reagiert) document
aus jedem Kontext auszulösen. 2) Selbe Sache, aber mit VanillaJS Event Triggerung. relevante StackOverflow-Frage
3) An diesem Punkt habe ich gemerkt, dass dies React ist und es verwendet sein eigenes SyntheticEvents
, also kopiere ich im Grunde das Simulate
von ReactTestUtils
, die beim Testen helfen soll, indem Ereignisse simuliert und innerhalb der Umgebung der Seite ausgeführt werden (Verweis auf% co_de) % Objekte über die Facebook-Frontend required
-Funktion).
Ich habe dies mit meist require
-Ereignissen versucht, weil das die meisten Listener hat.
Ich bin mir dieser Fragen bewusst, aber sie haben meinem Verständnis nicht geholfen: Erzwingen Reagieren, um Ereignis durch injiziertes JavaScript auszulösen
Es ist unklar, basierend auf Ihrer Beschreibung, ob dies ein Problem ist oder nicht, aber SyntheticEvent
hat mir zuvor Schmerzen verursacht, weil das Objekt wiederverwendet wird. Es gibt eine Notiz in der React-Dokumentation dazu:
Wenn Sie asynchron auf die Ereigniseigenschaften zugreifen möchten, sollten Sie
event.persist()
für das Ereignis aufrufen, wodurch das synthetische Ereignis aus dem Pool entfernt wird und Verweise auf das Ereignis vom Benutzercode beibehalten werden.
Wenn Sie das Ereignis nicht sofort verwenden oder wenn Sie versuchen, es in einen neuen Bereich zu übertragen, müssen Sie persist()
it.
Tags und Links javascript jquery facebook events reactjs