【问题标题】:JavaScript: Visibility error in Internet Explorer when setting focus on an input elementJavaScript:在输入元素上设置焦点时,Internet Explorer 中的可见性错误
【发布时间】:2009-09-24 23:15:24
【问题描述】:

这可能是我多年来使用 JavaScript 和任何版本的 Internet Explorer 时遇到的最模糊的错误。我们将 YUI 2.7 用于一些(非)方便的方法。唉,我会为 jQuery 做些什么......

这会影响 Internet Explorer 6 和 Internet Explorer7。 Internet Explorer 8 运行正常。所有其他浏览器也正常运行。

问题:当我将焦点设置在特定元素上时,出现以下错误:

Can't move focus to the control because it is invisible, not enabled, or of a type that does not accept focus.

所以我有一个名为“add-comment-login-overlay”的 div,其中包含输入元素。在用户单击多个名为“登录”的链接之一之前,此 div 为 display:none。

以下是我使用的选择“登录”链接的 JavaScript 代码,它移动 DOM 中的“添加评论登录覆盖”的位置,设置 display:block,然后将焦点设置在叠加层中的第一个输入字段。正是这个设置焦点的过程导致了我上面写的错误。

//Get Login links in comment forms.
links = YAHOO.util.Dom.getElementsByClassName('addCommentLoginLink');

//Set click event for login links.
YAHOO.util.Event.addListener(links, "click", function(el){

    //Stop link.
    YAHOO.util.Event.preventDefault(el);

    //Move login overlay in DOM.
    if( el.srcElement ){
        var target = el.srcElement;
    }else{
        var target = el.currentTarget;
    }

    YAHOO.util.Dom.insertAfter( overlay, target.parentNode.parentNode.parentNode.parentNode );

    //Set to visible.
    YAHOO.util.Dom.setStyle( overlay,'display', 'block' );

    //Set focus to username field.
    document.getElementById('add-comment-login-overlay-username-input').focus();
});

我绝对可以确认覆盖 div 是完全可见的。我可以看看。我添加了一个 setInterval 计时器来测量正在发生的事情,但它没有任何效果。有一次,我在覆盖层可见和调用focus()之间有10秒的时间,但错误仍然发生。除了这个错误之外,这个表单除了这个错误之外是完全正常的。

这是一个简化版的覆盖 HTML 代码作为参考。

<div id="add-comment-login-overlay" class="add-comment-login-overlay" style="display: block;">
    <div class="add-comment-login-overlay-content clearfix">
        <div class="add-comment-login-overlay-signin clearfix">
            <input type="text" tabindex="2001" id="add-comment-login-overlay-username-input"/>
            <input type="password" tabindex="2002" id="add-comment-login-overlay-password-input"/>
        </div>
    </div>
</div>

【问题讨论】:

    标签: javascript internet-explorer focus


    【解决方案1】:

    这是 IE 中一个老生常谈的错误(很高兴知道它已在 8 中修复)。我不知道官方原因,但我认为这与 IE 在执行上下文完成后才重新绘制 DOM 有关,同时尝试focus() 认为它仍然隐藏的元素:

    function calledAtSomePoint() { // begin execution
    
        // ...
    
        element.style.display = ''; // show container
        input.focus(); // IE thinks element is hidden 
    
        // end of execution, IE repaints the DOM but it's too late
    } 
    

    The solution is to use setTimeout:

    setTimeout(function() {
        document.getElementById('add-comment-login-overlay-username-input').focus()
    }, 0)
    

    我曾经多次遇到过这种情况,包括使用 jQuery。这不是任何图书馆的错。 setTimeout 一直为我工作。

    【讨论】:

    • 我在 IE 8 中遇到了这个问题,但我相信我的问题与通过调用 window.showModalDialog(...) 打开表单有关。这种解决方法对我来说非常有效。谢谢!
    • 这在 DotNetNuke 问题上对我有用!谢谢新月新鲜!
    • 显然IE11中还是存在的,只是这次需要500ms的定时器才能生效。
    【解决方案2】:

    在 try/catch 块中设置焦点。

    【讨论】:

    • 不幸的是,我不想在漏水的大坝里放一块口香糖来修补它。我想知道到底是什么原因造成的。
    • 嗯,在我看来,ie6 中的一块口香糖是最好的做法。这个浏览器充满了奇怪的错误,你不要试图去理解它们,你只是试着让你的应用程序工作。我还没有测试过 Iod3n 方法,但如果它有效,如果它根本不影响性能,你应该修补你的应用程序,然后出去喝杯啤酒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2020-05-15
    • 1970-01-01
    • 2014-12-25
    • 2017-09-09
    • 1970-01-01
    相关资源
    最近更新 更多