【问题标题】:Jquery live does not seem to work in nested callsJquery live 似乎不适用于嵌套调用
【发布时间】:2010-10-25 03:58:07
【问题描述】:

我遇到了 jquery live 函数不能始终为我工作的问题(或者我认为的)。

我有相同的 html 表单,用于添加新评论和编辑现有评论;此表单通过 GET 调用在服务器端使用 php 代码传播。这两个表单根据选项卡选择显示在两个不同的选项卡中(tab1:添加注释,tab2:列出 cmets;tab3:编辑在 tab2 中选择的注释)。 “添加评论”表单作为tab1的主要内容出现;但是,“编辑”表单是根据在 tab2 中选择需要编辑的评论出现的,因此假设“编辑评论”表单显示为 tab3。当表单是该选项卡的主要内容时,以下代码非常适用于 tab1;但是当它是tab3的主要内容时,它并不能始终如一地工作,这是根据tab2中需要编辑的评论来显示的。

  $("input.sample_radio").live('change',function(){
                            if ($(this).val() == 'no')
                                    $('#sample_table').hide();
                            else if ($(this).val() == 'yes')
                                    $('#sample_table').show();
                            return false;
                            });

如果您能给我一些想法,将不胜感激。我的观察结果是:

  1. 我使用了 $("input[name='sample_radio']") 但这不适用于 tab3 的形式,因为它总是以 tab1 的形式结束
  2. 通过使用 $("input.sample_radio") 我假设所有类型为 'sample_radio' 的类都可以工作,但它也不起作用。
  3. live 应该将事件绑定到 jquery 调用后添加到 DOM 树中的新元素,但对我来说似乎不是这样。

谢谢


听从马克·舒尔泰斯的建议

查看 .delegate(),它通过允许您指定上下文来专门解决这个问题。

我设法通过将事件绑定到单选按钮的选定父项(tab1 和 tab3),然后根据选择器进行过滤,这里是单选按钮元素的名称,如下所示:

$('#tab1,#tab3').delegate('input[name="policy_radio"]','change',function(){
                            if ($(this).val() == 'no')
                                    $('.policy_table').hide();
                            else if ($(this).val() == 'yes')
                                    $('.policy_table').show();
                            return false;
                            });

感谢您指出这一点。

【问题讨论】:

  • 您应该注意.live() 不会将处理程序绑定到新元素。它将 one 处理程序绑定到document。当一个事件从一个元素冒泡到document 时,jQuery 将检查接收到该事件的元素是否与给定的任何选择器匹配,例如input.sample_radio。因此,防止 事件冒泡的任何事情都会阻止.live() 工作。这应该是您检查的第一件事。
  • 这值得不止一个 +1

标签: radio-button jquery


【解决方案1】:

通过使用 .live,您遇到了其中一项挑战。当您更改选择上下文时,您会阻止它正常工作。

查看 .delegate(),它通过允许您指定上下文来专门解决这个问题。

有关 Brandon Aaron 代表的一些说明,请参阅此帖子:http://brandonaaron.net/blog/2010/03/4/event-delegation-with-jquery

并在上下文中看到这个不错的:http://brandonaaron.net/blog/2009/06/24/understanding-the-context-in-jquery

【讨论】:

  • Mark - 你能解释一下你说的“当你改变选择上下文时......”是什么意思吗?我不明白你的意思。
  • 他所做的(基于描述)是在另一个选项卡中添加新项目时更改 .live 的上下文。原件绑定到一个选项卡,但添加的元素位于另一个选项卡下,因此绑定的上下文不会拾取新元素。因此,由于页面的动态特性不再相关,因此该更改允许他以不同的方式附加。
  • 动态 dom 更改在 XSLT 中间过程中非常相似,其中当前的“上下文”非常重要,但对于许多开发人员来说是一个难以掌握的概念,因为他们不习惯“我在哪里”现在”,这就是让 XSLT 恕我直言成为一项强大但未被充分利用的技术的原因。
猜你喜欢
  • 2019-01-05
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
相关资源
最近更新 更多