【问题标题】:jQuery blur handler not working on div element?jQuery 模糊处理程序不适用于 div 元素?
【发布时间】:2011-09-24 01:20:53
【问题描述】:

我不明白为什么 jQuery 模糊处理程序在最简单的情况下不起作用。我实际上是在创建一个 100px x 100px 的 div 并在其上设置一个模糊事件,但它没有触发 (JSFiddle):

<div id="test">this is a test</div>
$(document).ready(function() {
    $('#test').bind('blur', function() {
          alert('blur event!'); 
    });
});

我对模糊的理解是错误的吗?我希望当我单击任何不是 div 的地方时会触发 blur 事件...对吗?

根据 jQuery 的文档:

在最近的浏览器中,事件的域已扩展到 包括所有元素类型。元素可以通过键盘失去焦点 命令,例如 Tab 键、或通过鼠标单击 页面。

我已经在 Mac 上最新的 Chrome 和 Firefox 上试用过。

【问题讨论】:

    标签: javascript jquery onblur


    【解决方案1】:

    来自W3C DOM Events specification

    聚焦

    当元素通过定点设备或通过 选项卡导航。此事件对以下元素有效:LABEL、INPUT、SELECT、 文本区域和按钮。

    模糊

    当元素通过定点设备或通过鼠标失去焦点时,会发生模糊事件 选项卡导航。此事件对以下元素有效:LABEL、INPUT、SELECT、 文本区域和按钮。

    jQuery 文档状态浏览器将事件扩展到其他元素,我猜这意味着 blurfocus 是更通用的 DOMFocusIn and DOMFocusOut events 的别名。但是,默认情况下非输入元素没有资格接收这些元素,并且元素必须在失去焦点之前以某种方式获得焦点 - blur 仍然不会为 div 之外的每次点击触发。

    This SO question 提到给元素一个tabindex 将允许这样做,并且似乎在modifying your jsFiddle 之后在Chrome 中对我有用。 (尽管轮廓相当难看。)

    【讨论】:

    • 是的,我知道这就是 W3C 规范所说的,但正如我在帖子中所说,根据 jQuery 的文档,在最近的浏览器中,事件的域已扩展为包括所有元素类型......我假设 FF6 和最新的 Chrome 符合条件。
    • @jbyrd - 不知道为什么 jQuery 文档会取代 W3C 规范
    • @jbyrd 我猜这意味着“模糊”和“焦点”在浏览器中被别名为更通用的 DOM 焦点输入/输出事件。尽管如此,并非每个元素都默认符合条件 - 我会相应地编辑答案。
    【解决方案2】:

    据我所知,无论您说什么,输入都会发生模糊

    我希望当我单击任何不是 div 的地方时会触发 blur 事件...对吗?

    不完全是,模糊事件只发生在首先获得焦点的元素上

    所以为了让模糊事件发生,你首先必须给 div 焦点,div 是如何首先获得焦点的?

    如果您真的想确定是否在您的 div 之外进行了点击,则需要将点击处理程序附加到文档,然后检查您的点击来自何处。

    var div_id = "#my_div";
    var outsideDivClick = function (event) {
      var target = event.target || event.srcElement;
      var box = jQuery(div_id);
    
      do {
        if (box[0] == target) {
          // Click occured inside the box, do nothing.
          return;
        }
        target = target.parentNode;
      } while (target);   
    }
    jQuery(document).click(outsideDivClick);
    

    请记住,每次点击页面都会运行此处理程序。 (过去如果我必须使用这样的东西,我会在需要时附加处理程序,并在不再需要时将其删除)

    【讨论】:

    • 好的,所以我更新了 jsfiddle 并添加了 $('#test').focus();...但仍然没有运气。
    • 我想你错过了我的意思,div 首先不能有焦点。
    • 但我认为你可能错过了我原来的观点,即 jQuery 的文档似乎另有建议(我可能会误解它,但它看起来很简单)。
    • 我了解您的阅读方式。我只是不认为是这样,或者至少我从未见过事情是这样运作的。过去,我总是不得不使用我上面描述的方法来检查特定 div 之外的点击
    • 好的,好的——是的,这很有趣。那么我猜文档可能是错误的。感谢您的信息。
    【解决方案3】:

    A 不能“模糊”,因为这首先需要 div 具有焦点。像 a 和 textarea 这样的非输入元素可以有焦点,这是 jQuery 的文档所指的。

    您需要的是“mouseout”或“mouseleave”事件(mouseleave 不会冒泡,mouseout 会),当光标离开 div 时会触发该事件。如果您需要点击,我会将“点击”事件附加到正文以及 div 并仅在 div 上停止事件传播:

    $("div").click(function(e) {
        return false; // stop propagation
    });
    

    或者,如果您真的下定决心,您可以使用 a 和一些 CSS 规则来伪造 div 的外观:)

    【讨论】:

      【解决方案4】:

      如果您希望在将鼠标移到框上时发生某些事情,可以使用mouseover 事件。

      【讨论】:

      • 好吧,我想我知道你来自哪里 - 但问题实际上是关于通过点击其他地方发生的模糊事件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多