2015-06-26 17 views
5

Podobnie jak na zdjęciu, pole komentarza na Facebooku nie ma przycisku przesyłania, gdy coś piszesz i naciśnij przycisk Enter, komentarz opublikowany.publikuj komentarze na Facebooku za pośrednictwem konsoli

Chcę przesłać komentarz przez JavaScript, który działa w konsoli. ale próbowałem uruchomić zdarzenie Enter, przesłać zdarzenie DOM. Nie można go uruchomić.

Facebook comment box

+1

Czy próbowałeś wyzwalać zdarzenie submit? – BoatCode

+0

@ BootCode Tak próbowałem –

+2

Gdzie jest twój kod __ __? –

Odpowiedz

14

Obecne komentarz skrzynki nie są tradycyjne <textarea> wewnątrz <form>. Korzystają z atrybutu contenteditable dla elementu div. W celu złożenia w tym scenariuszu, że chcesz słuchać jednego ze zdarzeń klawiaturowych (keydown, keypress, keyup) i szukać klucza Enter która keycode 13.

Wygląda na FB jest słuchanie keydown evt w tym przypadku, więc kiedy uruchomiłem ten kod, udało mi się sfałszować, aby wysłać komentarz:

function fireEvent(type, element) { 
    var evt; 

    if(document.createEvent) { 
     evt = document.createEvent("HTMLEvents"); 
     evt.initEvent(type, true, true); 
    } else { 
     evt = document.createEventObject(); 
     evt.eventType = type; 
    } 

    evt.eventName = type; 
    evt.keyCode = 13; 
    evt.which = 13; 

    if(document.createEvent) { 
     element.dispatchEvent(evt); 
    } else { 
     element.fireEvent("on" + evt.eventType, evt); 
    } 
} 

fireEvent('keydown', document.querySelector('[role="combobox"]._54-z span span')); 

Kilka rzeczy o tym pamiętać. Klasa ._54-z była klasą, której po prostu używali na mojej stronie. Twój przebieg może się różnić. Użyj narzędzi programistycznych, aby upewnić się, że złapiesz odpowiedni element (powinien on mieć rolę arii "combobox"). Ponadto, jeśli chcesz obsługiwać starsze przeglądarki, będziesz musiał poprawić powyższy kod funkcji fireEvent. Testowałem tylko powyższy przykład w najnowszym Chrome.

Wreszcie, aby komplikować sprawy na końcu, Facebook używa React, który tworzy wirtualną reprezentację DOM dla bieżącej strony. Jeśli ręcznie wpisujesz znaki w combobox, a następnie uruchamiasz powyższy kod, działa on zgodnie z oczekiwaniami. Ale nie będziesz w stanie ustawić wewnętrznej strony HTML combobox do tego, czego szukasz, a następnie wyzwolisz keydown. Prawdopodobnie będziesz musiał wywołać zdarzenie change na combobox, aby upewnić się, że komunikat będzie się powtarzał w Virtual DOM.

To powinno wystartować! Mam nadzieję, że pomaga!

+0

Świetnie. Dziękuję Ci bardzo. Cóż, faktycznie próbowałem wywołać zdarzenie zmiany lub wysłać zdarzenie kluczowe do zakresu, ale nadal nie mogę go uruchomić. czy możesz mi pomóc bardziej? Dziękuję Ci bardzo. –

+1

Oczywiście, każde zdarzenie w React jest delegowane do ciała, a cały ich kod jest zaciemniany, więc niezwykle trudno jest wyśledzić, z którego zdarzenia korzystają. Jeśli 'change' nie robi tego, spróbuj' input', a następnie jedno z trzech zdarzeń klawiatury. Spodziewałbym się, że to jeden z tych 5.Możliwe jest również, że robią cały kod combobox w jednym uchwycie (thekeydown). W takim przypadku musielibyśmy ulepszyć fireEvent powyżej, aby kod był dynamiczny. –

+0

Witam @HankYang, czy dostałeś to do pracy z dynamicznym wywołaniem wejścia i automatycznym komentowaniem posta? dzięki! Pracowałem nad tym bez powodzenia. Dzięki! –

0

Tutaj jest roztwór roboczy po 3 tygodniach eksperymentowania (używając fireEvent funkcję @Benjamin SOLUM'S):

  • ta wersja posty komentarz tylko dla pierwszego posta na stronie (przy użyciu querySelector metody)
  • ta wersja może być używany tylko na Twojej ścianie (chyba że zmiana selektorów zapytań)

    function fireEvent(type, element, keyCode) { 
        var evt; 
    
        if(document.createEvent) { 
         evt = document.createEvent("HTMLEvents"); 
         evt.initEvent(type, true, true); 
        } else { 
         evt = document.createEventObject(); 
         evt.eventType = type; 
        } 
    
        evt.eventName = type; 
    
        if (keyCode !== undefined){ 
         evt.keyCode = keyCode; 
         evt.which = keyCode; 
        } 
    
        if(document.createEvent) { 
         element.dispatchEvent(evt); 
        } else { 
         element.fireEvent("on" + evt.eventType, evt); 
        } 
    } 
    
    // clicking the comment link - it reveals the combobox 
    document.querySelector(".fbTimelineSection .comment_link").click(); 
    
    setTimeout(function(){ 
        var combobox = document.querySelector(".fbTimelineSection [role='combobox']"); 
        var spanWrapper = document.querySelector(".fbTimelineSection [role='combobox'] span"); 
    
        // add text to the combobox 
        spanWrapper.innerHTML = "<span data-text='true'>Thank you!</span>"; 
    
        var spanElement = document.querySelector(".fbTimelineSection [role='combobox'] span span"); 
    
        fireEvent("blur", combobox); 
        fireEvent("focus", combobox); 
        fireEvent("input", combobox); 
        fireEvent("keydown", spanElement, 13); // pushing enter 
    },2000); 
    
Powiązane problemy