这段代码真的帮了我很多,谢谢!
但是我注意到还有一些需要改进的地方:
1/ 解决某些情况下宽度不足的问题
替换为:
<td class="preview">Hey bob, got any plans for new years yet?</td>
使用:
<td><div class="preview">Hey bob, got any plans for new years yet?</div></td>
2/ 脚本在使用特定字体(大小,粗细,家族等)时无法正常工作
您需要将字体应用于用于计算文本大小的“不可见”span。例如(必要时应补充所有所需的字体属性):
(...)
var roomWidth = $(this).innerWidth();
var fontSize=$(this).css("font-size");
spanTest.css("font-size", fontSize);
var fontStyle=$(this).css("font-style");
spanTest.css("font-style", fontStyle);
var fontWeight=$(this).css("font-weight");
spanTest.css("font-weight", fontWeight);
var fontFamily=$(this).css("font-family");
spanTest.css("font-family", fontFamily);
(...)
3/ 性能
我进行了一个测试,使用Firefox 7,其中有1000个元素,每个元素需要删除25个额外的字符。你的脚本需要近40秒才能完成工作。
似乎问题出在“display:none”的span上。
将该span放在窗口之外,使用“position:absolute;top:-100px”,可以提高性能:处理1000个元素只需要大约11秒!
所以,请替换为:
var spanTest = $('<span>').css('display','none').attr('id','span-test-tester');
随着:
var spanTest = $('<span>').attr('id','span-test-tester').css('position','absolute').css('top','-100px');
总之:
再次感谢这个脚本……它非常有用!
下面是我完整的代码适配,如果有人需要的话……:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title> - jsFiddle demo</title>
<script type='text/javascript' src='http://code.jquery.com/jquery-1.4.4.min.js'></script>
<link rel="stylesheet" type="text/css" href="/css/normalize.css">
<link rel="stylesheet" type="text/css" href="/css/result-light.css">
<style type='text/css'>
.preview {
}
.backg{
background:red;
margin: 20px 0;
border:1px solid blue;
width:200px;
padding:10px;
font-size:14px; // change it to test with other fonts
font-weight:bold;
}
</style>
<script type='text/javascript'>
$(window).load(function(){
truncate();
});
function truncate(){
var spanTest = $('<span>').attr('id','span-test-tester').css('position','absolute').css('top','-100px');
$('body').append(spanTest);
function getLength(txt){
return spanTest.text(txt).width();
}
var nb =0;
$('.preview').each(function(){
nb++;
var fontSize=$(this).css("font-size");
spanTest.css("font-size", fontSize);
var fontStyle=$(this).css("font-style");
spanTest.css("font-style", fontStyle);
var fontWeight=$(this).css("font-weight");
spanTest.css("font-weight", fontWeight);
var fontFamily=$(this).css("font-family");
spanTest.css("font-family", fontFamily);
var roomWidth = $(this).innerWidth();
var txt = $(this).text();
var contentsWidth = getLength(txt);
if (contentsWidth > roomWidth){
roomWidth -= getLength('...');
while (contentsWidth > roomWidth){
txt = txt.substring(0,txt.length-1);
contentsWidth = getLength(txt);
}
$(this).text(txt).append($('<span>').text('...'));
}
});
}
</script>
</head>
<body>
<div class="backg"><div class="preview">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</div></div>
(... repeat 1000 times ...)
<div class="backg"><div class="preview">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</div></div>
</body>
</html>
再见!
DIV
不是一个好的解决方案,因为它默认继承父元素的宽度,不允许其随内容而“增长”。你最好使用SPAN
。举个例子。 - Brad Christievar d = $('<div>');/*$('body').append(d);*/d.text('Hello,World!');var w1 = d.width();d.text('Longer string goes here');var w2 = d.width();alert('Short: '+w1+'\nLong: '+w2);
(取消或添加注释[使用jQuery简化]) - Brad Christie