1

我正在开发一个浏览器扩展程序(google chrome 和 firefox),它使用内容脚本来更改 textarea 值。我正在使用这个脚本:

在谷歌浏览器上我使用这个脚本:

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() 但没有帮助。

4

1 回答 1

1

Wladimir 是对的,问题通常与隐藏字段和 keyup 事件有关。触发顺序是关键。我相信正确的方法是:

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 和 google chrome(但 firefox 使用 initKeyEvent 而不是 initKeyboardEvent)

于 2012-06-10T21:35:11.383 回答