Как правильно остановить рекурсию?

270
20 декабря 2016, 22:57

Помогите пожалуйста, есть функция, суть ее - это сделать эффект текста, который набирается. То есть при переключении слайда она принимает 2 фразы: одна будет невидимая, вторая берется и по одному символу набирается. После того, как функция завершится слайд переключается и все по новой. Тот код, который я демонстрирую, рабочий. Но мне нужно еще как то ее усовершенствовать, чтобы можно было досрочно завершать и переключится на второй слайдер. Только что-то мозгами не могу дойти до этого. Буду благодарен за любую подсказку.

Его кривую роботу при переключении можете увидеть здесь.

http://klucik2016.psdcoding.co/en/

function writetext(prev,timeOneC){
    var word = '', pos = '', newWord = '', i = 0, g = 0, sub = '';
    sub = $('.topHomeBlock .slider .slick-active .subTitle'); //получаю текст в слайдере
    pos = $('.topHomeBlock .slider .slick-active .title'); //получаю второй текст в слайдере
    pos.addClass('vis');
    word = pos.text();
    pos.text('');          
    timeoutW();       
    //функция которая добавляет по одной букве к слову за один вызов, когда дойдем до конца вторая фраза будет видна
    function timeoutW() {
        if (i < word.length){
            setTimeout(function () {
                i++;
                newWord += word.charAt(i);
                pos.text(newWord);
                timeoutW();
            }, timeOneC); 
        }
        if(i === word.length){
            pos.addClass('blick');
            sub.addClass('vis');
            setTimeout(function () {
                pos.removeClass('blick');
                timeoutR();
            }, timeOneC * 15);
        }
    }    
    //функция которая удаляет по одному символу за вызов
    function timeoutR() {
        setTimeout(function () {
            if (g < word.length){
                g++;
                newWord = word.substring(g);
                pos.text(newWord);
                timeoutR();
            }            
        }, timeOneC/3);
        if(g === word.length && auto){
            if(prev){
                $('.topHomeBlock .slick-prev').click(); //предыдущий слайд
            }else{
                $('.topHomeBlock .slick-next').click(); // следующий слайд
            }
            sub.removeClass('vis'); //убираю класс чтобы текст стал невидим
            pos.text(word).removeClass('vis'); //убираю класс чтобы текст стал невидим
            writetext(false,150); //вызываю функции снова
        }
    }      
}
writetext(false, 150);
Answer 1
function writetext(timeOneC = 150, word = '', pos = '', newWord = '', i = 0, g = 0, sub = ''){
sub = $('.topHomeBlock .slider .slick-active .subTitle');
pos = $('.topHomeBlock .slider .slick-active .title');    
pos.addClass('vis');
word = pos.text();
pos.text('');          
timeoutW();       
function timeoutW() {
    if(click){
        sub.removeClass('vis');
        pos.text(word).removeClass('vis');
        pos.removeClass('blick');
        return false;
    }
    if (i < word.length){
        setTimeout(function () {
            i++;
            newWord += word.charAt(i);
            pos.text(newWord);
            timeoutW();
        }, timeOneC); 
    }
    if(i === word.length){
        pos.addClass('blick');
        sub.addClass('vis');
        setTimeout(function () {
            pos.removeClass('blick');
            timeoutR();
        }, timeOneC * 15);
    }
}    
function timeoutR() {
    if(click){
        sub.removeClass('vis');
        pos.text(word).removeClass('vis');
        pos.removeClass('blick');
        return false;
    }
    if (g < word.length){
        setTimeout(function () {            
            g++;
            newWord = word.substring(g);
            pos.text(newWord);
            timeoutR();                       
        }, timeOneC/3);
    }
    if(g === word.length && !click){
        $('.topHomeBlock .slick-next').click();
        sub.removeClass('vis');
        pos.text(word).removeClass('vis');
        writetext(150);
    }
}      

}

READ ALSO
Код работает через раз

Код работает через раз

Добрый вечерНе могу несколько дней разобраться с одним кодом, работает но почему то через раз (на первом изображение работает, на втором нет,...

225
Нужен бот для Facebook [требует правки]

Нужен бот для Facebook [требует правки]

Нужен бот который будет отправлять приглашение в группу или страницуМожет кто подскажет исходники где искать

274
Побитовое сложение чисел С++ [требует правки]

Побитовое сложение чисел С++ [требует правки]

Числа A,B,C хранятся в unsigned long X в виде:

348
Как дописать QString в текстовый файл?

Как дописать QString в текстовый файл?

Подскажите как правильнее переписать функцию чтобы она дописывала в конец файла, а не заменяла

270