Я проделываю некоторые махинации с jQuery, чтобы поставить маленькие значки плюса / минуса рядом с моими расширителями. Это похоже на файловые деревья Windows или расширители кода firebugs.
Это работает, но недостаточно конкретно.
Надеюсь, в этом есть смысл ...
$('div.toggle').hide();//hide all divs that are part of the expand/collapse
$('ul.product-info li a').toggle(function(event){
event.preventDefault();
$(this).next('div').slideToggle(200);//find the next div and sliiiide it
$('img.expander').attr('src','img/content/info-close.gif');//this is the part thats not specific enough!!!
},function(event) { // opposite here
event.preventDefault();
$(this).next('div').slideToggle(200);
$('img.expander').attr('src','img/content/info-open.gif');
});
<ul class = "product-info">
<li>
<a class = "img-link" href = "#"><img class = "expander" src = "img/content/info-open.gif" alt = "Click to exand this section" /> <span>How it compares to the other options</span>
</a>
<div class = "toggle"><p>Content viewable when expanded!</p></div>
</li>
</ul>
На странице есть множество тегов $('img.expander'), но я должен быть конкретным. Я пробовал функциональность next () (например, я использовал для поиска следующего div), но он говорит, что его undefined. Как я могу найти свой конкретный тег img.expander? Спасибо.
ИЗМЕНИТЬ, обновленный код в соответствии с решением Дугласа:
$('div.toggle').hide();
$('ul.product-info li a').toggle(function(event){
//$('#faq-copy .answer').hide();
event.preventDefault();
$(this).next('div').slideToggle(200);
$(this).contents('img.expander').attr('src','img/content/info-close.gif');
//alert('on');
},function(event) { // same here
event.preventDefault();
$(this).next('div').slideToggle(200);
$(this).contents('img.expander').attr('src','img/content/info-open.gif');
});



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы пробовали метод .siblings ()?
$(this).siblings('img.expander').attr('src','img/content/info-close.gif');
Вероятно, потому что img.expander является дочерним элементом нажатой кнопки $ (this), а не братом или сестрой.
Как насчет того, чтобы ваше событие щелчка переключало класс CSS на родительский элемент (в вашем случае, возможно, ul.product-info). Затем вы можете использовать свойства фона CSS для изменения фонового изображения для <span> вместо использования буквального <img> и попытки возиться с src. Вы также сможете отображать и скрывать свой div.toggle.
ul.product-info.open span.toggler {
background-image: url( "open-toggler.png" );
}
ul.product-info.closed span.toggler {
background-image: url( "closed-toggler.png" );
}
ul.product-info.open div.toggle {
display: block;
}
ul.product-info.closed div.toggle {
display: hidden;
}
Использование jQuery-функций навигации / спайдинга может быть медленным, если в DOM много элементов и глубокая вложенность. С помощью CSS ваш браузер будет быстрее отображать и изменять вещи.
ахах ... кажется неплохим решением. Посмотрим.
$(this).contents('img.expander')
Это то, что вам нужно. Он выберет все узлы, которые являются дочерними элементами вашего списка. В вашем случае все ваши изображения вложены внутри элемента списка, поэтому это отфильтрует только то, что вы хотите.
Работает удовольствие! Ты звезда.
извините за то, что я был привязан к моей маркировке Адама;)