2010-02-16 2 views
2

Прежде всего, после «тестирования» некоторое время я должен сказать, что stackoverflow действительно круто!

На мой вопрос: Я хочу, чтобы проверить, если $ (это) имеет не любые родители, которые имеют класс или идентификатор, указанный в JS-массива.

К настоящему времени я сделал это с помощью «eval», но Энди Э. просто убедил меня, что лучше отказаться от «eval». Однако я не знаю, как это сделать в этом случае.

Здесь довольно много из того, что я сделал:

var testthis = '!(($(this).parents("'+<MY_ARRAY>.join('").length > 0 || $(this).parents("')+'").length > 0)'; 
if (eval(testthis)) { 
    .... 
} 

Если кто-нибудь достаточно любезен, чтобы ответить на мой вопрос, я должен извинить, что я не могу читать (и комментарий или скорость) его/ее ответ в следующие несколько часов. Сожалею!

+1

+1 Для симпатии SO. Но, как вы уже видели, вы почти никогда не должны использовать 'eval', особенно если вы новичок в языке. –

+0

спасибо за +1, но что означает SO? Я просто нашел «значительное другое» ;-) – speendo

ответ

2

Попробуйте это, не Eval не требуется:

if(!$(this).parents(<MY_ARRAY>.join(', ')).length) { 
//elem has none of those parents 
} 

MY_ARRY в этом случае содержит такие вещи, как ".class1" ," .class2" , "# ID1", "#" id2

Альтернативно медленнее но лет можно проверить в обоих случаях, если массив просто строки:

if(!$(this).parents("." + <MY_ARRAY>.join(', .')).length && 
    !$(this).parents("#" + <MY_ARRAY>.join(', #')).length) { 
//elem has none of those parents 
} 

MY_ARRY в этом случае содержит такие вещи, как «class1», «class2», «ID1», «ID2», но идентификаторы могли соответствовать как # class1 может быть совпадением, так что это l желательно.

+1

Почему вы добавляете котировки в селектор? Предполагая, что элементы массива уже добавлены с помощью «#» или «.». в зависимости от ситуации, это должно быть просто 'theArray.join (',')'. Это будет строка, а строка - это селектор. – Pointy

+0

@Pointy - Я понял, что вы сейчас имеете в виду, укороченный выше, спасибо! –

+0

Спасибо за ваш ответ! Кажется, это здорово, однако у меня не было возможности проверить его. Я буду отмечать ваш ответ как принятый, как только проверю его. Спасибо! – speendo

0

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

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