通过控制台在Facebook页面上发表评论

就像在图像中一样,Facebook评论框没有提交按钮,当你写东西并按下Enter按钮时,评论会发布。

我想通过在控制台中运行的JavaScript提交评论。 但我试图触发Enter事件,提交DOM的事件。 无法使它工作。

Facebook评论框

当前注释框不是

内的传统

。 他们在div上使用contenteditable属性。 为了在这种情况下提交,您需要收听其中一个键盘事件( keydownkeypresskeyup )并查找键码13的Enter键。

看起来FB在这种情况下正在听keydown evt,所以当我运行这段代码时我能够假装提交评论:

 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是他们刚刚在我的页面上使用的类。 你的旅费可能会改变。 使用开发工具确保你抓住正确的元素(它应该具有咏叹调角色“combobox”)。 此外,如果您希望支持旧浏览器,则必须调整上面的fireEventfunction代码。 我只测试了最新Chrome中的上述示例。

最后,为了使问题复杂化,Facebook正在使用React创建当前页面的虚拟DOM表示。 如果您手动将字符键入combobox然后运行上面的代码,它将按预期工作。 但是你将无法将combobox的最内层的innerHTML设置为你想要做的事情,然后触发keydown 。 您可能需要在combobox上触发change事件,以确保您的消息持续存在于Virtual DOM中。

这应该让你开始! 希望有所帮助!

经过3周的实验(使用@Benjamin Solum的fireEvent函数),这是一个有效的解决方案:

  • 此版本仅针对页面上的第一篇post发布评论(通过使用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 = "Thank you!"; 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);