document.getElementById(id).focus()不适用于Firefox或Chrome


72

每当我执行onchange事件时,它都会在函数内部进行验证,但是我正在使用的焦点不在 document.getElementById('controlid').focus();

我正在使用Mozilla Firefox和Google Chrome,但两者均无法正常工作。我不要任何IE。谁能告诉我原因。

提前致谢

这是代码:

var mnumber = document.getElementById('mobileno').value; 
if(mnumber.length >=10) {
    alert("Mobile Number Should be in 10 digits only"); 
    document.getElementById('mobileno').value = ""; 
    document.getElementById('mobileno').focus(); 
    return false; 
}

1
请发布一些代码,以便我们了解发生了什么。另外,请尝试稍微整理一下您的问题。
Andy E

您是在onload处理程序中执行此操作吗?
莫里斯·佩里

好的,我正在做手机号码。验证,在那个onchange事件中,我这样写:var mnumber = document.getElementById('mobileno')。value; if(mnumber.length> = 10){alert(“手机号码只能为10位数字”); document.getElementById('mobileno')。value =“”; document.getElementById('mobileno')。focus(); 返回false;}如果任何人输入的数字小于10,在焦点移到下一个字段后,它将显示警报并清除文本字段,我试图在同一字段中给出Mozilla和crome的名称。
SKSK,2009年

您是否在html中添加了“索引”属性?
AlbertoAcuña18年

Answers:


109

尝试使用计时器:

var mnumber = document.getElementById('mobileno').value;
if (mnumber.length >=10) 
{ 
    alert("Mobile Number Should be in 10 digits only");
    document.getElementById('mobileno').value = "";
    window.setTimeout(function ()
    {
        document.getElementById('mobileno').focus();
    }, 0);
    return false;
}

当线程变为空闲时,计数为0的计时器将运行。如果这样做没有帮助,请尝试在onblur事件中尝试使用计时器代码(使用计时器)。


1
我不想不理解,因为我忘记了一切,但是当我理解了某些东西之后,我就应该理解它,而我不需要记住它。所以我对@AndyE有疑问,您从哪里学到的?我懒洋洋地阅读有关javascript规范的信息,我知道实现不一定会随之而来,但是当您说“线程空闲时将运行”时,我立即明白为什么它不起作用。因此,我想了解内部知识。
Iharob Al Asimi

1
想对此进行深入分析,是的,如上所述,为什么这样做有效?
德克



@AndyE Soooper很好奇,想知道它是如何工作的,请参考????
aeXuser264

60

如果focus()不起作用,请提及2件事:

  • 附加到父项后使用此功能
  • 如果选择了控制台,则刷新页面后,元素将不会获得焦点,因此在测试时选择(单击)网页

这种方法在Firefox和Chrome中都可以使用,而无需使用任何工具setTimeOut()


33
在Chrome中关闭控制台确实解决了这个奇怪的问题。
波阿斯2015年

9
该死!您节省了我大量的调试时间,实际上,选择控制台后,focus方法无效。如果我知道你,我会给你买啤酒!
毛里西奥·苏亚雷斯

2
我总是忘记控制台-.-感谢您记住我=)
Can Rau

6
我还console打开了Firefox开发工具(即),然后关闭它为我解决了这个问题
aexl

1
感谢您对控制台的澄清。因为我想知道为什么我的简单a [0] .focus()无法正常工作
罗马

31
window.setTimeout(function () { 
    document.getElementById('mobileno').focus(); 
}, 0); 

这也为我工作。Firefox会设置我的元素的值,但不会关注它。


17

我的情况有些不同。我试图focus()从浏览器开发人员控制台中输入信息。事实证明,它以某种方式干扰了输入,一旦我最小化控制台,一切都会按预期工作。我知道这不是程序化的解决方案,但是如果有人像我一样在搜索引擎工具上发现了此信息,则此信息可能会有所帮助。


3
这实际上是答案!Chrome开发工具阻止焦点操作。
elad.chen

16

并非所有元素都是可聚焦的,但是默认情况下,有一个tabindex属性可以解决此问题。

当您将tabindex =分配给元素时:

它变得可聚焦。用户可以使用Tab键从具有较小的正tabindex的元素移动到下一个。例外是特殊值tabindex =“ 0”表示该元素将始终位于最后。tabindex = -1表示元素变为可焦点,但是tab键将始终跳过该元素。只有focus()方法可以工作


很棒的解释。
修复了

5

要添加到此列表中进行检查的另一件事:

确保尝试聚焦的元素本身不存在,也不包含在显示为“ none”的元素中。


4

为了重新获得焦点以在javascript中重新输入密码文本框:

window.setTimeout(function() { document.forms["reg"]["retypepwd"].focus(); },0);

reg是注册表格名称。


3

我怀疑这样做的原因是浏览器渲染与javascript和setTimeout(function(){},0)在同一线程上运行;将setTimeout中的javascript函数排入队列,以在浏览器空闲时执行。如果有人有更深入的解释,请分享。

setTimeout(function(){ 
 if(document.getElementById('mobileno')){
  document.getElementById('mobileno').focus();
 } 
},0);

2

我知道这可能是一个深奥的用例,但是在使用Angular 2框架时,我很难获得足够的投入来集中精力。不管我做什么,调用focus()根本不起作用。

最终,我意识到angular抑制了它,因为我没有在输入上设置[[ngModel)]。设置一个就解决了。希望它能帮助某人。


2

上面建议的超时解决了Chrome上的问题。IE8或FF3上没有问题。

我设定工作重点的代码是:

window.setTimeout(function() {
  document.form1.password.focus();
}, 0);

1

您是否正在尝试在DOM完成加载之前引用该元素?

您的代码应加载到主体中(或加载DOM后应执行的另一个函数,例如$(document).ready()jQuery)

body.onload = function() { 
    // your onchange event handler should be in here too   
    var mnumber = document.getElementById('mobileno').value; 
    if(mnumber.length >=10) {
        alert("Mobile Number Should be in 10 digits only"); 
        document.getElementById('mobileno').value = ""; 
        document.getElementById('mobileno').focus(); 
        return false; 
    }    
}

1

确保使用“ id”和“ getElementById”,如下所示:

<FORM id="my_form" name="my_form" action="">
<INPUT TYPE="text" NAME="somefield" ID="somefield" onChange="document.getElementById('my_form').submit();">
</FORM>

1

添加一个控件,您要在其中设置焦点,然后更改其属性,如下所示

<asp:TextBox ID="txtDummy" runat="server" Text="" Width="2" ReadOnly="true" BorderStyle="None" BackColor="Transparent"></asp:TextBox>

在后面的代码中,只需如下调用 txtDummy.Focus()

此方法适用于所有浏览器。


0

您的工作重点是在返回false之前;,之后不起作用。您尝试此解决方案。返回后控制为假;

将代码放入函数中:

function  validateNumber(){
    var mnumber = document.getElementById('mobileno').value; 
    if(mnumber.length >=10) {
        alert("Mobile Number Should be in 10 digits only"); 
        document.getElementById('mobileno').value = ""; 
        return false; 
    }else{
        return true;
    }
}

来电功能:

function submitButton(){
        if(!validateNumber()){
            document.getElementById('mobileno').focus();
            return false;
        }
}

HTML:

Input:<input type="text" id="mobileno">
<button onclick="submitButton();" >Submit</button>

0

将此源放在模态上方:

<script>
$('body').on('shown.bs.modal', '#IdYourModal', function () {
    document.getElementById('mobileno').focus();
})
</script>

0

我刚刚发现的一件事是,如果有多个具有相同ID的元素,它将不起作用。如果您尝试执行此操作不会出错,但只会默默地失败


0

尝试 location.href='#yourId'

像这样:

<button onclick="javascript:location.href='#yourId'">Show</button>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.