Событие Jquery click повторяется… иногда

0

У меня есть странная (раздражающая) проблема с небольшим дополнением jquery, которое я кодирую. Он предназначен для управления небольшой вкладкой nav для контента на странице, это не должно быть большой проблемой. В настоящее время в нем есть 3 кнопки (вкладки), и система предназначена для постепенного исчезновения текущей вкладки и содержимого и перехода на новую, когда вы нажимаете на любую из вкладок.

jsfiddle

HTML выглядит следующим образом:

            <div class="fixed-wing-nav-cont">
                <div class="fixed-wing-nav">
                    <div class="fixed-wing-nav-item" id="wing-nav-1">Features</div>
                    <div class="fixed-wing-nav-item"  id="wing-nav-2">Benefits</div>
                    <div class="fixed-wing-nav-item active"  id="wing-nav-3">Screenshots</div>
                </div>
            </div>

            <div class="fixed-wing-tab-cont">
                <div id="fixed-wing-tab-1">
                    Features Tab
                </div>
                <div id="fixed-wing-tab-2">
                    Benefits Tab
                </div>
                <div id="fixed-wing-tab-3" class="active">
                    <img src="images/screens.png" alt="screens" /> <a href="#" class="red">VIEW ALL</a>
                </div>
                <div class="clear"></div>
            </div>

И CSS, привязанный к нему, на случай, если это может быть важно, заключается в следующем:

.fixed-wing-nav-cont{
    width:100%;
    border-bottom:1px solid #747474;
    margin:20px 0;
}

.fixed-wing-nav{
    display:table;
    border-spacing:5px 0;
    border-collapse:separate;
    margin-left:-5px;
}

.fixed-wing-nav-item{
    margin-right:40px;
    height:40px;
    color:#1c5fa9;
    font-size:16px;
    border-left:1px solid #1c5fa9;
    border-top:1px solid #1c5fa9;
    border-right:1px solid #1c5fa9;
    text-align:center;
    padding:0 10px;
    display:table-cell;
    vertical-align:middle;
    cursor:pointer;
}

.fixed-wing-nav-item.active{
    color:#fff;
    background-color:#1c5fa9;
}

.fixed-wing-tab-cont{
    position:relative;
    width:100%;
    height:400px;
}

.fixed-wing-tab-cont>div{
    position:absolute;
    top:0px;
    left:0px;
    width:100%;
    height:400px;
    overflow:hidden;
    display:none;
}

.fixed-wing-tab-cont>div.active{
    display:block;
}

.fixed-wing-tab-cont img{
    border:none;
}

Компонент JQuery очень прост - я знаю, что есть более элегантные способы сделать это, но я решил пойти на то, что означало бы более быстрое кодирование и более простое:

<script type="text/javascript">
$('#wing-nav-1').click(function(){
    $('div.fixed-wing-nav-item').removeClass("active",function(){
        $('#wing-nav-1').addClass("active");
    });
    $('#fixed-wing-tab-3').removeClass("active");
    $('.fixed-wing-tab-cont>div').fadeOut("fast",function(){
        $('#fixed-wing-tab-1').fadeIn("fast");
    });
});

$('#wing-nav-2').click(function(){
    $('div.fixed-wing-nav-item').removeClass("active",function(){
        $('#wing-nav-2').addClass("active");
    });
    $('#fixed-wing-tab-3').removeClass("active");
    $('.fixed-wing-tab-cont>div').fadeOut("fast",function(){
        $('#fixed-wing-tab-2').fadeIn("fast");
    });
});

$('#wing-nav-3').click(function(){
    $('div.fixed-wing-nav-item').removeClass("active",function(){
        $('#wing-nav-3').addClass("active");
    });
    $('#fixed-wing-tab-3').removeClass("active");
    $('.fixed-wing-tab-cont>div').fadeOut("fast",function(){
        $('#fixed-wing-tab-3').fadeIn("fast");
    });
});

</script>

Я загружаю JQuery 1.9 прямо с сайта jquery. Теперь проблема заключается в следующем: страница открывается с загруженной третьей вкладкой, без проблем. Если я нахожусь на первой вкладке, она отлично работает: третья вкладка исчезает, первая затухает, а "активное" состояние с кнопки вкладки перемещается с третьей на первую. Если я затем перейду на вторую вкладку, она также отлично работает. Однако, если я попытаюсь перейти с любой вкладки на третью или с третьей на вторую, она дважды воспроизведет анимацию, что не имеет никакого смысла: все три вкладки работают с одним и тем же кодом. Я просматривал код снова и снова в течение часа, и я не понимаю, почему это происходит. Почему первая вкладка работает отлично, а третья имеет такие проблемы? Я попытался удалить "активное" состояние из всех элементов в HTML (таким образом, запуск закладки/содержимого пуст), и проблема все еще происходит.

Может ли кто-нибудь помочь мне здесь? Это просто не имеет для меня никакого смысла:\

  • 0
    Вы должны всегда вызывать .stop(true, true) перед анимацией элемента, чтобы убедиться, что все предыдущие анимации в очереди закончены. документация
  • 0
    Для каждого клика вы удаляете класс active из tab-3. Это нормально?
Показать ещё 1 комментарий
Теги:
tabs

2 ответа

2
Лучший ответ

Вы уменьшали все ваши DIV под классом.fixed-wing-tab-cont. Таким образом, загрузка контента в два раза на самом деле просто исчезла и снова исчезла. Вы можете исключить DIV с активным классом, используя селектор CSS 'not' в jQuery. + Изменить

$('#wing-nav-3').click(function(){
    $('div.fixed-wing-nav-item').removeClass("active",function(){
        $('#wing-nav-3').addClass("active");
    });
    $('#fixed-wing-tab-3').removeClass("active");
    $('.fixed-wing-tab-cont>div').fadeOut("fast",function(){
        $('#fixed-wing-tab-3').fadeIn("fast");
    });
});

в

$('#wing-nav-3').click(function(){
    $('div.fixed-wing-nav-item').removeClass("active");
    $('#wing-nav-3').addClass("active");
    $('#fixed-wing-tab-3').removeClass("active");
    $('.fixed-wing-tab-cont>div:not(.active)').fadeOut("fast");
    $('#fixed-wing-tab-3').fadeIn("fast");
});

В этом случае нет необходимости использовать функции обратного вызова. Фактически, метод removeClass не имеет возможности обратного вызова. Возможно, вы заметили, что ваш активный класс вкладки не применялся к вкладкам, на которые вы нажали, из-за этого.

Обновлен jsFiddle

  • 0
    Спасибо, это сделал! Хотя, чтобы упростить его, я в итоге удалил «активный» класс из содержимого div, вместо этого поместив несколько встроенных css, чтобы он показывался, но это прекрасно работает без повторения. Мне все еще интересно, почему ошибка не повлияла на первый div или когда я перешел между первым и вторым div, хотя. РЕДАКТИРОВАТЬ: Кстати, активный класс на самом деле должным образом применяется к ссылкам вкладки, даже если определение функции говорит, что это не должно.
0

Вы удаляете "активный" класс из div-фидов с фиксированным крылом, но всегда удаляете "активный" класс из "# fixed-wing-tab-3", независимо от того, какая из вкладок активна. Если вы удалили "активный" класс из ".fixed-wing-tab-cont> div", а затем добавили "активный" класс на фиксированный флажок, который вы должны сделать fadeIn, он должен работать.

  • 0
    Удаление происходит только потому, что это единственная вкладка, использующая активные - остальные вкладки просто анимируются с использованием fadein / out, а не с использованием класса «active». Способ, которым jQuery управляет анимацией, заключается в том, что он добавляет встроенный css к элементу, который постепенно исчезает, чтобы гарантировать, что его эффекты будут иметь приоритет над любым css, который может быть применен, так что на самом деле удалитьClass, который у меня есть, является избыточным. Я поставил его после того, как система начала глючить, и если вы протестируете код без него, вы увидите, что он все еще делает то же самое: \

Ещё вопросы

Сообщество Overcoder
Наверх
Меню