2015-06-26 3 views
5

Come nell'immagine, la casella dei commenti di Facebook non ha pulsante di invio, quando scrivi qualcosa e premi il pulsante Invio, il commento pubblicato.post commenti sulla pagina facebook tramite console

Desidero inviare il commento tramite JavaScript che è in esecuzione in console. ma ho provato ad attivare l'evento Enter, inviare l'evento del DOM. Non potrebbe farlo funzionare.

Facebook comment box

+1

hai provato a attivare un evento di invio? – BoatCode

+0

@BoatCode si ho provato –

+2

Dov'è il tuo codice che hai _tried_? –

risposta

14

Gli attuali caselle di commento non sono una tradizionale <textarea> all'interno di una <form>. Stanno usando l'attributo contenteditable su un div. Al fine di presentare in questo scenario, che ci si vuole ascoltare uno degli eventi della tastiera (keydown, keypress, keyup) e cercare la chiave Enter che è keycode 13.

Sembra che FB è l'ascolto della keydown EVT in questo caso, così quando mi sono imbattuto questo codice sono stato in grado di falsificare inviare un commento:

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')); 

un paio di cose da notare in questo. La classe ._54-z era una classe che si erano appena potuti usare sulla mia pagina. Il tuo chilometraggio può variare. Usa gli strumenti di sviluppo per assicurarti di afferrare l'elemento giusto (dovrebbe avere il ruolo di aria "combobox"). Inoltre, se stai cercando di supportare i browser più vecchi, dovrai modificare il codice della funzione fireEvent in alto. Ho testato solo l'esempio precedente nell'ultimo Chrome.

Infine, per complicare le cose da capo, Facebook sta usando React che crea una rappresentazione DOM virtuale della pagina corrente. Se stai digitando manualmente i caratteri nella casella combinata e poi esegui il codice sopra, funzionerà come previsto. Ma non sarai in grado di impostare la innerHTML di <span> interna più vicina a quello che stai cercando di fare e quindi attivare keydown. Probabilmente dovrai attivare l'evento change nella casella combinata per assicurarti che il tuo messaggio rimanga sul Virtual DOM.

Questo dovrebbe iniziare! Spero possa aiutare!

+0

Grande. Grazie mille. beh, in realtà ho tentato di attivare l'evento change o di inviare l'evento key allo span, ma non riesco ancora a farlo funzionare. puoi per favore aiutarmi di più? Grazie mille. –

+1

Certo, ogni evento in React è delegato al corpo e tutto il loro codice è offuscato quindi è estremamente difficile rintracciare quale evento stanno usando. Se 'change' non lo fa, prova' input', quindi uno dei tre eventi della tastiera. Mi aspetterei che fosse uno di quelli 5.È anche possibile che stiano facendo tutto il codice combobox in un gestore (l'onkeydown). In tal caso, dovremmo modificare l'evento fire sopra per rendere dinamico il keycode. –

+0

Ciao @HankYang, hai capito che funzionava con una chiamata dinamica all'ingresso e commentava automaticamente un post? Grazie! Ci ho lavorato senza molta fortuna. Grazie! –

0

Ecco una soluzione di lavoro dopo 3 settimane di sperimentazione (utilizzando la funzione di @Benjamin Solum fireEvent):

  • questa versione un commento Articoli solo per il primo post sulla pagina (utilizzando querySelector metodo)
  • questa versione può essere utilizzato solo sulla tua bacheca personale (a meno che non si modificano i selettori di query)

    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);