參考了jquery text truncate寫的範例程式:
/** * Visual string trimming Trimming with pixel of container * * change log: * 2012/12/06 use text function to avoid special characters let system crash * @author ken tsai 2012/04/06 */ ; (function($) { function htmlEncode(value) { try{ return $('<div/>').text(value).html(); }catch(err){ $.console("htmlEncode:" + err); return valeu; } } function htmlDecode(value) { try{ return $('<div/>').html(value).text(); }catch(err){ $.console("htmlDecode:" + err); return valeu; } } $.tirmWithPixel = {}; $.tirmWithPixelHTML = function(options){ var opts = $.extend($.fn.trimWithPixel.defaults, options); var text = opts.text; var pixelLimitWidth = opts.limitPixelLength; var tailPattern = opts.tail; var $container = $("<div/>"); var content = $container.append( $.tirmWithPixel({ text:text, limitPixelLength:pixelLimitWidth, tail:tailPattern} ).clone()).html(); return content; }; $.tirmWithPixel = function(options) { var opts = $.extend($.fn.trimWithPixel.defaults, options); var text = opts.text; var pixelLimitWidth = opts.limitPixelLength; var tailPattern = opts.tail; var $container = $("<span></span>"); //if element don't add to body //you can't get width from current element $container.text(text).appendTo("body"); // $.console("original:" + $container.text()); $container.trimWithPixel({ limitPixelLength:pixelLimitWidth, tail:tailPattern}); var $copyContainer = $container.clone(); //remove from body $container.remove(); // $.console("trim:" + $container.text()); return $container; }; $.fn.trimWithPixel = function(options) { // combine options var opts = $.extend($.fn.trimWithPixel.defaults, options); var pixelLimitWidth = opts.limitPixelLength; var tailPattern = opts.tail; var callback = opts.callback; this.each(function(i, obj) { var $strContainer = $(this);// current element var cText = $strContainer.text();// original text of container(without html encode) var oText = cText;// record original text(with html encode) //$.console("oText:" + oText); var $vistualSpan = $("<span style='white-space:nowrap;'></span>"); $vistualSpan.text(cText); //$.console("span context:" + $vistualSpan.html()); $strContainer.html($vistualSpan); //$.console("$strContainer html:" + $strContainer.html()); var spanWidth = $vistualSpan.width(); //$.console("spanWidth:" + spanWidth); // elem width is more than limit pixel length if (spanWidth > pixelLimitWidth) { var max = 0; while ((spanWidth = $vistualSpan.width()) > pixelLimitWidth) { cText = cText.substring(0, cText.length - 1); $vistualSpan.text(cText); cText = $vistualSpan.text(); //debug /* max++; if(max > 100){ $.console("[trimWithPixel] Exceed max limitation.."); return; }*/ } cText = cText + tailPattern; if (callback && typeof(callback) === "function") { callback({oText:oText,cText:cText}); }else{ $strContainer.attr("title", oText); $strContainer.text(cText);// using text fun to unescape html } } else { // not trimming //$.console("not trimming"); if (callback && typeof(callback) === "function") { callback({oText:oText,cText:cText}); }else{ $strContainer.attr("title",oText); $strContainer.text(oText);// using text fun to unescape html tag } } }); }; // default options $.fn.trimWithPixel.defaults = { limitPixelLength : 125, tail : "..." }; })(jQuery);
{ // a dummy block, so I can collapse all the meta stuff in the editor /**************************************************************************** * jQuery 1.3.x plugin to shorten styled text to fit in a block, appending * an ellipsis ("...", …, Unicode: 2026) or other text. * (Only supports ltr text for now.) * * This is achieved by placing the text of the 'selected' element (eg. span or * div) inside a table and measuring its width. If it's too big to big to fit in * the element's parent block it's shortened and measured again until it (and * appended ellipsis or text) fits inside the block. A tooltip on the 'selected' * element displays the full original text. * * If the browser supports truncating text using the 'text-overflow:ellipsis' * CSS property then that will be used (if the text to append is the default * ellipsis). * * If the text is truncated by the plugin any markup in the text will be * stripped (eg: "<a" starts stripping, "< a" does not). This behaviour is * dictated by the jQuery .text(val) method. * The appended text may contain HTML however (a link or span for example). * * Usage Example ('selecting' a div with an id of "element"): <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <script type="text/javascript" src="jquery.textTruncate.js"></script> <script type="text/javascript"> $(function() { $("#element").textTruncate(); }); </script> * By default the plugin will use the parent block's width as maximum width and * an ellipsis as appended text when truncating. * * There are three ways of configuring the plugin: * * 1) Passing a configuration hash as the plugin's argument, eg: .textTruncate({ width: 300, tail: ' <a href="#">more</a>', tooltip: false }); * 2) Using two optional arguments (deprecated!): * width = the desired pixel width, integer * tail = text/html to append when truncating * * 3) By changing the plugin defaults, eg: $.fn.textTruncate.defaults.tail = ' <a href="#">more</a>'; * Note: there is no default width (unless you create one). * * You may want to set the element's css to {visibility:hidden;} so it won't * initially flash at full width. * * * Created by M. David Green (www.mdavidgreen.com) in 2009. Free to use for * personal or commercial purposes under MIT (X11) license with no warranty * * Heavily modified/simplified/improved by Marc Diethelm (http://web5.me/). * ****************************************************************************/ } (function ($) { $.fn.textTruncate = function() { var userOptions = {}; var args = arguments; // for better minification var func = args.callee // dito; and much shorter than $.fn.textTruncate if ( args.length ) { if ( args[0].constructor == Object ) { userOptions = args[0]; } else if ( args[0] == "options" ) { return $(this).eq(0).data("options-truncate"); } else { userOptions = { width: parseInt(args[0]), tail: args[1] } } } this.css("visibility","hidden"); // Hide the element(s) while manipulating them // apply options vs. defaults var options = $.extend({}, func.defaults, userOptions); /** * HERE WE GO! **/ return this.each(function () { var $this = $(this); $this.data("options-truncate", options); /** * If browser implements text-overflow:ellipsis in CSS and tail is "...", use it! **/ if ( options.tail == "..." && func._native ) { this.style[func._native] = "ellipsis"; /*var css_obj = {} css_obj[func._native] = "ellipsis"; $this.css(css_obj);*/ $this.css("visibility","visible"); return true; } var width = options.width || $this.parent().width(); var text = $this.text(); var textlength = text.length; var css = "padding:0; margin:0; border:none; font:inherit;"; var $table = $('<table style="'+ css +'width:auto;zoom:1;position:absolute;"><tr style="'+ css +'"><td style="'+ css +'white-space:nowrap;">' + options.tail + '</td></tr></table>'); var $td = $("td", $table); $this.html( $table ); var tailwidth = $td.width(); var targetWidth = width - tailwidth; $td.text( text ); if ($td.width() > width) { if ( options.tooltip ) { $this.attr("title", text); } while ($td.width() >= targetWidth ) { textlength--; $td.html($td.html().substring(0, textlength)); // .html(val) is faster than .text(val) and we already used .text(val) to strip/escape html } text = $.trim( $td.html() ); $this.html( text + options.tail ); } else { $this.html( text ); } this.style.visibility = "visible"; return true; }); return true; }; var css = document.documentElement.style; var _native = false; if ( "textOverflow" in css ) { _native = "textOverflow"; } else if ( "OTextOverflow" in css ) { _native = "OTextOverflow"; } $.fn.textTruncate._native = _native; $.fn.textTruncate.defaults = { tail: "…", tooltip: true }; })(jQuery);
Reference:
http://stackoverflow.com/questions/895888/truncate-text-with-jquery-based-on-pixel-width
http://www.bramstein.com/projects/text-overflow/
http://sugarjs.com/api/String/truncate
http://webdesignerwall.com/tutorials/word-wrap-force-text-to-wrap
http://code.google.com/p/jquery-text-truncate/
http://ant4css.blogspot.com/2009/03/text-overflow.html
沒有留言:
張貼留言
留個話吧:)