2016-03-08 47 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