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 相关文章推荐
Ajax+Json 级联菜单实现代码
Oct 27 Javascript
基于jquery的关于动态创建DOM元素的问题
Dec 24 Javascript
文本框输入时 实现自动提示(像百度、google一样)
Apr 05 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
Aug 02 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
Mar 04 Javascript
微信小程序picker组件简单用法示例【附demo源码下载】
Dec 05 Javascript
剖析Angular Component的源码示例
Mar 23 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
Aug 15 Javascript
javascript中一些奇葩的日期换算方法总结
Nov 14 Javascript
vue实现固定位置显示功能
May 30 Javascript
详解webpack引用jquery(第三方模块)的三种办法
Aug 21 jQuery
JS操作字符串转数字的常见方法示例
Oct 29 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 5.3新增魔术方法__invoke概述
2014/07/23 PHP
php自定义apk安装包实例
2014/10/20 PHP
php编写的抽奖程序中奖概率算法
2015/05/14 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
Jquery 1.42 checkbox 全选和反选代码
2010/03/27 Javascript
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
2011/03/12 Javascript
javascript继承之为什么要继承
2012/11/10 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
javascript中全局对象的isNaN()方法使用介绍
2013/12/19 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
jquery判断对象是否为空并遍历对象的简单实例
2016/07/26 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
js实现日历的简单算法
2017/01/24 Javascript
js 实现复选框只能选择一项的示例代码
2018/01/23 Javascript
判断“命令按钮”是否被鼠标单击详解
2019/07/31 Javascript
JS如何在数组指定位置插入元素
2020/03/10 Javascript
python 使用poster模块进行http方式的文件传输到服务器的方法
2019/01/15 Python
python反编译学习之字节码详解
2019/05/19 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
Python Flask框架实现简单加法工具过程解析
2020/06/03 Python
python和c语言哪个更适合初学者
2020/06/22 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
在 Python 中使用 7zip 备份文件的操作
2020/12/11 Python
简单介绍CSS3中Media Query的使用
2015/07/07 HTML / CSS
天鹅湖观后感
2015/06/09 职场文书
校运会通讯稿
2015/07/18 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
2016年禁毒宣传活动总结
2016/04/05 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书
python opencv旋转图片的使用方法
2021/06/04 Python