Оператор jQuery switch работает изредка
Я довольно новичок в написании собственных функций jquery, и мне очень трудно отлаживать их, так как сообщения об ошибках не слишком полезны, когда они помещаются в google.
У меня есть навигационное меню для Привязок страниц, в котором при каждом щелчке экран прокручивается к привязке, элементы будут менять цвет в зависимости от того, какой из них и цвет наведения также изменится. Очень просто на самом деле, я думаю.
Прокрутка всегда работает, анимация работает время от времени, а наведение работает. обычно мне приходится дважды кликать по ссылке. Возвращаемое значение false работает только при первом нажатии на ссылку.
Здесь используются Плагины scrollTo и animate-colors.
Может ли кто-нибудь сказать мне, что я делаю не так?$(".scrolltoanchor").click(function() {
$('a').removeClass('selected');
$(this).addClass('selected');
$.scrollTo($($(this).attr("href")), {
duration: 750
});
switch ($(this).attr("id")) {
case 'personal':
$('.scrolltoanchor').animate({color: '#E4D8B8'});
$(".scrolltoanchor").hover(
function() {
$(this).css('color', 'blue');
},function(){
$(this).css('color', '#E4D8B8');
});
break;
case 'achievements':
$('.scrolltoanchor').animate({color: '#ffffff'});
$(".scrolltoanchor").hover(
function() {
$(this).css('color', 'red');
},function(){
$(this).css('color', '#ffffff');
});
break;
case 'skills':
$('.scrolltoanchor').animate({color: '#dddddd'});
$(".scrolltoanchor").hover(
function() {
$(this).css('color', 'orange');
},function(){
$(this).css('color', '#ffffff');
});
break;
}
return false;
});
Извините, что я прошу ложку, но я следовал тому, что я считал правильным синтаксисом из того, что я узнал. Есть ли что-то, что я должен знать, что останавливает эту работу, как я ожидаю?
EDIT: Извините, я забыл, я получаю эту ошибку на (в среднем) каждый второй щелчок по ссылке scrolltoanchor
Uncaught TypeError: не удается прочитать свойство' 0 ' из undefined
Я не могу определить реальную картину. Иногда кажется, что это происходит только на тех, которые не были нажаты раньше, иногда нет. Спасибо
2 ответа:
Вы выбрали неверный подход.
Вы должны привязать обработчики наведения один раз, и решить цвета, основанные на том, какой из них был нажат.
Самый простой способ, вероятно, хранить данные о цвете в таблице подстановки, где ключи являются идентификаторами элементов.
var ids = { personal: { over:'blue', out:'#E4D8B8' }, achievements: { over:'red', out:'#ffffff' }, skills: { over:'orange', out:'#dddddd' } }; var current = ids.personal;
Затем свяжите обработчики один раз и используйте
id
одного щелчка, чтобы установить набор цветовcurrent
.var scroll_anchors = $(".scrolltoanchor"); scroll_anchors.hover( function() { $(this).css( 'color', current.over ); },function(){ $(this).css( 'color', current.out ); }); scroll_anchors.click(function() { $('a.selected').removeClass('selected'); $(this).addClass('selected'); $.scrollTo($($(this).attr("href")), { duration: 750 }); current = ids[ this.id ]; // set the current color set based on the ID scroll_anchors.animate({ color: current.out }); return false; });
Когда вы вызываете
.hover()
несколько раз, вы не удаляете старые обработчики событий, вы просто добавляете новый. Каждый обработчик будет вызываться каждый раз. Сначала вам нужно позвонить.unbind("hover")
:$(".scrolltoanchor").unbind("hover").hover(function () { ... });
Вы также можете привязать к наведению вне оператора switch, чтобы исключить дублирование кода:
$(".scrolltoanchor").click(function () { $('a').removeClass('selected'); $(this).addClass('selected'); $.scrollTo($(this.href), { duration: 750 }); var off, on; switch (this.id) { case 'personal': off = '#E4D8B8'; on = 'blue'; break; case 'achievements': off = '#ffffff'; on = 'red'; break; case 'skills': off = '#dddddd'; on = 'orange'; break; } $('.scrolltoanchor') .animate({ color: off }) .unbind("hover") .hover(function () { $(this).css('color', on); }, function () { $(this).css('color', off); }); return false; });