24秒

全力以赴争取每个24秒……

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: 订阅 订阅 :: 管理 ::

问题产生 在web页面HTML中,容器(div,table等)中如果放入过长的字符串(英文、数字和部分标点符号组成,无空格),将会撑大容器,破坏页面外观。

出现这种情况基本有两个可能:

1. 人为的恶意破坏

2. 长URL

问题分析

1.为了避免容器被撑大,破坏页面,必须固定外部容器的大小。一般而言,在外面的table的css属性中,加入"table-layout:fixed;"就可以解决。

2. 当做以上处理时,尽管容器不会被撑大,页面也不会走形,但是其中的字符串会自动得溢出容器。为了处理这种溢出,有两个解决方案:

1)CSS中填入属性:"word-wrap:break-word;",这样长字符串会自动换行;但是这个属性属于CSS3.0标准,IE6.0以上支持,Firefox暂时不支持

2)CSS中填入属性:"over-flow:hidden;",这样溢出的字符串会自动被隐藏,但是对要解决显示整个字符串的情况不适用。

3.我们选择强制字符串换行的方式,具体为在html中插入一些控制符。我们选择,其所代表的意义为:当浏览器判断此处不断行会导致溢出则使其断行,否则不做处理。其适合于IE,Firefox和Safari3.0以上版本。(其他控制符课参考链接)

 问题解决方案

1. javascript: function wordwrap(id) 缺陷:传入id必须唯一,否则在IE中只能取得第一个相同id的Element,(Firefox可行)。许多动态生成的页面(比如包含for循环的),可能无法满足此要求。

2. javascript: function wordwrap(classname) 缺陷:classname可以重名,解决了id的问题。但是classname的方式,容器必须用style sheet,且处理工作一次性完成(在页面生成后),这位页面动态交互带来了困难。

3. javascript: function wordwrap(string) 缺陷:输入输出范围的都是string,此函数定义最为简洁,使用最为方便,也易于理解。但是唯一的问题也是致命的:传入的参数可能由服务器端自动生成,如果出现了引号(”)或者回车符,则在javascript中会产生string lietral error的问题。这个问题在javascript层面是无法解决的。

4. 服务器端函数 String wordwrap(String input) 缺陷:在页面的动态交互上,虽然具备功能性,但是影响效率;计算集中在服务器端,可能带来performance瓶颈;在大型项目中,此解决方案的共享性不高。 实现建议 字符串(无论是否过长)包含了空格(使浏览器可以自动换行的符号)和特殊符号两类(例如在html中的tag<...>和转义符#amp;等),这都是插入时需要考虑的因素。 建议可以使用正则表达式进行计算,高效也简单。 总结 方法的实现并不困难,主要是接口的定义上。因为各个浏览器的支持度的关系,前后端的实现都有其缺陷,要找到一个完全全局性通用的解决方案,几乎不太可能。可以根据项目大小以及其他具体情况,选择解决方案。

posted on 2010-08-05 09:36  bignjl  阅读(5200)  评论(1编辑  收藏  举报