2015-06-26 13 views
5

Giống như trong hình ảnh, hộp nhận xét trên Facebook không có nút gửi, khi bạn viết điều gì đó và nhấn nút Enter, nhận xét đã đăng.đăng nhận xét trên trang facebook qua giao diện điều khiển

Tôi muốn gửi nhận xét qua JavaScript chạy trong bảng điều khiển. nhưng tôi đã cố gắng kích hoạt sự kiện Enter, gửi sự kiện của DOM. Không thể làm cho nó hoạt động.

Facebook comment box

+1

bạn đã thử kích hoạt sự kiện gửi? – BoatCode

+0

@BoatCode yes Tôi đã thử –

+2

Mã của bạn mà bạn _tried_ ở đâu? –

Trả lời

14

Các hộp bình luận hiện nay không phải là một truyền thống <textarea> bên trong một <form>. Họ đang sử dụng thuộc tính có thể chỉnh sửa được trên div. Để nộp trong trường hợp này, bạn muốn nghe một trong những sự kiện bàn phím (keydown, keypress, keyup) và tìm kiếm chìa khóa Enter đó là keycode 13.

Hình như FB được nghe keydown evt trong trường hợp này, vì vậy khi tôi chạy mã này tôi đã có thể giả mạo gửi một bình luận:

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

Một vài điều cần lưu ý về điều này. Lớp học ._54-z là một lớp học mà họ vừa mới sử dụng trên trang của tôi. Số dặm của bạn có thể thay đổi. Sử dụng công cụ dev để đảm bảo bạn lấy đúng phần tử (cần có vai trò aria "combobox"). Ngoài ra, nếu bạn đang tìm kiếm để hỗ trợ các trình duyệt cũ hơn, bạn sẽ phải tinh chỉnh mã chức năng fireEvent ở trên. Tôi chỉ thử nghiệm ví dụ trên trong Chrome mới nhất.

Cuối cùng, để làm phức tạp các vấn đề về phía bạn, Facebook đang sử dụng React để tạo ra một đại diện DOM ảo của trang hiện tại. Nếu bạn nhập thủ công các ký tự vào hộp tổ hợp và sau đó chạy mã ở trên, nó sẽ hoạt động như mong đợi. Nhưng bạn sẽ không thể thiết lập nội bộ của bên trong của combobox ở trên cùng của <span> về những gì bạn đang tìm kiếm và sau đó kích hoạt keydown. Bạn có thể cần phải kích hoạt sự kiện change trên combobox để đảm bảo thư của bạn vẫn tiếp tục với Virtual DOM.

Điều đó sẽ giúp bạn bắt đầu! Hy vọng rằng sẽ giúp!

+0

Tuyệt vời. Cảm ơn nhiều. tôi cũng thực sự cố gắng kích hoạt sự kiện thay đổi hoặc gửi sự kiện quan trọng đến nhịp, nhưng vẫn không thể làm cho nó hoạt động. bạn có thể giúp tôi nhiều hơn không? Cảm ơn nhiều. –

+1

Chắc chắn, mọi sự kiện trong React đều được giao cho cơ thể và tất cả các mã của họ đều bị xáo trộn nên rất khó để theo dõi sự kiện mà họ đang sử dụng. Nếu 'thay đổi' không thực hiện, hãy thử' đầu vào', sau đó là một trong ba sự kiện bàn phím. Tôi hy vọng nó sẽ là một trong 5 người đó.Nó cũng có thể họ đang làm tất cả các mã combobox trong một handler (onkeydown). Trong trường hợp đó, chúng ta sẽ phải tinh chỉnh fireEvent ở trên để làm cho mã phím động. –

+0

Xin chào @HankYang, bạn có nhận được điều này để làm việc với một cuộc gọi năng động đến đầu vào và tự động nhận xét một bài đăng không? cảm ơn! Tôi đã làm việc trên nó mà không có nhiều may mắn. Cảm ơn! –

0

Dưới đây là một giải pháp làm việc sau 3 tuần thử nghiệm (sử dụng fireEvent chức năng @Benjamin Solum của):

  • phiên bản này viết một bình luận chỉ dành cho các bài viết đầu tiên trên trang (bằng cách sử dụng querySelector phương pháp)
  • phiên bản này có thể được sử dụng trên tường cá nhân của bạn (trừ khi bạn thay đổi các bộ chọn truy vấn)

    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); 
    
Các vấn đề liên quan