Rev 943 | Blame | Last modification | View Log | RSS feed
/*!* jQuery Text Overflow v0.7** Licensed under the new BSD License.* Copyright 2009-2010, Bram Stein* All rights reserved.*//*global jQuery, document, setInterval*/(function ($) {var style = document.documentElement.style,hasTextOverflow = ('textOverflow' in style || 'OTextOverflow' in style),domSplit = function (root, maxIndex) {var index = 0, result = [],domSplitAux = function (nodes) {var i = 0, tmp;if (index > maxIndex) {return;}for (i = 0; i < nodes.length; i += 1) {if (nodes[i].nodeType === 1) {tmp = nodes[i].cloneNode(false);result[result.length - 1].appendChild(tmp);result.push(tmp);domSplitAux(nodes[i].childNodes);result.pop();} else if (nodes[i].nodeType === 3) {if (index + nodes[i].length < maxIndex) {result[result.length - 1].appendChild(nodes[i].cloneNode(false));} else {tmp = nodes[i].cloneNode(false);tmp.textContent = $.trim(tmp.textContent.substring(0, maxIndex - index));result[result.length - 1].appendChild(tmp);}index += nodes[i].length;} else {result.appendChild(nodes[i].cloneNode(false));}}};result.push(root.cloneNode(false));domSplitAux(root.childNodes);return $(result.pop().childNodes);};$.extend($.fn, {textOverflow: function (str, autoUpdate) {var more = str || '…';if (!hasTextOverflow) {return this.each(function () {var element = $(this),// the clone element we modify to measure the widthclone = element.clone(),// we save a copy so we can restore it if necessaryoriginalElement = element.clone(),originalText = element.text(),originalWidth = element.width(),low = 0, mid = 0,high = originalText.length,reflow = function () {if (originalWidth !== element.width()) {element.replaceWith(originalElement);element = originalElement;originalElement = element.clone();element.textOverflow(str, false);originalWidth = element.width();}};element.after(clone.hide().css({'position': 'absolute','width': 'auto','overflow': 'visible','max-width': 'inherit'}));if (clone.width() > originalWidth) {while (low < high) {mid = Math.floor(low + ((high - low) / 2));clone.empty().append(domSplit(originalElement.get(0), mid)).append(more);if (clone.width() < originalWidth) {low = mid + 1;} else {high = mid;}}if (low < originalText.length) {element.empty().append(domSplit(originalElement.get(0), low - 1)).append(more);}element.attr("Title", originalText);}clone.remove();if (autoUpdate) {setInterval(reflow, 200);}});} else {return this;}}});})(jQuery);