2012-06-09 32 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)