2012-06-09 73 views
1

我正在研究使用內容腳本更改textarea值的瀏覽器擴展(google chrome和firefox)。我此腳本的工作:發佈動態更改的textarea值不適用於ajax表格

谷歌瀏覽器我使用這個腳本:

function print(msg, textarea){ 
    textarea.focus(); 
    textarea.click(); 
    textarea.value = ''; 
    for(var i=0; i<msg.length;i++){ 
    var e = document.createEvent('KeyboardEvent'); 
    e.initKeyboardEvent("keypress", true, true, null, false, false, false, false, 0, msg.charCodeAt(i)); 
    textarea.dispatchEvent(e); 
    textarea.value += msg[i]; 
    } 
} 

使用AJAX textarea的正確更新的值,一些網站,但由於某種原因,當我提交表單,舊的textarea內容將被髮布。如果我手動按一個鍵,問題就解決了。

我無法理解問題所在。我用jQuery嘗試了$(textarea).keydown()。keypress().keyup()。change()或.blur(),但它沒有幫助。

+0

我不是太熟悉,在Chrome腳本如何工作的內容 - 與火狐您可能需要使用'unsafeWindow'對象直接在窗口中的JS代碼對其進行更改後訪問textarea。 – canuckistani

+0

給一個「某些網站」的鏈接(或者,甚至更好,他們的代碼縮減版本)可能是一個好主意。他們可能會將文本區域值複製到他們提交的隱藏字段中 - 並且通常會在偵聽「keyup」事件時完成。 –

+0

@canuckistani:此代碼僅使用DOM方法和屬性,代理不應該成爲問題。順便說一下,Chrome中的內容腳本的工作方式非常相似(只有「真實的」DOM屬性和方法可以訪問),但Chrome並沒有提供任何解決方法。 –

回答

1

弗拉基米爾是對的,問題往往是關於隱藏領域和關鍵事件。 觸發順序是關鍵。我相信一個正確的方法是:

for(var i=0; i<msg.length;i++){ 
    var e = document.createEvent('KeyboardEvent'); 
    e.initKeyboardEvent("keydown", true, true, null, false, false, false, false, 0, msg.charCodeAt(i)); 
    textarea.dispatchEvent(e); 

    var e = document.createEvent('KeyboardEvent'); 
    e.initKeyboardEvent("keypress", true, true, null, false, false, false, false, 0, msg.charCodeAt(i)); 
    textarea.dispatchEvent(e); 

    textarea.value += msg[i]; 

    var e = document.createEvent('KeyboardEvent'); 
    e.initKeyboardEvent("keyup", true, true, null, false, false, false, false, 0, msg.charCodeAt(i)); 
    textarea.dispatchEvent(e); 
} 

它的工作在Firefox和谷歌Chrome(但Firefox使用initKeyEvent代替initKeyboardEvent)