1(function ($) { 2 $.fn.extend({ 3 typingTicker: function (options) { 4 this.defaultOptions = { 5 delayBetweenLetters: 50, 6 delayBeforeDelete: 4000, 7 delayAfterDelete: 300, 8 deleteTime: 1000, 9 itemSelector: '.tickerItem', 10 containerSelector: '.tickerContainer', 11 loop: true 12 }; 13 14 var settings = $.extend({}, this.defaultOptions, options); 15 16 return this.each(function () { 17 var $this = $(this); 18 19 var $items = $this.find(settings.itemSelector); 20 var $container = $this.find(settings.containerSelector); 21 22 if ($this.data("delayBetweenLetters")) settings.delayBetweenLetters = $this.data("delayBetweenLetters"); 23 if ($this.data("delayBeforeDelete")) settings.delayBeforeDelete = $this.data("delayBeforeDelete"); 24 if ($this.data("delayAfterDelete")) settings.delayAfterDelete = $this.data("delayAfterDelete"); 25 if ($this.data("deleteTime")) settings.deleteTime = $this.data("deleteTime"); 26 if ($this.data("itemSelector")) settings.itemSelector = $this.data("itemSelector"); 27 if ($this.data("containerSelector")) settings.containerSelector = $this.data("containerSelector"); 28 if ($this.data("loop")) settings.loop = $this.data("loop"); 29 30 if ($items.length === 0) return; 31 32 var $activeItem = null; 33 var height = 0; 34 35 var showNextItem = function () { 36 if ($activeItem == null) { 37 $activeItem = $items.first(); 38 } else { 39 $activeItem = $activeItem.next(); 40 } 41 42 if ($activeItem.length === 0 && settings.loop) { 43 $activeItem = $items.first(); 44 } 45 46 var clone = $activeItem.clone(); 47 $container.empty(); 48 49 var printLayer = function(container, contents, callback) { 50 var childIndex = 0; 51 var showNextChild = function (callback) { 52 var elementToPrint = $(contents[childIndex]); 53 54 var goToNextChild = function() { 55 childIndex++; 56 57 if (childIndex >= contents.length) { 58 if (callback) { 59 callback(); 60 } 61 } else { 62 showNextChild(callback); 63 } 64 }; 65 66 67 var textOnly = contents.filter(function() { return this.nodeType === 1 }).length === 0; 68 69 if (elementToPrint[0].nodeType === 1) { 70 var emptyElement = elementToPrint.clone(); 71 emptyElement.empty(); 72 73 container.append(emptyElement); 74 printLayer(emptyElement, elementToPrint.contents(), goToNextChild); 75 76 } else { 77 var text = elementToPrint.text().trim(); 78 if (!textOnly) text = " " + text + " "; 79 var letterIndex = 0; 80 81 var printLetter = function (callback) { 82 container.append(text[letterIndex]); 83 84 letterIndex++; 85 86 if (letterIndex < text.length) { 87 setTimeout(function() { printLetter(callback) }, settings.delayBetweenLetters); 88 } else { 89 if (callback) callback(); 90 } 91 }; 92 93 printLetter(goToNextChild); 94 } 95 }; 96 showNextChild(callback); 97 }; 98 99 printLayer($container, clone.contents(), function () { 100 $container.css("height", ""); 101 if ($container.height() > height) { 102 height = $container.height(); 103 } 104 $container.height(height); 105 if ($items.length > 1) { 106 setTimeout(function() { 107 $container.contents().fadeOut(settings.deleteTime, 108 function() { 109 setTimeout(showNextItem, settings.delayAfterDelete); 110 }); 111 }, 112 settings.delayBeforeDelete); 113 } else { 114 $container.addClass("finished"); 115 } 116 117 }); 118 }; 119 120 showNextItem(); 121 }); 122 } 123 });
124})(jQuery); 125
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.