2015-06-26 2 views
5

Как и на изображении, в поле комментариев Facebook отсутствует кнопка отправки, когда вы что-то пишете и нажимаете кнопку «Ввод», комментарий размещен.опубликовать комментарии на странице facebook через консоль

Я хочу представить комментарий через JavaScript, который работает в консоли. но я попытался вызвать событие Enter, отправить событие DOM. Не удалось заставить его работать.

Facebook comment box

+1

Вы пытались запустить событие отправки? – BoatCode

+0

@BoatCode yes Я пробовал –

+2

Где ваш код, который вы _tried_? –

ответ

14

Текущий комментарий коробки не традиционный <textarea> внутри <form>. Они используют атрибут contenteditable в div. Для того, чтобы представить в этом случае, вы хотите, чтобы слушать одного из событий клавиатуры (keydown, keypress, keyup) и искать Enter ключ, который скан 13.

Похоже FB слушает keydown ЭВТ в этом случае, поэтому, когда я запустил этот код, я был в состоянии подделать оставить свой комментарий:

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

несколько вещей, чтобы заметить об этом. Класс ._54-z был классом, который они только что использовали на моей странице. Ваш пробег может отличаться. Используйте инструменты dev, чтобы убедиться, что вы захватили правый элемент (он должен иметь роль aria «combobox»). Кроме того, если вы ищете поддержку старых браузеров, вам придется настроить код функции fireEvent выше. Я тестировал только вышеприведенный пример в последнем Chrome.

Наконец, чтобы усложнить вопросы на вашем конце, Facebook использует React, который создает виртуальное представление DOM текущей страницы. Если вы вручную вводите символы в поле со списком, а затем запускаете код выше, он будет работать, как ожидалось. Но вы не сможете установить внутреннее внутреннее HTTML <span> combobox для того, что вы хотите сделать, а затем запустить keydown. Вероятно, вам нужно будет запустить событие change в поле со списком, чтобы ваше сообщение сохранялось в Virtual DOM.

Это должно заставить вас начать! Надеюсь, это поможет!

+0

Отлично. Большое спасибо. Я фактически попытался вызвать событие изменения или отправить ключевое событие в диапазон, но все равно не могу заставить его работать. не могли бы вы мне помочь? Большое спасибо. –

+1

Несомненно, каждое событие в React делегировано телу, и весь их код обфускается, поэтому очень сложно отслеживать его, какое событие они используют. Если 'change' не делает этого, попробуйте' input', затем одно из трех событий клавиатуры. Я ожидаю, что это будет один из этих 5.Также возможно, что они выполняют весь код combobox в одном обработчике (onkeydown). В этом случае нам нужно будет настроить fireEvent выше, чтобы сделать динамический код. –

+0

Привет @HankYang, вы получили это, чтобы работать с динамическим вызовом на вход и автоматически комментировать сообщение? благодаря! Я работал над этим без большой удачи. Благодаря! –

0

Вот рабочий раствор после 3-х недель экспериментирования (с использованием fireEvent функции @Benjamin SOLUM в):

  • эта версия оставляет комментарий только для первого поста на странице (с помощью querySelector метода)
  • эта версия может быть использована только на личной стене (если вы не измените селекторы запроса)

    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); 
    
Смежные вопросы