2015-05-30 2 views
0

Итак, что я пытаюсь достичь, это способ проверить, начал ли какой-либо из родителей родителей какой-либо элемент. Вот как далеко я зашел:jQuery, если какой-либо из родителей родителей начинается с

$('.element').click(function(e){ 
    if($(this).is('[href^="X"')){ 
     // How to check if the clicked element's href begins with X 
    } 
}); 

Но это не то, что я хочу. Я хочу проверить, есть ли у какого-либо из родителей элемента href, начинающегося с чего-то.

Любые идеи?

Gustaf

+0

Может включать 'html' на вопрос? – guest271314

+0

@ guest271314 Я не думаю, что это необходимо для решения этой проблемы. –

ответ

2

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

$('.element').click(function(e){ 
    // here we use a terribly-, but meaningfully-, named variable 
    // to hold the Boolean result of the assessment; 
    // the assessment looks from the clicked element up through 
    // the ancestors for the first <a> element matching the 
    // attribute-starts-with selector ([href^=x]) 
    // this will return either 1 or 0 elements. 
    // we check the length; if it's equal to 1 then the ancestor 
    // has an href starting with x, if it's 0 then there is either 
    // no ancestor <a> element or no ancestor <a> element with a 
    // href matching the attribute-starts-with selector: 
    var ancestorAnchorStartsWithX = $(this).closest('a[href^=x]').length === 1; 
}); 

Это стоит упомянуть, как @A. Wolff did, в комментариях ниже, что:

& hellip; closest() [также проверяет] элемент.

Это означает, что если сам клике элемент соответствует селектор, подаваемое на ближайший (и, следовательно, является <a> элемент с href начиная с x), то оценка возвращает истину, даже если это не является предком элемента. Я считал эту функцию – при записи селектора –, но я забыл подробно, что в самом ответе.

Если это считается ошибкой, то вариант с parents('a[href^=x]') вместо closest('a[href^=x]') будет более уместным для вашего прецедента.

Ссылки:

+0

Элегантное решение, будет отмечать как решение как можно скорее! Cheers –

+1

В качестве побочного примечания 'ближайший()' проверяет сам элемент. Было бы более целесообразно использовать 'parents()' вместо этого, даже я думаю, что это не имеет особого значения в конкретном случае использования OP –

+0

. Вы очень рад, я рад, что помог! :) И, @A.Вольф, я не упоминал об этом, но я предположил, что в этом случае это будет функция (а не ошибка), в случае, если события щелчка могут распространяться на этот элемент предка ''. Но да: я должен был упомянуть об этом, подумав об этом. –

0

Это то, что вы хотите:

$('.element').click(function(e){ 
     var $parents=$(this).parents(); 
     var matches=$parents.filter('[href^="x"]'); 
     if(matches.length){ 
     } 

    } 
}); 
+0

Вы должны проверить: '$ (this) .parents ('[href^=" x "]'). Length' –

+0

@ A.Wolff какая разница? – user1167442

+0

В вашем случае (после фиксации опечатки) 'var matches = $ parents.filter ('[href^=" x "]');', 'matches' всегда будет правдой –

1

$(".element").click(function(e) { 
 
    var res = $(this).parents("[href^=X]").is("*"); 
 
    console.log(res); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> 
 
</script> 
 

 
<a href="Xabc123"> 
 
    <div class="element">click</div> 
 
    </a>

+1

Я видел много вариантов, но никогда этого :) –

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