【问题标题】:Locating an element in a 'Facebox' box在“Facebox”框中定位元素
【发布时间】:2023-03-22 22:13:02
【问题描述】:

这是我的链接:

http://tinyurl.com/6j727e

如果您单击 test.php 中的链接,它将在使用 jquery 'facebox' 脚本的模式框中打开。

我正在尝试对该框中的点击事件采取行动,如果您查看 test.php 的源代码,您将看到我试图在模式框中找到链接的位置。

    $('#facebox .hero-link').click(alert('click!'));

但是,它没有检测到点击,而且奇怪的是,点击事件在页面加载时运行。

然而,关闭按钮确实有一个内置的点击事件来关闭盒子,我怀疑我自己的点击事件被某种方式阻止了,但我无法弄清楚。

有人可以帮忙吗?通常它是一个项目的最后一部分,它一直在阻碍我,就像往常一样;)

【问题讨论】:

    标签: javascript jquery facebox


    【解决方案1】:

    首先,您收到文档加载警报的原因是#click 方法将函数作为参数。相反,您将返回值 alert 传递给它,这会立即显示警报对话框并返回 null。

    事件绑定不起作用的原因是在文档加载时,#facebox .hero-link 尚不存在。我认为您有两个选项可以帮助您解决此问题。

    选项1)只有在facebox显示后才绑定点击事件。比如:

    $(document).bind('reveal.facebox', function() {
      $('#facebox .hero-link').click(function() { alert('click!'); });
    });
    

    选项 2) 考虑使用 jQuery Live Query Plugin

    Live Query 通过绑定事件或自动触发匹配元素的回调来利用 jQuery 选择器的强大功能,即使在页面已加载且 DOM 更新后也是如此。

    jQuery Live Query 在识别到 Facebox 修改了 DOM 时会自动绑定 click 事件。然后你应该只需要写这个:

    $('#facebox .hero-link').click(function() { alert('click!'); });
    

    【讨论】:

    • 小心实时查询,如果你有大的 dom,可以吃掉你的网络应用程序,事件委托是更好的选择,并且没有额外的插件开销。
    【解决方案2】:

    或者使用事件委托

    这基本上将事件挂钩到容器而不是每个元素,并在容器事件中查询 event.target。

    它有很多好处,可以减少代码噪音(无需重新绑定),也更容易占用浏览器内存(在 dom 中绑定的事件更少)

    快速示例here

    jQuery plugin 便于事件委托

    P.S 事件委托预计将在即将推出的下一个版本 (1.3) 中提供。

    【讨论】:

    • 实时查询良好警告。事件委托也不是完美的。当您将事件绑定到外部容器元素内的容器元素时会发生什么? 'target' 元素可以很好地嵌套在内部容器中,从而导致更困难的事件映射。
    • Ryan - 根本不和你在一起,你能再解释一下吗.....容器(包括文档本身的任何父级都接收事件气泡,事件目标将始终是同一个元素调用事件)
    • 红方。在事件委托中,您有一个“假”容器,所有事件都冒泡到该容器中。这很好,但如果您的意图是在该容器内的单独容器上获取​​事件,您将失去控制。目标不一定与内部容器匹配。
    • 这很难描述,但是想象一个控制委托的外部 div A,一个您想要在其上捕获事件的内部 div B,以及一个实际调用事件的内部锚标记 C。 C 是目标,但如果您的意图是捕获 B 上的事件,则与委托规则不匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2019-12-19
    • 2019-03-25
    • 2015-03-09
    相关资源
    最近更新 更多