How To Select First Ancestor That Matches A Select

2019-01-25 01:53发布

问题:

General:

How can I select the first matching ancestor of an element in jQuery?

Example:

Take this HTML block

<table>
    <tbody>
        <tr>
            <td>
                <a href="#" class="remove">Remove</a>
            </td>
        </tr>
        <tr>
            <td>
                <a href="#" class="remove">Remove</a>
            </td>
        </tr>
    </tbody>
</table>

I can remove a row in the table by clicking "Remove" using this jQuery code:

$('.remove').click(function(){
    $(this).parent().parent().hide();
    return false;
});

This works, but it's pretty fragile. If someone puts the <a> into a <div>, for example, it would break. Is there a selector syntax in jQuery that follows this logic:

"Here's an element, now find the closest ancestor that matches some selection criteria and return it"

Thanks

回答1:

That would be closest:

$(this).closest('tr').hide();


回答2:

I prefer using closest as @Kobi points out (+1) as it seems to be the most concise way to do that. Just to point out, you can also use parents:

$(this).parents("tr:first")


回答3:

You can pass a selector to the parent argument I believe.

$('.remove').click(function(){
  $(this).parents("tr:first").hide();
  return false;
});

Or you can use closest as indicated by another answer.

$('.remove').click(function(){
  $(this).closest("tr").hide();
  return false;
});


回答4:

Assuming you're using jQuery 1.4, you can use .parentsUntil() which will return all of the ancestors upto but NOT including the selected ancestor.

So in your case I would go with something like this:

$('.remove').click(function(){
    $(this).parentsUntil("tr").parent().hide();
    return false;
});