ti-enxame.com

Como encontro o elemento mais próximo com o jQuery

Eu tenho o seguinte código 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>

Preciso descobrir em qual botão clico e depois adicionar algum texto ao campo de texto de entrada mais próximo.
Por exemplo. se eu clicar no botão no primeiro <td>, preciso inserir algum texto no campo de texto related_image.

Eu tentei com o jQuery a seguir, mas não está funcionando:

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

(Estou apenas recuperando o nome das entradas para teste.)

Eu acho que talvez precise usar find e/ou siblings. Mas não sei bem como.

Qualquer ajuda apreciada.

EDITAR

Eu apenas consegui usar esse código
addImageEvent = jQuery(this).prevAll("input[type=text]:first")

Usar prevAll é uma má escolha?

16
Steven

Experimentar:

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

O método closest() que você está usando encontra o ancestral mais próximo, que não é o que você deseja aqui.

26
cletus

.closest() localiza um pai, nesse caso, você precisa .siblings() , assim:

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

Ou se o formato for sempre consistente como o seu exemplo, basta usar .prev() , assim:

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

Aqui está uma implementação 'mais próxima' que visa descendentes em vez de pais:

$.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;
};
3
Nathan Bubna