2009-03-30 1 views
42

Рассмотрите следующий HTML. Если у меня есть ссылка JSON к элементу < кнопку >, как я могу получить ссылку на внешний < тр > элемента в обоих случаяхЕсть ли селектор/метод jQuery, чтобы найти определенный родительский элемент n уровней вверх?

<table id="my-table"> 
    <tr> 
     <td> 
      <button>Foo</button> 
     </td> 
     <td> 
      <div> 
       <button>Bar</button> 
      </div> 
     </td> 
    </tr> 
</table> 

<script type="text/js"> 
    $('#table button').click(function(){ 
     //$(this).parent().parent() will work for the first row 
     //$(this).parent().parent().parent() will work for the second row 
     //is there a selector or some magic json one liner that will climb 
     //the DOM tree until it hits a TR, or do I have to code this myself 
     //each time?    
     //$(this).???? 
    }); 
</script> 

Я знаю, что я мог бы особый случай, каждое условие, но я больше заинтересованный «каким бы глубоким вы ни были, поднимитесь на дерево, пока не найдете решение стиля элемента X». Нечто подобное, но более JQuery как/менее многословным

var climb = function(node, str_rule){ 
    if($(node).is(str_rule)){ 
     return node; 
    } 
    else if($(node).is('body')){ 
     return false; 
    } 
    else{ 
     return climb(node.parentNode, str_rule); 
    } 
}; 

Я знаю о методе родительского (выражение), но от того, что я видел это позволяет фильтровать родителей на один уровень вверх и не залезть на дерево, пока вы нашли выражение (я хотел бы пример кода доказывает меня неправильно)

ответ

85

parents функция делает то, что вы хотите:

$(this).parents("tr:first"); 
+8

Надеюсь, вы не Я добавил ссылку на документацию. –

+3

Абсолютно, спасибо! Это то, что разрешено «Редактировать чужие сообщения»;) – Seb

+1

Ха, это смешно. Я задавался вопросом, почему Visual jQuery перечислил родительский (expr) дважды; оказывается, я полностью отделял s в конце. –

39

Кроме того, если вы используете JQuery 1.3+ вы можете использовать метод closest

$(this).closest("tr"); 
+4

Просто хотел добавить, что« самые близкие »и« родители »очень похожи, но имеют небольшую разницу. Вы можете прочитать больше [здесь] (http://api.jquery.com/closest/#entry-longdesc). В целом, я думаю, что самый близкий метод более эффективен для этого конкретного сценария. – aug

+0

hmm, очень легко понять это название функции. –

0

не JQuery, но эта опция работает намного лучше

node.contains (otherNode)

В Node.contains() метод возвращает логическое значение, указывающее узел является ли потомком данный узел или нет

https://developer.mozilla.org/en/docs/Web/API/Node/contains

 Смежные вопросы

  • Нет связанных вопросов^_^