2016-01-06 65 views
2

所以(僅僅以「so」開頭)我想爲qwebirc平臺創建一個greasemonkey腳本。我需要根據發生的一些事件自動發送回覆。對於那些不知道的人來說,一旦登錄了qwebirc,屏幕底部會有一個輸入文本字段,您可以在其中編寫回復,然後按回車鍵將回復發送到服務器。輸入字段包含在表單元素中,但表單沒有提交按鈕。在輸入按鍵模擬時觸發默認行爲

我可以通過寫入其「value」屬性來填充輸入字段(沒有問題),但我沒有辦法將答覆「提交」給服務器。我試着在容器表單元素上調用.submit()方法,但是它只是簡單地重新加載頁面(所以它發送給自己 - 這很有意義,因爲表單元素上沒有「action」屬性)。在我看來,唯一的解釋是,一旦在輸入字段中按下回車鍵,就會有一個方法在qwebirc.js中的某個地方被調用。

我無法找到負責此操作的代碼(儘管我在Chrome中工作過,我在鍵盤上設置了一個事件監聽器斷點 - 輸入,當我按下回車鍵並指向我時一些函數的開始),因爲腳本被縮小了,沒有辦法讓我知道這些「m」,「n」,「p」,「t」等意味着什麼。如果我有未壓縮的版本,我可以掃描它,也許可以找到它。我也嘗試下載qwebirc項目,但是那裏有很多文件 - 而在服務器上,我正在嘗試編寫一個腳本。

這裏的主要想法是,我猜測輸入按鍵模擬應該觸發發送功能 - 無論哪裏和哪個地方。

爲了做到這一點,我在stackoverflow上找到了一些相同主題的問題 - 模擬輸入按鍵。我試過這個代碼:

function simulate() { 
    var evt = document.createEvent('KeyboardEvent'), 
     input = document.querySelector('.keyboard-input'); 

    evt.initKeyboardEvent(
     'keydown', 
     true, 
     true, 
     window, 
     false, 
     false, 
     false, 
     false, 
     13, 
     0 
    ); 

    input.dispatchEvent(evt); 
} 

事件被創建(我可以在FireBug的DOM面板中看到它),但是沒有采取任何行動。我的意思是爲什麼不.dispatchEvent()的行爲就像一個真正的輸入按鍵?

在此先感謝。

回答

0

對於這個答案的目的,我會假設該消息輸入僞形式是和別人一樣 - 即消息可以通過要麼按Enter 點擊發送按鈕發送。

你已經嘗試過前者;它沒有工作。有可能這個頁面正在等待Send按鈕被點擊(這可能是由一個Enter鍵來觸發的(儘管不,我不知道你的事件不起作用的原因 - 我不熟悉事件的複雜性))。相反,然後,嘗試一下。

另外,take note:IE使用fireEvent而不是dispatchEvent - 所以如果你在IE瀏覽器,這可能是問題。

要發射發送按鈕點擊:

var e = document.createEvent("MouseEvents"); 
e.initEvent("click", true, true); 
e.target = "button#send"; 

if(document.fireEvent) { 
    document.fireEvent(e); 
} 
else { 
    document.dispatchEvent(e); 
} 

改變分配給e.target的CSS選擇器的唯一標識發送按鈕的字符串。