如何使用jQuery找到最接近的元素

时间:2010-09-02 00:50:40

标签: jquery

我有以下HTML代码:

<td>
  <input type="text" size="40" value="" name="related_image" id="related_image">  
  <input type="button" class="button addImage" value="Get image url">
</td>
<td>
  <input type="text" size="40" value="" name="alternative_image" id="alternative_image">  
  <input type="button" class="button addImage" value="Get image url">
</td>

我需要弄清楚我点击了哪个按钮,然后在最近的输入文本字段中添加一些文字 例如。如果我点击第一个<td>中的按钮,则需要在related_image文本字段中输入一些文字。

我已尝试使用followin jQuery,但它不起作用:

jQuery('.addImage').click(function() {
  var tmp = jQuery(this).closest("input[type=text]").attr('name');
  alert(tmp);
});

(我只是检索输入名称以进行测试。)

我想我可能需要使用find和/或siblings。但我不太清楚如何。

任何帮助表示感谢。

修改

我刚设法使用此代码
addImageEvent = jQuery(this).prevAll("input[type=text]:first")

使用prevAll是一个糟糕的选择吗?

3 个答案:

答案 0 :(得分:26)

尝试:

var tmp = $(this).siblings(":text").attr("name");

您正在使用的closest()方法找到最近的祖先,这不是您想要的。

答案 1 :(得分:5)

.closest()找到父母,在这种情况下,您需要.siblings(),如下所示:

jQuery('.addImage').click(function() {
  var tmp = jQuery(this).siblings("input[type=text]").attr('name');
  alert(tmp);
});

或者,如果格式始终与您的示例一致,请使用.prev(),如下所示:

jQuery('.addImage').click(function() {
  var tmp = jQuery(this).prev().attr('name');
  alert(tmp);
});

答案 2 :(得分:3)

这是一个'最接近'的实现,旨在代替后代而不是父母:

$.fn.nearest = function(selector) {
    var nearest, node = this, distance = 10000;
    node.find(selector).each(function(){
        var n = $(this),
            d = n.parentsUntil(node).size();
        if (d < distance) {
            distance = d;
            nearest = n;
        } else if (d == distance) {
            nearest.add(this);
        }
    });
    return nearest;
};