JQuery ассоциативный массив - PullRequest
0 голосов
/ 15 ноября 2010

Нужна небольшая помощь с тем, что, я уверен, довольно легко jquery

У меня есть следующая повторяющаяся разметка (несколько элементов списка)

<li>
<div class="answer">
<p><select class="dropdown">
..options..
</select></p>
</div>
<div class="commentBox">
..content..
</div>
</li>

В зависимости от значения выбранногоОпция при загрузке страниц, "CommentBox" будет показан / скрыт.

Я пробовал следующий jquery

var dd = $('.dropdown');
var com = $('.commentBox');


dd.each(dd, function(n, val){
if($(this).val() == 'whatever'){
   com[n].setStyle('display', 'none');
}
});

Я получаю сообщение об ошибке "b.apply не является функцией"

Так что в моей голове, как это должно работать - если это первый выпадающий список, показать / скрыть первый div "commentBox".Если это второй выпадающий список, тогда покажите / скройте второй div "commentBox".И так далее.

Я думаю, что попал в беспорядок, пробуя различные техники jquery, поэтому я уверен, что здесь есть десятки возможностей.Спасибо

Ответы [ 3 ]

1 голос
/ 15 ноября 2010

Ваша проблема в том, что вы передаете дополнительный (первый) параметр в each.
each принимает набор в качестве первого параметра только при статическом вызове.
Другими словами:

$.each(dd, function() { ... });

или

dd.each(function() { ... });

Обратите внимание, что вы можете сделать свой код более понятным, изменив его на

$(this).closest('li').find('.commentBox').hide();
0 голосов
/ 15 ноября 2010

Попробуйте

var dd = $('.dropdown'),
    com = $('.commentBox');

dd.each(function(n, ele) {
    if( $(ele).val() == 'one') {
        com.eq(n).css('display', 'none');
    }
});

, использовав .eq(n) вместо [n]. Последний будет выдавать узел DOM, а мой - объект jQuery, для которого вы можете вызвать css() (как вы видите, я переключился сsetStyle что это за функция в любом случае css()).


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

$('.dropdown').each(function(n, ele){
    var $ele = $(ele);
    if ($ele.val() == "one")
        $ele.closest('li').find('.commentBox').hide();
});
0 голосов
/ 15 ноября 2010

Когда вызывает .each() как этот , вы даете ему только один аргумент, function.

dd.each(function(n, val){
    if($(this).val() == 'whatever'){
       com[n].setStyle('display', 'none');
    }
});

Или вы можете передать 2 аргумента, если вы вызываетеjQuery.each вот так :

$.each(dd, function(n, val){
    if($(this).val() == 'whatever'){
       com[n].setStyle('display', 'none');
    }
});

Эта вторая версия предназначена для итерации по любому типу коллекции.

Вы объединяли два.


РЕДАКТИРОВАТЬ: Я думаю, я лучше объясню, что setStyle в коде OP, и не является непосредственной причиной проблемы под рукой.

У меня нет способа узнать, если OPрасширен элементы DOM с дополнительными методами.Таким образом, я могу только предположить, что размещение такого метода является правильным.

...