1

見つかった場合にキャプチャ入力フィールドに自動的にフォーカスを与える Greasemonkey スクリプトを作成しようとしています。この例のように、キャプチャ フォームが動的に挿入される場合を除いて、これは正常に機能します。DOMNodeInserted のイベントリスナーを作成すると、そのケースを処理できると思いました。(私は Firefox 17b でテストしています)。

// ==UserScript==
// @name          Focus captcha field
// @description   Adds focus on captcha fields
// ==/UserScript==

function focusCaptcha (elem) {
    var ids = ['recaptcha_response_field', 'adcopy_response', 'captcha_input'];
    for (var i = ids.length - 1; i >= 0; i--) {
        var input = elem.getElementById(ids[i]);
        if (input) {
            input.focus();
            input.value = '';
            return;
        }
    }
}

(function() {
    focusCaptcha(document);
})();

document.addEventListener('DOMNodeInserted', function(event) {
    focusCaptcha(event.target);
}, false);
4

1 に答える 1

1

DOMNodeInsertedミューテーションイベントであり、ミューテーションイベントは正当な理由で非推奨になりました。そのコードは、ブラウザのJSを深刻にロードし、「スクリプトがビジー/制御不能」なセーフガードの一部をトリガーする可能性があります。

まったく新しいMutationObserversに切り替えることもできますが、それはこの種のことでは複雑なやり過ぎです。

実証済みの真のwaitForKeyElements()ユーティリティを使用します。そのようです:

// ==UserScript==
// @name        _Focus captcha field
// @description Adds focus on captcha fields
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require     https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant       GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change introduced
    in GM 1.0.   It restores the sandbox.
*/

function focusCaptcha (jNode) {
    jNode.val ('');
    jNode[0].focus ();
}

waitForKeyElements (
    "#recaptcha_response_field, #adcopy_response, #captcha_input#",
    focusCaptcha
);

フォーカスを移動しようとすると、iframeが問題を複雑にする可能性があることに注意してください(ただし、テストは行っていません)。

于 2012-11-07T22:19:42.783 に答える