Публикация динамически измененного значения textarea не работает с формами ajax

Я работаю над расширением браузера (google chrome и firefox), которое использует сценарий содержимого для изменения значения текстовой области. Я работаю с этим скриптом:

В google chrome я использую этот скрипт:

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).keydown().keypress().keyup().change() или .blur() с jQuery, но это не помогло.


person t0staky    schedule 09.06.2012    source источник
comment
Я не очень хорошо знаком с тем, как сценарии контента работают в Chrome — в Firefox с SDK вам может понадобиться использовать объект unsafeWindow для доступа к текстовой области сразу после того, как код JS в окне внесет в нее изменения.   -  person therealjeffg    schedule 10.06.2012
comment
Было бы неплохо дать ссылку на некоторые сайты (или, что еще лучше, сокращенную версию их кода). Вероятно, они копируют значение текстовой области в скрытое поле, которое они отправляют, и часто это делается при прослушивании события keyup.   -  person Wladimir Palant    schedule 10.06.2012
comment
@canuckistani: этот код использует только методы и свойства DOM, прокси не должны быть проблемой. Кстати, сценарии контента в Chrome работают очень похоже (доступны только настоящие свойства и методы DOM), только Chrome не предлагает никаких способов обойти эту защиту.   -  person Wladimir Palant    schedule 10.06.2012


Ответы (1)


Владимир прав, проблема часто связана со скрытым полем и событием 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)

person t0staky    schedule 10.06.2012