【问题标题】:HowTo scramble letters in a dynamic element instead of within JS?如何在动态元素中而不是在 JS 中打乱字母?
【发布时间】:2018-08-13 15:00:35
【问题描述】:

如何修改以下 JavaScript 以接受动态 HTML span 元素的文本内容,而不是像目前那样使用静态内容?

var Messenger = function(el){
  'use strict';
  var m = this;
  
  m.init = function(){
    m.codeletters = "&#*+%?£@§$";
    m.message = 0;
    m.current_length = 0;
    m.fadeBuffer = false;
    // expects the element <span id="mySpanElement"> to exist on page
m.messages = [ document.getElementById('mySpanElement').innerHTML ];
    
    setTimeout(m.animateIn, 100);
  };
  
  m.generateRandomString = function(length){
    var random_text = '';
    while(random_text.length < length){
      random_text += m.codeletters.charAt(Math.floor(Math.random()*m.codeletters.length));
    } 
    
    return random_text;
  };
  
  m.animateIn = function(){
    if(m.current_length < m.messages[m.message].length){
      m.current_length = m.current_length + 2;
      if(m.current_length > m.messages[m.message].length) {
        m.current_length = m.messages[m.message].length;
      }
      
      var message = m.generateRandomString(m.current_length);
      $(el).html(message);
      
      setTimeout(m.animateIn, 20);
    } else { 
      setTimeout(m.animateFadeBuffer, 20);
    }
  };
  
  m.animateFadeBuffer = function(){
    if(m.fadeBuffer === false){
      m.fadeBuffer = [];
      for(var i = 0; i < m.messages[m.message].length; i++){
        m.fadeBuffer.push({c: (Math.floor(Math.random()*12))+1, l: m.messages[m.message].charAt(i)});
      }
    }
    
    var do_cycles = false;
    var message = ''; 
    
    for(var i = 0; i < m.fadeBuffer.length; i++){
      var fader = m.fadeBuffer[i];
      if(fader.c > 0){
        do_cycles = true;
        fader.c--;
        message += m.codeletters.charAt(Math.floor(Math.random()*m.codeletters.length));
      } else {
        message += fader.l;
      }
    }
    
    $(el).html(message);
    
    if(do_cycles === true){
      setTimeout(m.animateFadeBuffer, 50);
    } else {
      setTimeout(m.cycleText, 2000);
    }
  };
  
  m.cycleText = function(){
    m.message = m.message + 1;
    if(m.message >= m.messages.length){
      m.message = 0;
    }
    
    m.current_length = 0;
    m.fadeBuffer = false;
    $(el).html('');
    
    setTimeout(m.animateIn, 200);
  };
  
  m.init();
}

console.clear();
var messenger = new Messenger($('#mySpanElement'));
body {
  background: #222;
  color: #f0f0f0;
}

.messenger {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  font-family: monospace;
  font-size: 2.5em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span id="mySpanElement" class="messenger"></span>

编辑:从我的原始帖子中,我将 m.messages 行编辑为:m.messages = [ document.getElementById('mySpanElement').innerHTML ]; 并更新了 HTML 以包含 mySpanElement id。当代码运行时,这似乎可以正确地对输入的任何文本进行动画处理。

【问题讨论】:

  • 动态你的意思是要改变用户的输入?喜欢打字?还是将使用框架绑定进行更新?
  • 感谢您回复 Felipe,是的,我的意思是通过键入来更改用户的输入。

标签: javascript animation shuffle scramble


【解决方案1】:

在 Messenger 的 init() 中,将以下行从

m.codeletters = "&#*+%?£@§$";

// expects the element <span id="mySpanElement">&#*+%?£@§$</span> to exist on page
m.codeletters = document.getElementById('mySpanElement').innerHTML;

这将从 span 元素中获取 HTML 并使用它来代替静态字符。

【讨论】:

  • 感谢您的消息 daddygames,这似乎可以解决问题!虽然我实际上是要保留静态字符,但要包含消息的 span 元素。我已将代码中的 m.messages 行更改为:m.messages = [ document.getElementById('mySpanElement').innerHTML ];
  • 我还有一个问题:有没有办法防止死循环?即打乱一次并结束循环?
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 2012-01-27
  • 2018-08-22
  • 2015-10-28
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多