9

onBlur ハンドラーの実行中に、新しくフォーカスされた要素 (存在する場合) を取得する必要があります。

これどうやってするの?

私はいくつかのひどい解決策を考えることができますが、setTimeout を含まないものは何もありません。

4

2 に答える 2

26

それを参照してください:

document.activeElement

残念ながら、blur イベントが発生したときに新しい要素がフォーカスされていないため、body が報告されます。したがって、フラグとフォーカスイベントでハックするか、setTimeout を使用する必要があります。

$("input").blur(function() {
    setTimeout(function() {
        console.log(document.activeElement);
    }, 1);
});​

正常に動作します。


setTimeout がなければ、これを使用できます。

http://jsfiddle.net/RKtdm/

(function() {
    var blurred = false,
        testIs = $([document.body, document, document.documentElement]);
    //Don't customize this, especially "focusIN" should NOT be changed to "focus"
    $(document).on("focusin", function() {

        if (blurred) {
            var elem = document.activeElement;

            blurred = false;

            if (!$(elem).is(testIs)) {
                doSomethingWith(elem); //If we reached here, then we have what you need.
            }

        }

    });
    //This is customizable to an extent, set your selectors up here and set blurred = true in the function
    $("input").blur(function() {
        blurred = true;
    });

})();​

//Your custom handler
function doSomethingWith(elem) {
     console.log(elem);
}
于 2012-07-21T14:25:24.973 に答える