3

initEventdispatchEvent関数の使用方法についてオンラインで多くの情報を見つけましたが、実際にそれらを機能させることはできません。

Enter5秒ごとにキーを押すスクリプトを取得しようとしています。私のユーザースクリプトコード(無関係なメタデータを除く)は以下のとおりです。

// ==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はそれを通過させないだけですか、それとも別のことをする必要がありますか?

4

2 に答える 2

4

そのコードにコピーアンドペーストエラーがあります。
使用しないでください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);
于 2012-11-28T06:21:50.333 に答える
3

キーストロークをドキュメントに送信して適切にバブルさせることができる唯一の方法は、GMスクリプト内に追加のスクリプト挿入を作成することです。この例では、jQueryを使用してキーストロークイベントをシミュレートし、キー「x」が押されたことを検出して、ドキュメントに「Enter」を送信します。

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);

(編集:等しい/同等のエラーを修正)

于 2012-12-08T09:36:45.643 に答える