Как я могу сделать этот jQuery быстрее, чем то, что у меня есть?

В настоящее время я использую этот скрипт для типа системы «вкладки». При нажатии на одну вкладку все остальные скрываются. Все они div. Но сейчас я не думаю, что он исчезает достаточно быстро, прежде чем загрузится выбранный div. В конечном итоге он смещается под выбранный элемент div и теперь отображается.

Мне не нужен переключатель, потому что, как вы видите, у меня есть 5 вкладок, которые я хочу открыть при нажатии на соответствующий им div «_s». Исчезать, исчезать.

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

Буду признателен за любую помощь. Благодарю вас!

<script>
$("#teach_one").click(function() {
    $("#teach_one_s").fadeIn("slow");
    $("#teach_two_s").fadeOut("fast");
    $("#teach_three_s").fadeOut("fast");
    $("#teach_four_s").fadeOut("fast");
    $("#teach_five_s").fadeOut("fast");
});

$("#teach_two").click(function () {
    $("#teach_two_s").fadeIn("slow");
    $("#teach_one_s").fadeOut("fast");
    $("#teach_three_s").fadeOut("fast");
    $("#teach_four_s").fadeOut("fast");
    $("#teach_five_s").fadeOut("fast");
});

$("#teach_three").click(function () {
    $("#teach_three_s").fadeIn("slow");
    $("#teach_one_s").fadeOut("fast");
    $("#teach_two_s").fadeOut("fast");
    $("#teach_four_s").fadeOut("fast");
    $("#teach_five_s").fadeOut("fast");
});

$("#teach_four").click(function () {
    $("#teach_four_s").fadeIn("slow");
    $("#teach_one_s").fadeOut("fast");
    $("#teach_two_s").fadeOut("fast");
    $("#teach_three_s").fadeOut("fast");
    $("#teach_five_s").fadeOut("fast");
});

$("#teach_five").click(function () {
    $("#teach_five_s").fadeIn("slow");
    $("#teach_one_s").fadeOut("fast");
    $("#teach_two_s").fadeOut("fast");
    $("#teach_three_s").fadeOut("fast");
    $("#teach_four_s").fadeOut("fast");
});
</script>

Вот мой HTML по вашему запросу:

<ul class="noselect teach_home_navigator_tabs">

<li id="teach_one">

</li>
<li id="teach_two">

</li>
<li id="teach_three">

</li>
<li id="teach_four">

</li>
<li id="teach_five">

</li>

</ul>


<div class="infotab teach_round" id="teach_one_s">  
stufff
</div>

<div class="infotab teach_round" id="teach_two_s">  
stufff
</div>

<div class="infotab teach_round" id="teach_three_s">    
stufff
</div>

<div class="infotab teach_round" id="teach_four_s"> 
stufff
</div>

<div class="infotab teach_round" id="teach_five_s"> 
stufff
</div>

person Josh    schedule 23.03.2011    source источник
comment
Если вы опубликуете свою разметку или репрезентативный образец, мы, вероятно, сможем упростить ваш jQuery. Довольно много, я полагаю.   -  person David says reinstate Monica    schedule 23.03.2011
comment
если бы вы показали свой HTML, это было бы проще.   -  person hunter    schedule 23.03.2011
comment
Это не позволит мне добавить HTML. пишет, что я разместил слишком много ссылок.   -  person Josh    schedule 23.03.2011
comment
посмотрите мой ответ, связанный с вашей разметкой: stackoverflow.com/questions/5399632/   -  person hunter    schedule 23.03.2011


Ответы (6)


Не видя вашей разметки, я не могу быть уверен, но и просто для упрощения вашего jQuery и уменьшения повторения вы можете попробовать использовать что-то вроде этого:

$('div[id^="teach_"]').click(
    function(){
        var showThis = this.id + '_s';
        $('#' + showThis).fadeOut('slow',
            function(){
                $('div[id$="_s"]').not($(this)).fadeIn('fast');
            });
    });

Отредактировано в ответ на html, предоставленный @Josh.

$('.each_home_navigator_tabs li').click(
    function(){
        var showThis = this.id + '_s';
        $('.infotab:visible').fadeOut('slow',
            function(){
                $('#' + showThis).fadeIn('fast');
            });
    });

Использованная литература:

person David says reinstate Monica    schedule 23.03.2011
comment
Почему fadeOut является обратным вызовом для fadeIn? Я думаю, должно быть наоборот - person Eric Fortis; 23.03.2011
comment
да, он прав... если бы я мог видеть HTML, я думаю, это еще проще, чем это - person hunter; 23.03.2011
comment
@ Эрик, да, я бы тоже так предпочел, но, глядя на то, как он настроил свою очередь fx, кажется, что он хочет fadeIn() до fadeOut(). Хотя это меня несколько смущает. - person David says reinstate Monica; 23.03.2011
comment
И на самом деле нет причин скрывать весь остальной контент, поскольку в любой момент времени ДОЛЖЕН отображаться только один. Я ненавижу этого парня... j/k, я люблю его - person hunter; 23.03.2011
comment
@hunter, я делаю одно простое предложение по вашему ответу и... =D да, ты прав, но посмотри на его jQuery . Я имею в виду: тьфу. Я просто прикрываю основы и пытаюсь удостовериться, правда... но кто знает, что еще там происходит? =б - person David says reinstate Monica; 23.03.2011
comment
мы действительно придумали одно и то же решение, но нет никакого способа узнать. Мы просто сидим, ждем и надеемся, что Джош покажет нам разметку GD. - person hunter; 23.03.2011
comment
@hunter, да, в значительной степени. Ну, если честно, я уже иду спать (ура, по британскому времени...), но я встану и посмотрю, не было ли обновлений к утру. На всякий случай... =) - person David says reinstate Monica; 23.03.2011
comment
@ Эрик, мой ответ отредактировал после того, как перечитал вопрос и увидел бит «Исчезать, исчезать». Надо было увидеть это в первый раз, правда... =/ - person David says reinstate Monica; 23.03.2011
comment
Добавьте href в свой вопрос в форме www.domain.com или www dot domain dot com, и кто-то с достаточным количеством представителей отредактирует его для вас. - person David says reinstate Monica; 23.03.2011
comment
Это будет работать, если на сайте нет других несвязанных идентификаторов, которые заканчиваются на _s или начинаются с обучения. например: как what_s или teach_whatever - person Pinkie; 23.03.2011
comment
@ Джош, я отредактировал вопрос около трех минут назад (на момент написания этой статьи) ... =) - person David says reinstate Monica; 23.03.2011
comment
@Джош, не за что! Вы проверили, помогает ли какой-либо из опубликованных ответов решить вашу проблему? - person David says reinstate Monica; 23.03.2011
comment
@ Джош, у тебя была возможность протестировать какой-нибудь из опубликованных скриптов jQuery? Ваша проблема решена? Если проблема не решена, отредактируйте свой вопрос, включив в него описание новых проблем или «что произошло». В противном случае, если проблема решена, примите и/или проголосуйте за любые ответы, которые оказались вам полезными. - person David says reinstate Monica; 24.03.2011

Вы можете переписать свой код следующим образом. Все #id fadeOut кроме того, на который нажали, это faddIn

$("#teach_one, #teach_two, #teach_three, #teach_four, #teach_five").click(function() {   
    var idd = this.id;
    $("#teach_one_s, #teach_two_s, #teach_three_s, #teach_four_s, #teach_five_s").fadeOut("fast ");
    $("#"+idd+"_s ").fadeIn("slow");
});
person Hussein    schedule 23.03.2011
comment
сравнивая это с Дэвидом, кажется, что это работает быстрее, jsperf.com/teach - person Hussein; 23.03.2011
comment
@Haochi, я не думаю, что ты понимаешь, как работает jsperf. Чем выше число, тем быстрее. Ваш код на 32% медленнее. - person Hussein; 23.03.2011
comment
Хм, не в Chrome! Хотя я приму то, что сказал. :) - person Haochi; 23.03.2011
comment
@Haochi, я согласен, что в Chrome у вас на 16% быстрее, но и в IE, и в Firefox мой на 38-45% быстрее, чем у вас и у Дэвида :-). Хотя мне понравилось, как вы подошли к решению. - person Hussein; 23.03.2011

Обновлено на основе вашего HTML

<ul class="noselect teach_home_navigator_tabs">
    <li id="teach_one">one</li>
    <li id="teach_two">two</li>
    <li id="teach_three">three</li>
    <li id="teach_four">four</li>
    <li id="teach_five">five</li>
</ul>

<div class="infotab teach_round" id="teach_one_s">stufff</div>
<div class="infotab teach_round" id="teach_two_s">stufff</div>
<div class="infotab teach_round" id="teach_three_s">stufff</div>
<div class="infotab teach_round" id="teach_four_s">stufff</div>
<div class="infotab teach_round" id="teach_five_s">stufff</div>

и вы можете легко подключить некоторые функции, например:

$(function(){
    $(".infotab").hide(); // hide all content on load
    $("#teach_home_navigator_tabs li").click(function(e){
        var id = this.id;
        var $current = $("#infotab:visible"); // get the currently selected tab
        if ($current.length == 0) { }           
            $(current.fadeOut("fast", function() { // fade out current
                $("#" + id = "_s").fadeIn("slow"); // fade in selected
            });
        }
        else { $("#" + id = "_s").fadeIn("slow"); } // fade in selected if no current
    });

    $(".teach_home_navigator_tabs li:first").click(); // click first tab on load
});
person hunter    schedule 23.03.2011
comment
this.id, по общему мнению, немного быстрее и дает тот же результат. :) - person David says reinstate Monica; 23.03.2011
comment
Извините, я не пытался заставить вас чувствовать себя глупо, но это одна из тех ошибок, которые я много совершал, когда впервые начал работать с jQuery... просто пытался помочь =) - person David says reinstate Monica; 23.03.2011
comment
просто что-то накрутил, но да, мне редко нужен id, потому что я не пишу разметку, которая потребовала бы таких хакеров. - person hunter; 23.03.2011
comment
+1 за быстрое взбивание и обычное избегание хакеров =) - person David says reinstate Monica; 23.03.2011
comment
Привет, ребята, я не могу добавить свой HTML. Вот: - person Josh; 23.03.2011
comment
Был ли предоставлен этот html. Вы сами делаете?? - person Pinkie; 23.03.2011

Делайте так:

$("#teach_one").click(function() {
    $("#teach_one_s").fadeIn("slow", function() {
        $("#teach_two_s").fadeOut("fast");
        $("#teach_three_s").fadeOut("fast");
        $("#teach_four_s").fadeOut("fast");
        $("#teach_five_s").fadeOut("fast");
    });
});

Повторите для остальных, в основном это ждет завершения fadeIn, а затем вызывает функцию обратного вызова для fadeOut остальных.

Но ваш код может быть значительно короче ИМХО, если вы покажете свой html, держу пари, его можно сжать в одну привязку click.

person moe    schedule 23.03.2011

использовать:

$('#teach_four_s').animate({opacity:0},200)

где 200 миллисекунд для длительности эффекта

Это позволит вам лучше контролировать время перехода.

person Billy Moon    schedule 23.03.2011
comment
числа также работают вместо «быстрого»/«медленного» бизнеса… на самом деле нет причин использовать .animate. - person mpen; 23.03.2011

Вот мой HTML, который я использую.

<ul class="noselect teach_home_navigator_tabs">

stufff stufff stufff stufff stufff
person Josh    schedule 23.03.2011