【问题标题】:'this' refers to wrong dynamically generated element in jQuery on()'this' 指的是 jQuery on() 中错误的动态生成元素
【发布时间】:2016-04-19 04:16:21
【问题描述】:

作为动态表单的一部分,我有一个复选框字段,用于启用和禁用下一个输入字段(它们是一对,因此当您向表单添加新部分时,复选框和输入字段都添加在一起) .

.form-element
  .checkbox
    = f.label :foo_bool_field do
      = f.check_box :foo_bool_field, class: 'foo-bool-field-form-toggle'
      .desc_foo_bool_field= "text describing field"

  .input
    = f.label :bar_input_field
    = f.text_field :bar_input_field, disabled: f.object.foo_bool_field

这一切都在 .form 类块中。

这是禁用的代码

$('.form').on('change', '.foo-bool-field-form-toggle', function(e) {
  // disabling code goes here
});

如果我添加一些这些表单元素,然后单击文本“描述 foo_bool_field 的文本”,它仅启用/禁用第一组的输入表单。如果我在表单禁用代码上方抛出一个调试器并检查thisthis 总是返回第一个集合。如果我单击实际文本框□,它会正常工作,禁用复选框并引用我实际单击的复选框的右侧this

有什么想法吗?我尝试了一些不同的东西(click 而不是change 等),但这一切都回到了这样一个事实,即点击文本时,this 不是我点击的元素,我可以似乎没有过去。

【问题讨论】:

  • 您期望this 指的是什么? jQuery 安排this 引用事件中涉及的元素。
  • 您还需要发布“禁用代码”,因为这可能就是问题所在。
  • 没有看到您的“更改”处理程序代码,没有人可以提供帮助。
  • @Pointy 我期待this 指的是我点击的元素。但是,如果我创建 3 个集合并单击第三个集合中的文本,它指的是第一个集合,即使在它遇到禁用代码之前,如果我将 debugger 作为第一行中的“更改”处理程序代码。
  • 生成的 HTML 是什么样的?

标签: javascript ruby-on-rails haml


【解决方案1】:

与大多数语言不同,javascript 中的this 通常是指父调用对象,根据上下文,它几乎可以是任何东西。

长话短说,尝试像这样在 jQuery 选择器中包装 this

$('.form').on('change', '.foo-bool-field-form-toggle', function(e) {
  // disabling code goes here
  $(this).whatever
});

基本上,$(this) 将引用触发回调事件的 DOM 元素(即change),并且适用于click 或任何其他事件触发器。

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2012-08-14
    • 2014-03-15
    相关资源
    最近更新 更多