jQuery .blur .focus无法在测试

时间:2016-04-11 23:57:38

标签: javascript jquery

在编写茉莉花测试时,似乎jQuery无法识别输入具有焦点。在两个输入元素之间切换时,不显示警报,当单击输出而不聚焦另一个输入时,将显示警报。但是,通过在我的测试代码中使用.focus.blur,我无法获得所需的行为。它总是认为它们都不是专注的。此外,如果不调用.triggerHandler,则根本不会调用模糊处理程序。

输入可见并附加到DOM。

var $inputs = $("input");
function blurTimeout() {
  if (!$inputs.is(":focus")) {
    alert("Nothing's focused");
  }
}

function blur() {
  setTimeout(blurTimeout, 0);
}

function main() {
  $inputs.on("blur", blur);
}
$(main);

jsfiddle

修改 看来,调用$inputs.first().focus()来关注其中一个输入,然后alert($inputs.first().is(":focus"))提醒false

var $input = $inputs.first();
$input.focus();
alert(!!$input.is("focus")); // -> false

2 个答案:

答案 0 :(得分:1)

事件和处理程序似乎很好。问题在于逻辑。当任何输入具有焦点!$inputs.is(':focus')时,始终返回false。您可以通过替换:

来解决这个问题
!$inputs.is(':focus')

使用:

$inputs.filter(':focus').length

DEMO

答案 1 :(得分:0)

以下是更改后的代码。测试现在按预期工作,并保持原始行为。

var $inputs = $("input");
function blurTimeout() {
    var index = $inputs.length;
    while(index--){
        if($inputs[index] === document.activeElement){
            return;
        }
    }
    alert("Nothing's focused");
}

function blur() {
    setTimeout(blurTimeout, 0);
}

function main() {
    $inputs.on("blur", blur);
}
$(main);