【问题标题】:How can I stop this teletype animation after its first iteration?如何在第一次迭代后停止此电传动画?
【发布时间】:2013-02-13 19:10:58
【问题描述】:

我正在使用 jquery 进行打字效果,并找到了这段代码并对其进行了编辑,使其可以根据需要完美运行。

但是,我有一个问题,我无法停止循环。

我试图检测到最后一段被打印了,所以我可以在没有运气的情况下添加一个函数。

感谢您的建议和提示。

代码是:

http://jsbin.com/araget/33/

(function ($) {

  function typeString($target, str, cursor, delay, cb) {
    $target.html(function (_, html) {
      return html + str[cursor];
    });

    if (cursor < str.length - 1) {
      setTimeout(function () {
        typeString($target, str, cursor + 1, delay, cb);
      }, delay);
    }
    else {
      cb();
    }
  }

  function deleteString($target, delay, cb) {
    var length;

    $target.html(function (_, html) {
      length = html.length;
      return html.substr(0, length - 1);
    });

    if (length > 1) {
      setTimeout(function () {
        deleteString($target, delay, cb);
      }, delay);
    }
    else {
      cb();
    }
  }

  // jQuery hook
  $.fn.extend({
    teletype: function (opts) {
      var settings = $.extend({}, $.teletype.defaults, opts);

      return $(this).each(function () {
        (function loop($tar, idx) {
          // type
          typeString($tar, settings.text[idx], 0, settings.delay, function () {
            // delete
            setTimeout(function () {
              deleteString($tar, settings.delay, function () {
                loop($tar, (idx + 1) % settings.text.length);
              });
            }, settings.pause);
          });

        }($(this), 0));
      });
    }
  });

  // plugin defaults  
  $.extend({
    teletype: {
      defaults: {
        delay: 100,
        pause: 5000,
        text: []
      }
    }
  });
}(jQuery));

$('#target').teletype({
  text: [
    'Lorem ipsum dolor sit amet, consetetur sadipscing elitr,',
    'sed diam nonumy eirmod tempor invidunt ut labore et dolore',
    'magna aliquyam erat, sed diam voluptua. At vero eos et'
  ]
});

$('#cursor').teletype({
  text: ['_', ' '],
  delay: 0,
  pause: 500
});

【问题讨论】:

    标签: javascript jquery jquery-plugins


    【解决方案1】:

    您可以添加一个参数来停止动画的循环,并将另一个参数设置为在动画结束时调用的回调。我们分别说foreverend

    // plugin defaults  
    $.extend({
      teletype: {
        defaults: {
          delay: 100,
          pause: 5000,
          text: [],
          forever: true,
          end: $.noop
        }
      }
    });
    

    forever 设置为true 将使动画无限期地继续,并在到达最后一个元素后从text 的第一个元素重新开始。将forever 设置为false 将使其在第一次迭代完成后停止。

    end 设置为将在动画第一次迭代完成时调用的回调函数。此选项要求将forever 设置为false,否则将永远不会被调用。

    用途:

    if (settings.forever || (idx + 1 < settings.text.length)) {
      loop($tar, (idx + 1) % settings.text.length);
    } else {
      settings.end.call(self);
    }
    

    而不是

    loop($tar, (idx + 1) % settings.text.length);
    

    应用这些更改后,您可以使用适当的参数调用teletype

    $('#target').teletype({
      text: [
        'Lorem ipsum dolor sit amet, consetetur sadipscing elitr,',
        'sed diam nonumy eirmod tempor invidunt ut labore et dolore',
        'magna aliquyam erat, sed diam voluptua. At vero eos et'
      ],
      forever: false,
      end: function(){
        alert("Teletype is done!");
      }
    });
    

    You can see it here.

    【讨论】:

      【解决方案2】:

      您需要从setTimeout() 获取处理程序并使用处理程序运行clearTimeout()

      var handler = setTimeout(function () {
              typeString($target, str, cursor + 1, delay, cb);
            }, delay);
      ....
      clearTimeout(handler);
      

      编辑:我修改了你的代码来解释你应该在哪里放置一个停止例程。

      查看此链接:http://jsbin.com/enukit/1

      你需要再清理一下你的逻辑。光标应该分开或通过选项设置,因为你的意思是停止循环,用于闪烁光标。

      (function ($) {
        // writes the string
        //
        // @param jQuery $target
        // @param String str
        // @param Numeric cursor
        // @param Numeric delay
        // @param Function cb
        // @return void
      
        var handler1, mycount=0, handler2, handler3;
        function typeString($target, str, cursor, delay, cb) {
          $target.html(function (_, html) {
            return html + str[cursor];
          });
          //alert('cursor:'+cursor);
          //alert('str.length:'+str);
          if (cursor < str.length - 1) {
            handler1 = setTimeout(function () {
              typeString($target, str, cursor + 1, delay, cb);
            }, delay);
          }
          else {
            cb();
          }
        }
      
        // clears the string
        //
        // @param jQuery $target
        // @param Numeric delay
        // @param Function cb
        // @return void
        function deleteString($target, delay, cb) {
          var length;
      
          $target.html(function (_, html) {
            length = html.length;
            return html.substr(0, length - 1);
          });
      
          if (length > 1) {
            handler2 = setTimeout(function () {
              deleteString($target, delay, cb);
            }, delay);
          }
          else {
            cb();
          }
        }
      
        // jQuery hook
        $.fn.extend({
          teletype: function (opts) {
            var settings = $.extend({}, $.teletype.defaults, opts);
            $(this).each(function () {
      mycount=0;
              (function loop($tar, idx) {
              mycount ++;
                // type
                typeString($tar, settings.text[idx], 0, settings.delay, function () {
                  // delete
                  clearTimeout(handler1);
                  handler3 = setTimeout(function () {
                    deleteString($tar, settings.delay, function () {
                      if (mycount<settings.text.length) {
                        loop($tar, (idx + 1));} else {
      clearTimeout(handler3);
                          alert('The end!');
                        }
                    });
                  }, settings.pause);
                });
      
              }($(this), 0));
            });
      
          }
        });
      
        // plugin defaults  
        $.extend({
          teletype: {
            defaults: {
              delay: 100,
              pause: 5000,
              text: []
            }
          }
        });
      }(jQuery));
      
      $('#target').teletype({
        text: [
          'Lorem ipsum dolor sit amet, consetetur sadipscing elitr,',
          'sed diam nonumy eirmod tempor invidunt ut labore et dolore',
          'magna aliquyam erat, sed diam voluptua. At vero eos et'
        ]
      });
      /*
      $('#cursor').teletype({
        text: ['_', ' '],
        delay: 0,
        pause: 500
      });
      */
      

      【讨论】:

      • 您能否在最后一条消息打印后不循环显示任何文本?随意编辑我的代码,因为我是 jquery 的新手
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2020-12-15
      • 2015-10-20
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多