#javascript #jquery #html
#javascript #jquery #HTML
Вопрос:
Вчера я опубликовал вопрос, в котором просил помочь с написанным мной сценарием переключения изображений, спасибо всем, кто мне помог. Я расширил скрипт и столкнулся с проблемой, которую я не могу определить, в чем проблема.
HTML:
<div id="feature-image">
<h1><span>A random heading</span></h1>
</div>
<div id="feature-links">
<a class="a1" href="#">1</a>
<a class="a2" href="#">2</a>
<a class="a3" href="#">3</a>
</div>
JS Jquery:
$(function(){
$('#feature-links a').click(function() {
if ($(this).hasClass('a-active')) {
return false;
} else {
var image = $(this).attr('class');
switchToImg(image, function() {
$('#feature-links a .a-active').removeClass('a-active');
$('#feature-links .' image).addClass('a-active');
});
}
});
function switchToImg(image){
$('#feature-image').fadeOut('300', function(){
$('#feature-image').css('background-image','url(images/main_' image '.jpg)');
$('#feature-image').fadeIn('300');
});
};
В скрипте, который я проверяю на наличие a click
в <a>
теге, каждый <a>
тег имеет класс (a1, a2, a3 и т.д.). Кроме того, активный <a>
имеет класс ‘a-active’.
Я пытаюсь проверить a-active
, установлен ли этот параметр:
if ($(this).hasClass('a-active')) {
return false;
}
и вырежьте скрипт там, чтобы он не исчезал в одном и том же изображении. Однако изображение продолжает исчезать и исчезать, несмотря на то, что я возвращаю false при проверке класса a-active
и возвращаю false. Я уверен, что проблема в разделе, который я использую .addClass
, и .removeClass
но мои знания Javascript и Jquery слишком слабы, чтобы я мог правильно отладить это.
Не мог бы кто-нибудь критически взглянуть на это, пожалуйста?
Заранее спасибо.
Ответ №1:
Вы неправильно передали анонимную функцию своей switchToImg()
функции, которая ее не принимает.
Вместо этого попробуйте следующий JS:
$(function() {
$('#feature-links a').click(function() {
if ($(this).hasClass('a-active')) {
return false;
} else {
var image = $(this).attr('class');
switchToImg(image);
}
});
function switchToImg(image) {
$('#feature-image').fadeOut('300', function() {
$('#feature-image').css('background-image', 'url(images/main_' image '.jpg)');
$('#feature-image').fadeIn('300');
});
$('#feature-links a.a-active').removeClass('a-active');
$('#feature-links .' image).addClass('a-active');
};
});
Протестировано в jsFiddle.
РЕДАКТИРОВАТЬ: я удалил вызов .stop()
, в этом не было необходимости, и ввел ошибку.
Комментарии:
1. Спасибо, Грег! Это решило мою проблему! 🙂
2. Если вам интересно, я ужесточил свой код в этой редакции jsFiddle: jsfiddle.net/rPFTd/3 .
3. Я действительно ценю, что вы это делаете, мой код был хм… как бы это сказать … любитель! Это на самом деле дало мне представление о точечной нотации, которую я никогда по-настоящему не ценил. Спасибо (еще раз!)
4. Если вы хотите получить точную оценку качества вашего кода jQuery, попробуйте использовать jQueryLint . Он очень быстро обнаружит ошибки, такие как отсутствие кэширования результатов селектора! Другое увеличение скорости заключается в использовании
$(selector, context)
перегрузки функции jQuery для ограничения того, где движок должен искать что-то, соответствующее селектору.5.
switchToImg()
Функция в значительной степени не изменилась по сравнению с моим первоначальным ответом — все, что я сделал, это кэшировал$('#feature-image')
селектор в переменной и использовал цепочку. Последние 2 строки — это то, что удаляетa-active
класс и устанавливает его на элемент, который только что щелкнул. К вашему сведению, я также снова сделал другую версию, немного отличающуюся: jsfiddle.net/rPFTd/7 .
Ответ №2:
Попробуйте изменить $('#feature-links a .a-active')
на $('#feature-links a.a-active')
.
Пробел между a и .a-active означает, что вы пытаетесь сопоставить потомков <a> с классом a-active .
Ответ №3:
Вы можете использовать:not selector для фильтрации активного класса.
$(‘#ссылки на объекты a:not(.a-active)’)