时光博客 - WEB开发中的可用性和用户体验
Tag: js

JS innerHTML Double Quotes

通过jsinnerhtml来获取一个dom节点,内部的html值时,如果属性值没有空格,则ie左右版本下,都会出现标签大些,双引号丢失问题。如果属性值有空格,则标签会变成大写,引号则正常输出.看下面示例:

当属性值无空格时:
FF3.5.7(gecko/20091221)<div id="div2"></div>

IE6 弹出:<DIV id=div2></DIV>
IE7 弹出:<DIV id=div2></DIV>
IE8 弹出:<DIV id=div2></DIV>

有空格时:
FF3.5.7(gecko/20091221)<div id="div2 "></div>

IE6 弹出:<DIV id="div2 "></DIV>
IE7 弹出:<DIV id="div2 "></DIV>
IE8 弹出:<DIV id="div2 "></DIV>

产生这个BUG的原因是什么呢?

When you get the innerHTML of a DOM node in IE, if there are no spaces in an attribute value, IE will remove the quotes around it.IE's innerHTML doesn't remove quotes from non standard attributes.

即使是jQuery里面,jquery团队的技术人员也没有解决这个问题.

提供下解决方案:

  1. function ieInnerHTML(obj) { 
  2.      var zz = obj.innerHTML, 
  3.          z =  
  4.        zz.match(/<\/?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/?>/g); 
  5.       if (z){ 
  6.         for (var i=0;i<z.length;i++){ 
  7.           var y, zSaved = z[i]; 
  8.           z[i] = z[i].replace(/(<?\w+)|(<\/?\w+)\s/, 
  9.                               function(a){return a.toLowerCase();}); 
  10.           y = z[i].match(/\=\w+[?\s+|?>]/g); 
  11.            if (y){ 
  12.             for (var j=0;j<y.length;j++){ 
  13.               z[i] = z[i].replace(y[j],y[j] 
  14.                          .replace(/\=(\w+)([?\s+|?>])/g,'="$1"$2')); 
  15.             } 
  16.            } 
  17.            zz = zz.replace(zSaved,z[i]); 
  18.          } 
  19.        } 
  20.       return zz; 
  21.      } 

在相应的地方调用函数ieInnerHTML

  1. if(/*@cc_on!@*/0){ 
  2.     inner_str = ieInnerHTML(obj); 
  3. }else
  4.     inner_str = obj.innerHTML; 

 原理:对IE版本进行对应的JS处理,而且相应的元素标签中不要出现非标准元素

参考资料:

  1. innerHTML removes attribute quotes in Internet Explorer
  2. innerHTML中的双引号哪去了?

 

ImageSwitch For jQuery

最近在寻找图片切换效果,在网上找到了个不错的jquery版的图片切换效果,支持多种样式,纯js实现,视觉上绝对不逊色于FLASH。废话不多说看下效果图

兼容性:完美兼容Firefox 3.5.5 for win ,IE6,IE7,IE8,其他浏览器未测试

独立预览地址:http://liupeng.us/demo/jQuery/ImageSwitch/

示例代码:ImageSwitch_jQuery.rar

JS多语言设计方案

公司目前碰到一个项目,客户是美国CDC,因为考虑到中方与美方的合作机构,所以需要设计出多版本语言切换。要求前台实现。因为语言包不需要经常修改没必要入库操作,所以将语言包写在一个配置文件里面是最好的(自我感觉)。

先看DEMOJS多语言设计方案(带记忆效果)

于是第一次尝试,我写了一个语言包(js文件):

  1. message.en={ 
  2.         "1""Application Form for Project Activity"
  3.         "2""Project Name:"
  4.         "3""National Level:"
  5.         "4""Provincial Level:"
  6.         "5""Implementing Unit (NCAIDS division, provincial unit, or other):"
  7.         "6""Project ID #:" 
  8.        } 
  9.  
  10. message.chs={ 
  11.         "1""项目活动申请表"
  12.         "2""项目名称:"
  13.         "3""国家级单位:"
  14.         "4""省级单位:"
  15.         "5""项目执行单位(注明性艾中心科室,省级单位,或其他):"
  16.         "6""项目活动序号:" 
  17.      } 

 

js,css文件后面为什么有参数

有同学经常遇到html页面里加载的jscss文件带有参数,比如: 

  1. <script type="text/javascript" src="base.js?1217128319"></script> 
  2. <link rel='stylesheet' href='http://liupeng.us/base.css?version=2.3.3' type='text/css' /> 
  3. <link rel='stylesheet' href='http://liupeng.us/base.css?version=20080727182553' type='text/css' /> 

使用参数有两种可能,

    * 脚本并不存在,而是服务端动态生成的,因此带了个版本号,以示区别。
    * 客户端会缓存这些css或js文件,因此每次升级了js或css文件后,改变版本号,客户端浏览器就会重新下载新的js或css文件

第二种情况最多,也可能两种同时存在。

版本号,可以是一个随机数,也可以是一个递增的值,大版本小版本的方式,或者根据脚本的生成时间书写,比如 20080727182553 就是精确到了生成脚本的秒,而 2.3.3 就是大版本小版本的方式。

js中的window.open返回object的错误

在FLASH制作中碰到的,点击进入网站后,需要弹出一个满屏窗口(不带tpolbar)来显示整个FLASH网站。因为flash里面和网页中执行js代码是一样的,所以以网页为例。

系统中用javascript中的window.open后,页面返回了一个[object]。因为系统的原因,必需使用href="javascript:window.open()"这样的格式。所以只能通过以下办法解决。

解决window.open后返回object的错误

  1. <a href="javascript:void(window.open('','','width=200,height=200'))">window.open()</a> 

只在js的外层加上一个void不带返回参数的声明,依稀记得C语言时用过这个声明。

顺便在这里将window.open函数的参数使用也列出来:

  1. window.open函数参数列表 
  2. window = object.open([URL ][, name ][, features ][, replace]]]]) 
  3. URL:新窗口的URL地址 
  4. name:新窗口的名称,可以为空 
  5. featurse:属性控制字符串,在此控制窗口的各种属性,属性之间以逗号隔开。 
  6. fullscreen= { yes/no/1/0 } 是否全屏,默认no 
  7. channelmode= { yes/no/1/0 } 是否显示频道栏,默认no 
  8. toolbar= { yes/no/1/0 } 是否显示工具条,默认no 
  9. location= { yes/no/1/0 } 是否显示地址栏,默认no 
  10. directories = { yes/no/1/0 } 是否显示转向按钮,默认no 
  11. status= { yes/no/1/0 } 是否显示窗口状态条,默认no 
  12. menubar= { yes/no/1/0 } 是否显示菜单,默认no 
  13. scrollbars= { yes/no/1/0 } 是否显示滚动条,默认yes 
  14. resizable= { yes/no/1/0 } 是否窗口可调整大小,默认no 
  15. width=number 窗口宽度(像素单位) 
  16. height=number 窗口高度(像素单位) 
  17. top=number 窗口离屏幕顶部距离(像素单位) 
  18. left=number 窗口离屏幕左边距离(像素单位) 

JS中CSS Style标签对照表

js时会用到,如果发现自己想要的效果没有实现,而程序没问题的话,就参照下此表对应看下标签是否正确。

 

 

Color Panel 2.0-颜色拾取(更新)

平时做网站的时候,在颜色的选择上浪费了好多时间,严重影响开发效率。于是趁国庆放假,好好整理下以前收集的一些颜色和素材,总结下经验,这样将大大提高开发效率!不多说了,来看看在线演示效果吧!

在线体验http://liupeng.us/demo/color_panel.html

PS:大部分用的是JS来实现的,有很多颜色是参考网上的资料。网页暂时只支持IE6 ,跨浏览器的没做。因为本人平时都是用IE6来开发,主要原因还是因为本人js水平太烂...

Update 2008-09-29

  1. 加入web2.0色系,多大1080多种颜色。默认web2.0色系为现实。
  2. 由于web2.0色系模块过大,提供显示/关闭按钮。
  3. 点击颜色框,色值(带#)会自动复制到剪切板,CTRL+V粘贴即可。