【问题标题】:jQuery DOM object referenced childrenjQuery DOM 对象引用的子项
【发布时间】:2011-03-18 18:12:35
【问题描述】:

为了创建更简洁的代码,我正在尝试编写事件处理函数,这些函数知道它们从哪里被调用。我不确定我正在尝试做的事情是否不是正确的做事方式,或者是否在组成页面的表中底层嵌套的 div 会导致问题。

下表/js的目标是从图像标签的属性中获取数据,并将它们填充到父/祖先表中的输入元素中。

表结构:

<table id="formbody">

    <tr><td>
    <table class="form_item_wrapper" id="form_item_1">

        <tr><td><div id="search_results"><img class="event_handler" foo="bar" /></div></td></tr>

    <tr><td>Foo: <input id="event_input" name="foo_input_1"></td></tr>
   </table>

    <table class="form_item_wrapper" id="form_item_1">
        <tr><td>
            <div id="search_results"><img class="event_handler" foo="baz" /></div>
        </td></tr>

     <tr><td>Foo: <input id="event_input" name="foo_input2"></td></tr>
    </table>

     </td></tr>


</table>

每个 .form_item_wrapper 表都有一个可以动态填充 .event_handler 图像列表的部分。一旦检索条目的 $.get() 填充数据,它将处理程序附加到图像以触发 populate_shipment_details(event) onclick。该部分工作正常,事件正确触发,我可以从图像元素中读取我的自定义属性。这是单击其中一张图片时调用的函数:

function populate_shipment_details(event){

var form_wrapper = $(event.target).closest('.form_item_wrapper');

var foo_input = $(form_wrapper).children('#event_input');

    foo_input.val($(event.target).attr('foo'));

}

我遇到的问题是,虽然 form_wrapper 正确解析到包含单击的图像的表,但 Firebug 显示 foo_input 在 Firebug 中显示为“emtpy”。无论出于何种原因,我都无法在 form_wrapper 中创建指向子级的变量。理想情况下,这是我想要编写的代码……但不起作用。

$(form_wrapper).children("#event_input").val($(event.target).attr('foo'));

【问题讨论】:

  • 从代码中我可以看到您将表格嵌套在表格中。一般来说,我认为您应该只使用表格来呈现数据表。标签使搜索引擎可以从网页中提取标题、段落和定义。将表格用于任何其他目的是一种误导。
  • 永远不要说永远,但永远不要嵌套表格!
  • 代码的结构不是我的设计或决定...我只是想在实现一些新功能的同时尽可能少地改变它。实际上,我考虑过重写大部分结构来解决我的问题,但我担心会花费不必要的时间......

标签: jquery events event-handling


【解决方案1】:

给你:

$('img.event_handler').click(function() {
    $(this).closest('tr').next().find('input.event_input').val($(this).attr('foo'));
});

现场演示: http://jsfiddle.net/simevidas/HMJcy/

注意:我必须将 INPUT 元素上的 id 属性替换为 class 属性,因为 ID 在页面上必须是唯一的,并且您有多个 INPUT。

【讨论】:

  • 你认为我的问题的根源可能是使用多个 ID 吗?
  • 嗨,Šime 打败了我。 “children()”仅查找 IMMEDIATE(第一级)元素,对于 TABLE 将是 TBODY 元素等。正如答案所说,将“children”更改为“find”。问候
  • @Dirty 您可以使用多个 ID。您可以在页面上拥有任意数量的 ID。但是,所有 ID 都必须是唯一的。您不能有两个具有相同值的 ID 属性。由于您的页面上有多个 INPUT 元素,因此请给它们一个类而不是一个 ID。
  • 今天我学到了... $().children() != $().find()。你们太棒了,非常感谢。切换这些功能效果很好。
  • P.S.如果你有 var elem = $('#id') 之类的东西,那么稍后只做 var xyz = elem.find('tr'),而不是 var xyz = $(elem).find('tr')
猜你喜欢
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
相关资源
最近更新 更多