Подтвердить что ты не робот

Как найти ближайший элемент с 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.

Я пробовал с помощью jQuery followin, но он не работает:

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 плохой выбор?

4b9b3361

Ответ 1

Try:

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

Метод closest(), который вы используете, находит ближайшего предка, который вам не нужен.

Ответ 2

.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);
});

Ответ 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;
};