Javascript 如何编写智能onblur事件

Javascript 如何编写智能onblur事件,javascript,jquery,jquery-ui,javascript-events,Javascript,Jquery,Jquery Ui,Javascript Events,假设我们有以下示例代码: <input type="text" onblur="blurHandler()" /> <div class="results"> <ul> <li><a href="#" onclick="clickHandler(this);">sampleText</a></li> </ul> </div> 假设您当前关注输入标

假设我们有以下示例代码:

<input type="text" onblur="blurHandler()" />
<div class="results">
    <ul>
        <li><a href="#" onclick="clickHandler(this);">sampleText</a></li>
    </ul>
</div>

假设您当前关注输入标记,将鼠标悬停到“a”标记并单击它。浏览器将首先处理onblur事件

模糊事件的任务是它应该隐藏results div,但您仍然希望能够在此之前单击results div中的链接。

  • blurHandler
    中,用于延迟隐藏div

    function blurHandler() {
        setTimeout(function () {
            //close the div
        }, 100);
        //do whatever else needs to be done
    }
    

  • 另一个选项是在链接上玩
    mouseenter
    /
    mouseleave
    事件,并在事件处理程序之间使用公共标志,以便它们相互了解

  • 还有一个:你可以用一个简短的动画隐藏div,这样当点击发生时它实际上仍然在那里。大概是这样的:

     $('.results').hide(1000);
    


注意:您应该看看,内联事件处理程序确实会很快搞乱HTML。分离关注点有助于他人和你未来的自我。如果您使用jQuery(查看问题下方的标记),则应该使用jQuery的事件处理方法,该方法已经使用了高级模型。

  • blurHandler
    中,用于延迟隐藏div

    function blurHandler() {
        setTimeout(function () {
            //close the div
        }, 100);
        //do whatever else needs to be done
    }
    

  • 另一个选项是在链接上玩
    mouseenter
    /
    mouseleave
    事件,并在事件处理程序之间使用公共标志,以便它们相互了解

  • 还有一个:你可以用一个简短的动画隐藏div,这样当点击发生时它实际上仍然在那里。大概是这样的:

     $('.results').hide(1000);
    



注意:您应该看看,内联事件处理程序确实会很快搞乱HTML。分离关注点有助于他人和你未来的自我。如果您使用jQuery(查看问题下方的标记),您应该使用jQuery的事件处理方法,这些方法已经使用了高级模型。

我同意Marcell的评论,不过从可用性的角度来看可能更多

指定一个超时(正如bažmegakapa所建议的那样)意味着您选择了一个任意的时间限制,在用户处理完他们在该时间限制结束之前应该做的事情之前,该时间限制可能会触发,也可能不会触发。除非你的用户界面清楚地表明他们必须在给定的时间范围内做出反应,否则这很可能会导致用户失望

即使想当然地认为用户有时间处理屏幕上的指示,在从键盘移动到鼠标(或触摸,更糟糕的是,你必须处理UI移动以隐藏软键盘)之间也有过渡时间,这意味着在您选择的时间限制结束之前,不同用户之间的差异以及他们遵循指示的能力更大


只是想一想,关于你的互动是如何建立的

我同意Marcell的评论,尽管从可用性的角度来看可能更多

指定一个超时(正如bažmegakapa所建议的那样)意味着您选择了一个任意的时间限制,在用户处理完他们在该时间限制结束之前应该做的事情之前,该时间限制可能会触发,也可能不会触发。除非你的用户界面清楚地表明他们必须在给定的时间范围内做出反应,否则这很可能会导致用户失望

即使想当然地认为用户有时间处理屏幕上的指示,在从键盘移动到鼠标(或触摸,更糟糕的是,你必须处理UI移动以隐藏软键盘)之间也有过渡时间,这意味着在您选择的时间限制结束之前,不同用户之间的差异以及他们遵循指示的能力更大


只是想一想,关于你的互动是如何建立的

如果不是在输入的模糊事件中隐藏div,而是在results div的click事件中隐藏div(如果用户在外部单击,还可以选择在文档的click事件中隐藏),这不是一个好的解决方案吗。因此,
clickHandler
会将results div作为最后一件事隐藏起来。是否希望在鼠标停留在results div上时将其保持打开状态?然后,您想在单击时将其关闭还是保持打开?如果您让div隐藏在输入的模糊事件上,而不是结果div的单击事件上(另外,如果用户在外部单击,还可以选择在文档的单击事件上),这不是一个好的解决方案吗。因此,
clickHandler
会将results div作为最后一件事隐藏起来。是否希望在鼠标停留在results div上时将其保持打开状态?那么,您是想在单击时关闭它,还是让它保持打开状态?这个问题有时有效,有时无效。。。。很奇怪。。。有最小超时数吗?@ZeDonDino我为你制作了一把小提琴。这个问题有时有效,有时无效。。。。很奇怪。。。有最小超时数吗?@ZeDonDino我为你做了一把小提琴。