-
Notifications
You must be signed in to change notification settings - Fork 0
/
jquery.typewriter.js
102 lines (86 loc) · 3.3 KB
/
jquery.typewriter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*
* TypeWriter - jQuery Plugin
* Plugin for typewriting effect for multiple-lined texts
* separated by newline characters (\n)
*
* Copyright (c) 2013 Alex Vanyan (http://alex-v.net)
* Version: 1.0
* Requires: jQuery v1.4.2+
*
*/
;(function($) {
$.fn.typeWriter = function(options) {
var opts = $.extend( {}, $.fn.typeWriter.defaults, options );
var self = this;
return this.each(function() {
var $this = $(this);
var init = $.fn.typeWriter.init($this);
var rowTimeout;
// start animation
window.setTimeout(function() {
startTypeWriter(init.rowsArr);
}, parseInt(opts.startDelay));
// method to trigger start of typing
var startTypeWriter = function(rowsArr) { startTypingRow(rowsArr, 0); };
// API method to type one row of text
var startTypingRow = function(rowsArr, index) {
$this.append('<div class="typewriter-row"></div>');
var j = 0;
var charInterval = window.setInterval(function() {
if ( j < rowsArr[index].length ) {
$this.children().last().append(rowsArr[index][j++]);
} else {
window.clearInterval(charInterval);
if ( typeof opts.rowComplete === "function" ) opts.rowComplete.call();
if ( ++index < rowsArr.length ) {
rowTimeout = window.setTimeout(function() {
startTypingRow(rowsArr, index);
}, parseInt(opts.typeRowDelay));
} else {
if ( typeof opts.complete === "function" ) opts.complete.call();
}
}
}, parseInt(opts.typeDelay));
};
});
};
$.fn.typeWriter.init = function($this) {
// member variables definition
var vars = {
html: $this.html(),
htmlArr: $this.html().split("\n"),
rowsArr: [],
row: null
};
// check if text exists at all
if ( ! vars.html ) {
if ( window.console && typeof window.console.log === "function" ) {
throw new Error("No html input given (newline separated text)");
}
}
// iterate over text rows and push non-empty rows to stack array
for ( var i in vars.htmlArr ) {
row = $.trim(vars.htmlArr[i]);
if ( row ) vars.rowsArr.push(row);
}
// check if there are no text rows after all
if ( ! vars.rowsArr.length ) {
if ( window.console && typeof window.console.log === "function" ) {
throw new Error("Text string seems to be empty");
}
}
// empty html of current element to start setting the content row-by-row
$this.html('');
// return variables containing split text
// and empty variables to be defined later
return vars;
};
// default options: do not change!
$.fn.typeWriter.defaults = {
startDelay: 100,
typeDelay: 100,
typeRowDelay: 100,
rowComplete: null,
complete: null
};
})(jQuery);