コンテンツスクリプトからページに(またはその逆に)イベントを開始するときにChromeはカスタムプロパティを保持しないため、このジョブを引き継ぐためにページにスクリプトを挿入します。これがアイデアを示す基本的な例です。key
およびkeyCode
プロパティは正しく処理されませんが、使用可能です(とにかく使用しないでください)。
// Example: Say, you've got a reference to a DOM element...
var elem = document.body;
// And you want to "type" "A"
var charCode = 65;
// Now, you want to generate a key event...
triggerKeyEvent(elem, charCode);
// triggerKeyEvent is implemented as follows:
function triggerKeyEvent(element, charCode) {
// We cannot pass object references, so generate an unique selector
var attribute = 'robw_' + Date.now();
element.setAttribute(attribute, '');
var selector = element.tagName + '[' + attribute + ']';
var s = document.createElement('script');
s.textContent = '(' + function(charCode, attribute, selector) {
// Get reference to element...
var element = document.querySelector(selector);
element.removeAttribute(attribute);
// Create KeyboardEvent instance
var event = document.createEvent('KeyboardEvents');
event.initKeyboardEvent(
/* type */ 'keypress',
/* bubbles */ true,
/* cancelable */ false,
/* view */ window,
/* keyIdentifier*/ '',
/* keyLocation */ 0,
/* ctrlKey */ false,
/* altKey */ false,
/* shiftKey */ false,
/* metaKey */ false,
/* altGraphKey */ false
);
// Define custom values
// This part requires the script to be run in the page's context
var getterCode = {get: function() {return charCode}};
var getterChar = {get: function() {return String.fromCharCode(charCode)}};
Object.defineProperties(event, {
charCode: getterCode,
which: getterCode,
keyCode: getterCode, // Not fully correct
key: getterChar, // Not fully correct
char: getterChar
});
element.dispatchEvent(event);
} + ')(' + charCode + ', "' + attribute + '", "' + selector + '")';
(document.head||document.documentElement).appendChild(s);
s.parentNode.removeChild(s);
// The script should have removed the attribute already.
// Remove the attribute in case the script fails to run.
s.removeAttribute(attribute);
}
これは、keypress
char"A"のイベントをトリガーする簡単な例です。より関連性の高いキーイベントをトリガーする場合は、3回使用しないでくださいtriggerKeyEvent
(わずかなオーバーヘッドがあるため)。代わりに、正しいパラメーターを使用してすべてのイベント(、、、および/または)を発生さtriggerKeyEvent
せるように関数を変更してください。keydown
keypress
keyup
input
altKey
、などを変更できるようにする必要がある場合shiftKey
は、関数を変更するだけです。
結論:私が示した例は非常に基本的なものであり、ニーズに合わせて調整できます。
続きを読む
仕様に一致するように実装を変更する場合は、次のソースをお読みください。
コンテンツスクリプトでのスクリプトインジェクションの概念について詳しく知りたい場合は、以下を参照してください。