2016-03-08 52 views
1

我有这段代码片段。显示延迟字母输入字段中的文字

 <div class="content__img-txt"> 
      <a class="input-group"> 
      <input class="input-group-field" type="text"> 
      <div class="input-group-button"> 
      <input type="submit" class="button" value="&raquo;"> 
      </div> 
     </div> 

function showLetter (field, text, delay) { 
     $(field).val(text.substring(0,1)); 
     for(var i = 2; i <= text.length; i++) 
     { 
      setTimeout(function(){ 
       $(field).val(text.substring(0,i)); 
      }, delay); 
     } 
    } 
showLetter (".input-group-field", "Show letter for letter with a delay of 1 second", 1000); 

The console says : Uncaught TypeError: Cannot read property 'length' of undefined.

如何显示在输入字段,但信字母文字,而不是整个文本同时显示,该文件完全加载后?

+0

你是否介意我们一些HTML标记? – Aer0

+0

在我的Chrome上运行良好。但文字一起显示。 – yaochiqkl

+0

您确定控制台消息指向该代码吗?你的主要问题似乎是你的文本会一起显示,因为当你的超时执行'i'将会是字符串的长度,参见[JavaScript闭包内部循环 - 简单的实例](http:// stackoverflow .com/questions/750486/javascript-closure-inside-loops-simple-practical-example) –

回答

2

猜你需要一个封闭,以确保setTimeout的有自己的循环,你需要增加像以下延迟:

function showLetter(field, text, delay) { 
    $(field).val(text.substring(0, 1)); 
    for (var i = 2; i <= text.length; i++) { 
    (function(i) { 
     setTimeout(function() { 
      $(field).val(text.substring(0, i)); 
     }, (delay=delay+100)); 
    })(i) 

    } 
} 
showLetter(".input-group-field", "Show letter for letter with a delay of 1 second", 1000); 

DEMO

+0

非常感谢!甚至其他建议!只需添加一小段代码,像我这样的新手就很开心;) – 151RUM

+0

很高兴听到这个消息,欢迎您和队友 –

+0

@ Norlihazmey Ghazali。只是增加一个问题,因为这是我难以实现的方式。现在是否可以替换第一个文本,比如在完全显示一个新字符串后4秒钟。对不起,我的英语不好^^ – 151RUM

0

您应该使用setInterval代替。

function showLetter(field, text, delay) { 
 
    $(field).val(text.substring(0, 1)); 
 
    var interval = setInterval(function() { 
 
    var len = ($(field).val().length || 0) +1; 
 
    $(field).val(text.substring(0, len)); 
 
    
 
    if(len === text.length) 
 
     window.clearInterval(interval); 
 
    }, delay); 
 
} 
 
showLetter(".input-group-field", "Show letter for letter with a delay of 1 second", 100);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> 
 
<div class="content__img-txt" style="float:left;margin-top:20px;"> 
 
    <a class="input-group"> 
 
    <input class="input-group-field" type="text"> 
 
    <div class="input-group-button"> 
 
     <input type="submit" class="button" value="&raquo;"> 
 
    </div> 
 
</div>

0

递归函数!

function showLetter (field, text, position, delay) { 
    if (position >= text.length) { 
     return false; 
    } 
    var current = text.substring(0,position); 
    setTimeout(function(){ 
    $(field).val(current+text[position]); 
    }, delay); 
    return showLetter(field,text,position+1,delay+1000) 
} 
showLetter (".input-group-field", "Show letter for letter with a delay of 1 second", 0, 1000); 

这样的乐趣!

如果你想知道为什么你的代码不能正常工作,这是因为for循环继续运行,并通过时间setTimeout命中增加i,所以,i == text.length和它给你整个字符串。

DEMO

0

我做了一些例子,我希望它可以帮助你。

$(document).ready(function() { 
 
    
 
    var TIME_OUT = 1000; 
 
    
 
    var showTextWithDelay = function(element, text) { 
 
    
 
    var lengthOfSubtext = 0; 
 
    var printer = setInterval(function() { 
 
     
 
     if (lengthOfSubtext >= text.length) { 
 
     clearInterval(printer); 
 
     } 
 
     
 
     var subtext = text.substring (0, lengthOfSubtext); 
 
     element.val(subtext); 
 
     lengthOfSubtext++; 
 
     
 
    }, TIME_OUT); 
 
     
 
    }; 
 
        
 
    
 
    var inputElement = $('#field'); 
 
    var text = "This is an example!"; 
 

 

 
    showTextWithDelay(inputElement, text); 
 
    
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> 
 

 

 
<input type="text" id="field">

0

要多一个加进来;)递归具有局部功能:

function showLetter(field, text, delay) { 
    var ind = 1; 
    var shownext =() => { 
    $(field).val(text.substring(0,ind));  
    if(ind++ < text.length) setTimeout(shownext,delay); 
    }; 
    shownext(); 
} 

Fiddle