2012-11-28 3 views
0

Я нашел много информации о том, как использовать initEvent и dispatchEvent functions, но я не могу на всю жизнь заставить их работать на практике.Как имитировать нажатие клавиши в сценарии Greasemonkey?

Я пытаюсь получить скрипт, чтобы нажать Введите ключ каждые 5 секунд. Мой userscript код (минус значения метаданных) ниже:

// ==UserScript== 
// @namespace  http://userscripts.org/scripts/show/153134 
// @require  https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js 
// 
// @grant   unsafeWindow 
// 
// ==/UserScript== 

$(function(){ 
window.setInterval(function(){ 
    var ev = document.createEvent("KeyboardEvent"); 
    ev.initKeyEvent("keypress", true, false, window, 0, 0, 0, 0, 13, 13); 
     window.dispatchEvent(evt); 
}, 5000); 
}); 

заказ мой сценарий на userscript, чтобы увидеть, как плохо работает (добавить пользователя включает домен и проверить его на любом <textarea>). Разве Greasemonkey просто не пропускает его, или мне нужно делать что-то по-другому?

+0

ли вы когда-нибудь заставить его работать? –

+0

Нах, я закончил тем, что делал это с помощью AutoHotKey. Возможно, Python был бы лучшим решением для кросс-платформенной совместимости. –

+0

Может ли autohotkey делать это в фоновом режиме, пока вы делаете другие вещи? И где бы вы посмотрели с помощью python? Любые советы приветствуются. –

ответ

3

В этом коде есть ошибка копирования-вставки.
Не использовать window.dispatchEvent(evt);;
использование window.dispatchEvent(ev);

Отправка событие window не может быть то, что вам нужно либо. (Или это может быть ссылка на целевой странице.).

Может отправить событие документа:

document.body.dispatchEvent(ev); 

Или отправить его к конкретному узлу:

var targetNode = document.querySelector ("#content textarea"); // Etc. 
targetNode.dispatchEvent (ev); 


Или , поскольку вы используете jQuery:

var ev = $.Event('keypress'); 
ev.which = 13; // Carriage-return (Enter) 
$('body').trigger(ev); 
+0

Итак, в чем разница между отправкой его в окно или документ? Нажатие клавиши enter нажимает enter. –

+0

Документ - это вся веб-страница, с которой вы видите и можете взаимодействовать. Окно - это элементы управления браузером/обрезка и т. Д. Как правило, javascript допускает небольшой контроль над элементами управления браузером - для обеспечения безопасности. Большинство (¿all?) Браузеров будут игнорировать события искусственного ключа, нацеленные на 'window'. –

+2

Итак, это все еще не работает. Я попробовал как метод JQuery, так и фактически отправил событие на конкретный элемент страницы (document.querySelector («# UserProfileMain embed»)). Возможно, проблема в том, что это Flash-объект, к которому я пытаюсь отправить события нажатия клавиш, или, может быть, это потому, что keypress предназначен только для фактических букв, а не для других клавиш, таких как стрелки или ввод? –

2

Единственный способ, которым я смог d нажатие клавиш на документ и правильное создание пузырьков путем создания дополнительной вставки скрипта в сценарии GM. В этом примере используется jQuery для имитации события нажатия клавиши, он обнаруживает, когда нажата клавиша «x» и отправляется «вводить» в документ.

var script = document.createElement("script"); 
script.setAttribute("type", "application/javascript"); 

script.textContent = "(" + function(){ 
    $(document).keypress(function(e) { 
     if(e.which == 120) { 
      var p = jQuery.Event('keydown'); 
      p.which = 13; 
      p.keyCode = 13; 
      $('body').trigger(p); 
     } 
    }); 
} + ")()"; 

document.body.appendChild(script); 
document.body.removeChild(script); 

(редактирование: фиксированный равно/ошибка равноценности)

+1

так почему строка removeChild? –

+0

Это необходимо, только если вы запускаете только сценарий инициатора, очищая ресурсы, но это не так важно. Обычно я поддерживаю сценарий для отладки.Этот подход значительно упрощает настройку точек останова. –

+0

Это ответ на вопрос для вас, @NH.? –

Смежные вопросы