JavaScript无法将焦点传递给元素

3
我在JavaScript中有以下函数,if语句的每个部分都能正常执行,除了将焦点返回给调用该函数的元素。它在IE和Fire Fox中都无法工作,两个浏览器都没有给我错误提示。在我看来,它是正确的...为什么它不起作用呢?
function check(x){

     //doing some stuff

     if (uc_check == false){
          window.alert('Houston, we have a problem.');
          document.getElementById(x).value = '';
          document.getElementById(x).focus(); //this line is not working 
     }
}

附注:我是通过表单输入调用此函数的,如下所示:

onchange="check(this.id)"
2个回答

7
这里的问题在于当onChange函数完成后,它会将焦点设置到下一个元素。因此,在该函数中设置的任何焦点都只会在onChange结束后消失。
有多种方法可以解决这个问题。可能最简单的方法是使用超时。
将您的焦点行更改为以下内容:
var el = document.getElementById(x);
window.setTimeout(function(){el.focus();}, 100);

我正准备回复并说我认为它正在执行你所说的操作(尽管我不知道原因),当我读到了你的帖子。这非常有效,但是你能解释一下 function{el.focus();} 是做什么的吗?我想要理解为什么它有效。 - ubiquibacon
@typoknig - 它只是在100毫秒后调用了focus()函数。 - nickf
正如nickf所指出的那样,这只是将对焦调用延迟100毫秒。这给了你的onChange函数完成的时间(以及随后的对焦更改)。 - desau
好的,所以单词“function”实际上调用一个函数... 很好知道 :) - ubiquibacon
并不完全正确。在这里,我们正在创建一个函数声明。实际上,我们正在创建一个函数,并将该函数声明(如果您愿意,可以称之为函数“指针”)传递给setTimeout函数。window.setTimeout需要两个参数。第一个参数可以是函数指针,也可以是要执行的脚本字符串(就像eval一样)。 - desau

2

您已经有了对元素(this)的引用,因此不需要在元素id之间传递:

<input onchange="check(this);">

以下是JS代码:

function check(el) {
    if (uc_check == false) {
        el.value = '';
        el.focus();
    }
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接