2016-03-13 2 views
0

Итак, я хочу создать приложение jQuery, где текст будет анимироваться на экране, чтобы выглядеть так, как будто кто-то печатает что-то. Я достиг этого в самой простой форме.Имитация ввода с помощью jQuery, приостановка или удлинение функции setInterval

HTML

<p></p> 

JQuery

$(document).ready(function() { 
    var p = $('p'); 
    p.text(''); 


    window.setInterval(function(){ 
     inc(p); 
    }, 100); 

}); 

var i = 0; 

function inc(p) 
{ 

    var text = "Hey... This is just a test"; 
    p.append(text.charAt(i)); 
    i++; 
} 

То, что я хочу знать, как бы я, возможно, после того, как "Эй ..." Говори функция остановиться на 2 секунды? Или сколько бы я ни пожелал.

У меня была идея, но она очень неэффективна и «дерьмова», и это должно добавить столько пробелов, сколько потребовалось бы, чтобы ничего не печатать в течение 2 секунд, а затем заменить строку на все перед пробелами и продолжить добавление.

Это ужасно, и мне бы хотелось, чтобы это было лучше. Может кто-нибудь, пожалуйста, дайте мне какие-нибудь предложения? И setInterval правильная функция для использования, или я должен использовать setTimeout?

Here's сценарий моего кода.

Я ценю любую помощь или предложения, спасибо вам большое.

+0

я не понимаю, вы хотите, чтобы перезагрузить функцию через 2 секунды? – Shayan

+0

Итак, скажем, у меня есть строка «Эй ... Это всего лишь тест», я хочу иметь возможность сделать что-то вроде: «Эй ... [пауза: 2s] Это просто тест», и то я могу запустить оператор if перед добавлением чего-либо и проверить с регулярным выражением, сколько секунд на паузу, и после этого времени я продолжаю добавление @shayanypn –

ответ

1

Я думаю, что есть лучший способ сделать это, но я отправляю свой рабочий ответ.

Я заменил вас setIntervalsetTimeout внутри вашей функции inc. Так что теперь он рекурсивный.

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

EDIT:

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

$(document).ready(function() { 
 
    var p = $('p'); 
 
    p.text(''); 
 

 
    inc(p); 
 
}); 
 

 
var i = 0; 
 
var j = 0; 
 

 
function inc(p) { 
 
    var interval = 0.1; 
 
    var text = "Hey... {2} This is a {1} test"; 
 
    var array = text.split(/[\{\}]/); // Split on embraces 
 
    
 
    if (i < array.length) { 
 
    p.append(array[i].charAt(j)); 
 
    
 
    if (j == array[i].length -1 && typeof array[i + 1] !== "undefined") { 
 
     interval = array[i + 1]; 
 
     i += 2; 
 
     j = 0; 
 
    } 
 
    
 
    j++; 
 
    setTimeout(function() { inc(p); }, interval*1000); 
 
    } 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<p></p>

+0

. Я разместил этот комментарий по ответу выше, но у меня такая же проблема поэтому я буду вставлять его здесь »\t Я предполагаю, что если у меня есть более одной точки ожидания, я бы сделал массив, но я не хочу индексировать каждый раз, когда хочу приостановить, так или иначе, я мог бы это сделать, специальную строку в строке, например «Hey .. [pause: 2s] это тест», и когда он читает «[», он может видеть, сколько секунд я сказал ему подождать? «Надеюсь, это имеет смысл, поэтому я могу захотеть, чтобы это« Эй ... [пауза: 2s] это тест. [pause: 4s] Привет всем "и пауза для 2 и 4 соответственно –

+0

@SamirChahine Я отредактировал свой код. Теперь вы можете сделать *« Эй ... {2} тест «* сделать паузу в 2 секунды. если это вам подходит. –

+0

Он работает с «фрагментом кода запуска», но когда я добавляю его в скрипку, он не отображается? https://jsfiddle.net/0puzwygf/5/ –

0

попробовать это, jsFiddle

$(document).ready(function() { 
    var $p = $('p'); 
    $p.text(''); 
    waitFun($p); 
}); 
var timer; 
var wait_time=2000; 
var wait_point=7; 
var count=0; 
function waitFun($p){ 
    clearTimeout(timer); 
    timer = window.setTimeout(function(){ 
    var text = "Hey... This is just a test"; 
    $p.append(text.charAt(count)); 
    count++; 
    if(text.length == count) {return false} //avoid of infinte loop 

    if(count == wait_point){ 
    window.setTimeout(function(){ 
     waitFun($p); 
    },wait_time); 
    }else{ 
    waitFun($p); 
    } 

    },100); 

} 
+0

Я предполагаю, что если у меня больше одной точки ожидания, я бы сделал массив, но я не хочу индексировать каждый раз, когда хочу приостановить, так или иначе, я мог бы сделать это, проверив специальную строку в строке, например, Эй .. [пауза: 2s] это тест », и когда он читает« [», он может видеть, сколько секунд я сказал ему подождать? –

Смежные вопросы