JavaScript 撑出页面文字换行


Posted in Javascript onJune 15, 2009

碰到一个问题,就是在页面展示的时候,很多情况下需要对显示的文字做折行处理,例如文字超过TD的宽度,或者DIV的宽度等等。
在IE下有word-break等等,但是在FF下,却是行不通,所以研究了一下,写了一个JS脚本,原理是这样的:
1. 首先,我们在页面上找一个span元素,用它来装载字符,然后通过它的宽度,来得到字符的显示宽度
2. 然后,我们在显示一个字符串的时候,就可以利用前面得到的字符宽度,计算出每个字符串的宽度
3. 在此基础上,计算出字符串应该折行的位置,插入<br/>进行折行就不是什么问题了。
条件所限,blog不能上传附件,我在这里解释一下代码。
代码有2部分,一个是“textWidth.js”,他完成绝大部分的工作;另外一个是测试页面。
1. textWidth.js

源代码 说明
var TextWidth = new function() { var widthLib = new Hash(); var textSpan; var self = this;  内部成员变量 widthLib是一个保存某个字体、字号的所有字符的宽度的hash表;
self.getWidth = function(string, fontName, fontSize) { var lib = getSizeLib(fontName, fontSize); var totalWidth = 0; for(var i =0; i 255) { totalWidth += lib[256]; }else{ totalWidth += lib[c]; } } return totalWidth; }  计算字符串的长度。算法简单,就是把每个字符的宽度都加到一起就好了。 关键是getSizeLib(fontName, fontSize);这个函数,如果Hash表里没有这个字体字号的宽度数据,它会主动初始化相应的宽度数据
self.wrapText = function(string, fontName, fontSize, maxWidth) { if (!string) { return " "; } var origText = string.strip(); var lib = getSizeLib(fontName, fontSize); var resultText = ""; var deltaW; var totalW = 0; for(var i =0; i 255) { deltaW = lib[256]; }else{ deltaW = lib[c]; } if ((totalW + deltaW) > maxWidth) { resultText += ""; totalW = deltaW; }else{ totalW += deltaW; } resultText += string.charAt(i); } return resultText; }  计算折行。这个也简单,先从Hash表里拿到宽度数据,然后逐个计算,宽度超了,就加个
进去
self.setSpan = function(obj) { textSpan = obj; textSpan.hide(); }  保存用于宽度计算的span元素
function getSizeLib(fontName, fontSize) { if (!widthLib.get(getKey(fontName, fontSize))) { initwidthLib(fontName, fontSize); } return widthLib.get(getKey(fontName, fontSize)); }  取得指定字体字号的宽度数据。没有的话,就初始化一份
function initwidthLib(fontName, fontSize) { var key = getKey(fontName, fontSize); var sizeLib = new Array(257); textSpan.show(); textSpan.style.fontFamily = fontName; textSpan.style.fontSize = fontSize+"px"; textSpan.update("中中中中中中中中中中"); sizeLib[256] = textSpan.offsetWidth/10; for(var i = 0; i  初始化
function getKey(fontName, fontSize) { return fontName+"@"+fontSize+"px"; } }  
   

下面是测试页面的代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1- 
transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<script language="javascript" src="prototype.js"></script> 
<script language="javascript" src="textWidth.js"></script> 
<title>无标题文档</title> 
<style type="text/css"> 
* { 
font-size: 14px; 
font-family: Geneva,Arial,Helvetica,sans-serif; 
} 
</style> 
</head> 
<body> 
<textarea id="in" type="text"></textarea><input type="button" value="test" onclick="runTest()"/><p/> 
<textarea id="resultSpan" style="width: 900px;font-size: 14px; font-family: Geneva"> 
</textarea> 
<div id="resultDisplay" style="font-size: 14px; font-family: Geneva;background-color:#e242E6; width:80px"></div> 
<span id="textSpan" style="display:none"></span> 
</body> 
<script type="text/javascript"> 
TextWidth.setSpan($('textSpan')); 
function runTest() { 
$('resultSpan').innerHTML = $("in").value; 
var theWidth = TextWidth.getWidth($('resultSpan').innerHTML, "Geneva", 14); 
$("resultDisplay").innerHTML = TextWidth.wrapText($('resultSpan').innerHTML, "Geneva", 14, 80); 
} 
</script> 
</html>

prototype.js请自行下载验证
Javascript 相关文章推荐
JavaScript 验证浏览器是否支持javascript的方法小结
May 17 Javascript
JavaScript原型继承之基础机制分析
Aug 26 Javascript
jquery插件tooltipv顶部淡入淡出效果使用示例
Dec 05 Javascript
jquery实现tr元素的上下移动示例代码
Dec 20 Javascript
js查找某元素中的所有图片地址的方法
Jan 16 Javascript
jquery日历插件datepicker用法分析
Jan 22 Javascript
jQuery实现下拉框功能实例代码
May 06 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
Jun 13 Javascript
jQuery实现下拉菜单的实例代码
Jun 19 jQuery
使用 vue-i18n 切换中英文效果
May 23 Javascript
解决 window.onload 被覆盖的问题方法
Jan 14 Javascript
Vue数字输入框组件示例代码详解
Jan 15 Javascript
jquery.alert 弹出式复选框实现代码
Jun 15 #Javascript
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
Jun 14 #Javascript
FireFox JavaScript全局Event对象
Jun 14 #Javascript
Javascript 错误处理的几种方法
Jun 13 #Javascript
Javascript 学习书 推荐
Jun 13 #Javascript
javascript 框架小结 个人工作经验
Jun 13 #Javascript
动态刷新 dorado树的js代码
Jun 12 #Javascript
You might like
《PHP编程最快明白》第七讲:php图片验证码与缩略图
2010/11/01 PHP
PHP的基本常识小结
2013/07/05 PHP
PHP生成sitemap.xml地图函数
2013/11/13 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
firefox 和 ie 事件处理的细节,研究,再研究 书写同时兼容ie和ff的事件处理代码
2007/04/12 Javascript
js 静态动态成员 and 信息的封装和隐藏
2011/05/29 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
Vue 全局loading组件实例详解
2018/05/29 Javascript
微信小程序实现倒计时调用相机自动拍照功能
2018/06/10 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
vue实现简单图片上传
2020/06/30 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
python解析json实例方法
2013/11/19 Python
python打开文件并获取文件相关属性的方法
2015/04/23 Python
python写入xml文件的方法
2015/05/08 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
Python使用type动态创建类操作示例
2020/02/29 Python
Python如何实现在字符串里嵌入双引号或者单引号
2020/03/02 Python
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
C#如何进行LDAP用户校验
2012/11/21 面试题
Python的两道面试题
2013/06/29 面试题
环境工程毕业生自荐信
2013/11/17 职场文书
迅雷Cued工作心得体会
2014/01/27 职场文书
考试保密承诺书
2014/08/30 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
护士年终个人总结
2015/02/13 职场文书
成事在人观后感
2015/06/16 职场文书
人民调解协议书
2016/03/21 职场文书
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS
django中websocket的具体使用
2022/01/22 Python