2010-12-07 3 views
3

Я пытаюсь написать небольшой скрипт greesemonkey/букмарклет/что у вас есть для Документов Google. Для функциональности, которую я хотел бы добавить, нужен обработчик события keypress/keyup/keydown (один из этих трех). К сожалению, Javascript не мой форт, и я не могу захватить (?) Событие нажатия клавиши, пока на панели редактирования. В крайнем случае, я попытался следующие:Capture keypress в Javascript (Google Docs)

javascript:(function(){ 
    els = document.getElementsByTagName("*"); 
    for(i=0;i<els.length;i++){ 
    els[i].onkeypress=function(){alert("hello!");}; 
    els[i].onkeyup=function(){alert("hello2!");}; 
    els[i].onkeydown=function(){alert("hello3!");}; 
    } 
})(); 

Однако это до сих пор не улавливает нажатия клавиш на панели редактирования - не раздражает оповещения (хотя это, кажется, работает для большинства других сайтов ...) , Я проверил в Chrome и Firefox оба (я не могу заставить его работать в одном).

Я попробовал «Журнальные события» в Firebug (и проверил все зарегистрированные события через аккуратное небольшое расширение Firebug, Eventbug); казалось, что эти события не стреляли по клавишам.

Edit:
Для уточнения [Тим], я сделал это screenshot с некоторыми примечаниями ... screenshot

«Редактирование панели» Я говорю о том, кажется, куча Javascripted-вверх дивы отображая, что я печатаю.

Любые идеи? Благодаря!

+0

Что вы подразумеваете под «панелью редактирования»? Это iframe? Текстовое поле? – 2010-12-07 10:05:01

+0

@Jacob, пожалуйста, проверьте свою учетную запись электронной почты. – Will 2011-01-10 14:58:13

ответ

3

Редактирование в Документах Google использует iframe. Вам нужно прикрепить слушателя к документу iframe. Кажется, что что-то осложняет iframe, который я еще не смог полностью выработать, но, похоже, для Firefox работает следующее:

var iframe = document.getElementsByTagName("iframe")[0]; 
if (iframe) { 
    iframe.contentDocument.addEventListener("keypress", function(evt) { 
     console.log("iframe keypress: " + evt.which); 
    }, false); 
} 
0

Кажется, работает для меня ... но я использую jQuery $ (document) .ready(), чтобы убедиться, что моя страница загружена перед присоединением какого-либо события. Я думаю, что вы могли бы сделать это в голой JavaScript с:

window.onload = function() 
{ 
    els = document.getElementsByTagName("*"); 
    for(i=0;i<els.length;i++) { 
    els[i].onkeypress=function(){alert("hello!");}; 
    } 
} 

Кстати, вы не можете прикрепить более одной функции к событию:

for(i=0;i<els.length;i++){ 
    els[i].onkeypress=function(){alert("hello!");}; 
    els[i].onkeypress=function(){alert("hello2!");}; 
    els[i].onkeypress=function(){alert("hello3!");}; 
} 

элемент будет регистрировать только последний (он отменяет предыдущую функцию), в этом случае «alert (« hello3! »);

+0

Упс, это была опечатка (я исправлю это выше), спасибо! Я пробовал все три «onkeypress», «onkeyup» и «onkeydown» безрезультатно. – Jacob 2010-12-07 21:26:54

0

Вам не нужно прикреплять слушателя ко всем элементам на странице. Достаточно прикрепить его к документу.

window.addEventListener('load', function() { 
    document.addEventListener('keypress', function() { alert("hello!"); }); 
} 

Поскольку это GreaseMonkey скрипт вам не нужно беспокоиться о IE и может использовать метод addEventListener.

+0

Да, это то, что я пробовал в первую очередь ... Моя проблема кажется специфичной для Документов Google. Вышеприведенный код отлично работает на любом другом сайте, а не в Документах Google при редактировании документа. Это работает для вас в этом случае? – Jacob 2010-12-07 21:25:08