手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:Javascript

纯CSS无hacks的跨游览器多列布局

CSS在我的网站上没有分类,因此我也不知道怎么放就扔到javascript里了。权且当成前端分类吧?哈哈,自我安慰一下
CSS我实在不熟,所以看到有好的东西,都会暂时的收藏。

作者是司徒正美(老是让我想起车田正美,不知道的人,估计和我不是同一年代的。OHOHOH)

内容如下:

翻译自Matthew James Taylor的Equal Height Columns with Cross-Browser CSS and No Hacks,有些部分根据我的理解改了,让一些初心者更好理解。

利用纯CSS创建一个等高多列的布局并不件易事,本教程将着重分析出现在多列布局的多个问题,然后为大家等来一个简单全游览器通吃的解决方法,不使用图片,脚本,CSS hacks并在最严格的XHTML 规范中都能通过验证。

 

问题的症结所在

可点击放大缩小

如上图所示,由于各列的内容不一致导致其背景的高度也不统一。而背景实质上是内容(标准的盒子模型是由内容区,补白区,边框区与边界区组成,背景存 在于前三者中;IE为前两者)的自适应的问题。再转化一下,如何撑大那些较短的列的高度,让所有列的高度等于最高的列的高度?这个,的确很很棘手,因为我 们不清楚各列的高度,也无从得知哪一列最高。我们也不能简单地给所有列一个明确的高度,这可能会导致所有列都多出一大片空白,或者很不亏由于高度不足导致 某些列的内容无法全部显示出来!现实中,内容的长度是动态的,因此每列的高度也是动态的。我们必须意识到在网络中,不存在”固定“二字,每个人的显示器的 分辩率都不尽一样,游览器的字体大小设置也不尽相同,这些都会影响到内容的显示高度。

 

对内容与背景实行分离

解决等高问题的第一步就是把它拆分为两个较小的,可以单独解决的部分。这样,我们原来是一列对应一个DIV,现在是一列对应一个DIV,一个用来装 载内容,一个用来显示背景。这种分离有利于我们对各个元素的掌控和把它们用另一种更有效的方式组合起来,这引起我很快会在下面的章节讲述。

利用浮动嵌套解决最高列的高度的问题。

这是解决多列等高的关键。使一个DIV的高度等于最高列的高度的唯一方法就是让这个DIV包含所有的列。换句话说,通过把所有的列放在一个容器中,容器的高度就是最高列的高度。这是个非常有用的结构。

可点击放大缩小

单行三列的布局的结构层代码。

<div id="container1">
<div id="col1">Column 1</div>
<div id="col2">Column 2</div>
<div id="col3">Column 3</div>
</div>

对应的表现层代码。

#container1 {
float:left;
width:100%;
}
#col1 {
float:left;
width:30%;
background:red;
}
#col2 {
float:left;
width:40%;
background:yellow;
}
#col3 {
float:left;
width:30%;
background:green;
}

为了使用这种结构在所有游览器都正常工作,我们必须让外层容器往左或右浮动,并且其子元素包含每一栏内容的DIV也跟着浮动,哪一个方向都无所谓。 浮动会使用它们往上对齐于外围容器的上补白,并且浮动的容器会自动调整自身的高度与宽度以实现对浮动子元素的包含。但是如果容器被定义了高度与宽度,则它 不会随子元素的大小而自动调整自身显示区域来适应子元素的显示。但在IE6与低版本的IE中,子浮动元素能撑开外围元素;幸好IE7与IE8已引正了这个 不符合标准的做法。

增加用来显示背景的容器

下一步是增加额外的容器,让它们彼此嵌套,并让所有外围的容器数(新增的加上原来的那一个)等于列的总数:3。这三个容器用来显示各列的背景。请注意,我们去掉了原来各列的背景,把它们移至这些容器上。

可点击放大缩小

新的结构层代码,让新增的容器套在原来的外围容器上!

<div id="container3">
<div id="container2">
<div id="container1">
<div id="col1">Column 1</div>
<div id="col2">Column 2</div>
<div id="col3">Column 3</div>
</div>
</div>
</div>

新的表现层代码,新增的容器都是浮动元素!

所有元素左浮动,将容器宽度设为100%,使他们占满页面的宽度。背景色从内容 div 移除并加至容器上。注,原文是所有容器的宽都设为100%,其实根本没有这样的必须,因为在浮动嵌套中,外面的容器必须会被撑大能容得下内部子元素的大小!

#container3 {
float:left;
/*width:100%;*/
background:green;
}
#container2 {
float:left;
/*width:100%;*/
background:yellow;
}
#container1 {
float:left;
width:100%;
background:red;
}
#col1 {
float:left;
width:30%;
}
#col2 {
float:left;
width:40%;
}
#col3 {
float:left;
width:30%;
}

用相对定位来移动容器

现在是所有容器都完美地累在一起,只显示一种背景颜色,我们必须让其他背景也显示出来。为此我们就得利用相对定位来让这些容器像阶梯一样放置。这个 本可以使用负边界技术,但该死的IE5.5的盒子模型与W3C的不一致,为了兼容我们就得使用到CSS hack。由于本文声明是不使用CSS hack,因此放弃。首先让#container2向右移到30%,由于#container2装着#container1,而#container1上 装着那三个列,这样一来,最右边的列就被移出游览器的右边了。而最外围最底层的容器#container3则露出来了,露了左边的30%。然后我们再移动 最上层的容器#container1,向右边移动40%,于是原来盖住的第二层容器也露出来了,露出其左边的40%,而#container1则只剩下 100%-30%-40%=30%;上方的列也只剩下最右边的列,却表现为位于最左边。这样,背景也显示正常了!

可点击放大缩小

对应的表现层代码

#container3 {
float:left;
/*width:100%;*/
/*没有必要的代码被注释掉!*/
background:green;
}
#container2 {
float:left;
/*width:100%;*/
/*没有必要的代码被注释掉!*/
background:yellow;
position:relative;
right:30%;
}
#container1 {
float:left;
width:100%;
background:red;
position:relative;
right:40%;
}
#col1 {
float:left;
width:30%;
}
#col2 {
float:left;
width:40%;
}
#col3 {
float:left;
width:30%;
}

把各列的内容移回原来的位置上

由于最上层的那三列都是被整体往右往到(页面的)70%,我们再把它们都往左移回70%就是!最后,由于我们前两个背景容器都是被向右移动,移出了游览器,它们都与游览器的右边连在一起,我们可以设置最底层的背景容器的overflow来隐藏那些被移出的部分。

#container3 {
float:left;
/*width:100%;*/
/*没有必要的代码被注释掉!*/
background:green;
overflow:hidden;
position:relative;
}
#container2 {
float:left;
/*width:100%;*/
/*没有必要的代码被注释掉!*/
background:yellow;
position:relative;
right:30%;
}
#container1 {
float:left;
width:100%;
background:red;
position:relative;
right:40%;
}
#col1 {
float:left;
width:30%;
position:relative;
left:70%;
}
#col2 {
float:left;
width:40%;
position:relative;
left:70%;
}
#col3 {
float:left;
width:30%;
position:relative;
left:70%;
}

对列添加补白(内边距)

最后,我们对列增加补白,让每列显得大方一些,而不是密密麻麻地塞满一列。但是如果我们增加补白,可能有一些游览器的有病又犯了,在IE6和更低版本的 IE中,其怪异的盒子模型,会产生一些我们不愿看到的结果。如,一个 200px 宽 20px 补白的 box 在 IE 中被视为 200px 宽,在其他浏览器中则为正确的 240px。补白应该加在元素的宽度上。

不过放心,我们可以用完全不依赖于 padding 的方法来解决这个问题。相反,我们把列弄窄一点(列宽减去两侧的补白),之后用相对定位把它们移至正确的位置。例如,我们用了 2% 的补白,则 30% 的列将减至 26%,40% 的列减至 36%。用相对定位移回列时需谨记,现在列变窄了,所以当它们一起像最初那样左浮动时,每一个需要比上一个移动更远的距离。

可点击放大缩小

完整的CSS

为了使布局保持在小宽度我在每个内容列增加了overflow:hidden; 这将切去超出列宽的东东,并阻止其干扰其他布局。重申一下,这只是 IE 的问题,其他所有浏览器会保持正确的布局,不管列内是虾米。如果你真想这样做,可以用 IE 条件注释只对 IE 写规则。

#container3 {
float:left;
background:green;
overflow:hidden;
position:relative;
}
#container2 {
float:left;
background:yellow;
position:relative;
right:30%;
}
#container1 {
float:left;
width:100%;
background:red;
position:relative;
right:40%;
}
#col1 {
float:left;
width:26%;
position:relative;
left:72%;
overflow:hidden;
}
#col2 {
float:left;
width:36%;
position:relative;
left:76%;
overflow:hidden;
}
#col3 {
float:left;
width:26%;
position:relative;
left:80%;
overflow:hidden;
}
AppEngine在本周引起很大反响,它提供了一个简单易用的方法 来运行Python写成的Web应用。但是Ruby社区并不需要看Google的脸色,它已经拥有了关于简单部署的解决方案。我们来看两个新的解决方案, 它们均是基于Rails开发者使用的公用基础之上构建的。
Column 1

Heroku 和Morph实验室是Ruby on Rails的托管提供商,提供运行Ruby on Rails应用的整套环境。和传统的托管商相比,他们并不仅仅是提供一个服务器给你,而且提供有趣的工具和接口来帮助你更加容易的工作,使你从繁重的安 装、配置、管理和保证服务器安全中解脱出来。两者皆是使用Amazon的EC2网格计算技术来运行应用,因此你可以毫不担心可伸缩性与性能问题。

Column 2

另一个被Heroku和Morph实验室所推崇的重要特性是无痛部署。部署一个新应用只需要几分钟而已:来看看Heroku的即时部署demo和Morph eXchange的6分钟部署demo,部署是多么简单。

Column 3
两者所带来的是如此的相似。InfoQ采访了这两个项目的相关人员,有更多信息奉上。
James Lindenbaum阐述了Heroku的独有特性:
Heroku无疑是Rails应用最简单的部署平台。只是简单的把代码放进去,然后启动、运行,没人会做不到这些。Heroku会处理一切,从版本控制到 自动伸缩的协作(基于Amazon的EC2之上)。我们提供一整套工具来开发和管理应用,不管是通过Web接口还是新的扩展API。
Heroku的一个非常有趣的特性就是基于浏览器的开发环境。它参考了Gyre的开发经验,Gyre的开发者Adam Wiggins也是Heroku背后的一员。因此如果你希望快速修改和追加的话,只需要通过浏览器编辑正在运行的应用的源代码,并在修改后自动部署。当 然,使用浏览器IDE并不是唯一访问Heroku服务的方法,还可以来看看Heroku的API和外部Git访问。

运行代码

好了,文章就此结果,更多的例子可以参看原作者的网址,或点击以下链接:2 列 3 列4 列,以及 5 列

A*算法的JS实现

网上找来的代码,经典的东西哦。做网游的人可能会用到。。

XML/HTML代码
  1. <html><head><title>use A* to find path...</title></head>  
  2. <body style="margin:0px">  
  3. <script>  
  4. /*  
  5. written by hjjboy  
  6. email:tianmashuangyi@163.com  
  7. qq:156809986  
  8. */  
  9. var closelist=new Array(),openlist=new Array();//closelist保存最终结果。openlist保存临时生成的点;  
  10. var gw=10,gh=10,gwh=14;//参数 gh是水平附加参数 gwh是四角的附加参数。  
  11. var p_start=new Array(2),p_end=new Array(2);//p_start为起点,p_end为终点  
  12. var s_path,n_path="";//s_path为当前点 n_path为障碍物数组样式的字符串.  
  13. var num,bg,flag=0;  
  14. var w=30,h=20;  
  15. function GetRound(pos){//返回原点周围的8个点  
  16.     var a=new Array();  
  17.     a[0]=(pos[0]+1)+","+(pos[1]-1);  
  18.     a[1]=(pos[0]+1)+","+pos[1];  
  19.     a[2]=(pos[0]+1)+","+(pos[1]+1);  
  20.     a[3]=pos[0]+","+(pos[1]+1);  
  21.     a[4]=(pos[0]-1)+","+(pos[1]+1);  
  22.     a[5]=(pos[0]-1)+","+pos[1];  
  23.     a[6]=(pos[0]-1)+","+(pos[1]-1);  
  24.     a[7]=pos[0]+","+(pos[1]-1);  
  25.     return a;  
  26. }  
  27. function GetF(arr){ //参数为原点周围的8个点  
  28.     var t,G,H,F;//F,综合的距离值,H,距离值 G,水平\角落附加计算  
  29.     for(var i=0;i<arr.length;i++){  
  30.         t=arr[i].split(",");  
  31.         t[0]=parseInt(t[0]);  
  32.         t[1]=parseInt(t[1]);  
  33.         if(IsOutScreen([t[0],t[1]])||IsPass(arr[i])||InClose([t[0],t[1]])||IsStart([t[0],t[1]])||!IsInTurn([t[0],t[1]]))  
  34.             continue;//如果上面条件有一满足,则跳过本次循环,进行下一次。  
  35.         if((t[0]-s_path[3][0])*(t[1]-s_path[3][1])!=0)//判断该点是否处于起点的垂直或横向位置上  
  36.             G=s_path[1]+gwh;//如果不在G=14;  
  37.         else  
  38.             G=s_path[1]+gw;//如果在G=10;  
  39.         if(InOpen([t[0],t[1]])){//如果当前点已存在openlist数组中  
  40.             if(G<openlist[num][1]){  
  41.             maptt.rows[openlist[num][4][1]].cells[openlist[num][4][0]].style.backgroundColor="blue";//调试  
  42.                 openlist[num][0]=(G+openlist[num][2]);  
  43.                 openlist[num][1]=G;  
  44.                 openlist[num][4]=s_path[3];  
  45.             }  
  46.             else{G=openlist[num][1];}  
  47.         }  
  48.         else{  
  49.             H=(Math.abs(p_end[0]-t[0])+Math.abs(p_end[1]-t[1]))*gw;  
  50.             F=G+H;  
  51.             arr[i]=new Array();  
  52.             arr[i][0]=F;  
  53.             arr[i][1]=G;  
  54.             arr[i][2]=H;  
  55.             arr[i][3]=[t[0],t[1]];  
  56.             arr[i][4]=s_path[3];  
  57.             openlist[openlist.length]=arr[i];//将F等信息保存到openlist  
  58.         }  
  59.         if(maptt.rows[t[1]].cells[t[0]].style.backgroundColor!="#cccccc"&&maptt.rows[t[1]].cells[t[0]].style.backgroundColor!="#0000ff"&&maptt.rows[t[1]].cells[t[0]].style.backgroundColor!="#ff0000"&&maptt.rows[t[1]].cells[t[0]].style.backgroundColor!="#00ff00")  
  60.         {  
  61.             maptt.rows[t[1]].cells[t[0]].style.backgroundColor="#FF00FF";  
  62.             if(F!=undefined)  
  63.             maptt.rows[t[1]].cells[t[0]].innerHTML="<font color='black'>"+F+"</font>";  
  64.         }  
  65.     }  
  66. }  
  67. function IsStart(arr){ //判断该点是不是起点  
  68.     if(arr[0]==p_start[0]&&arr[1]==p_start[1])  
  69.         return true;  
  70.     return false;  
  71. }  
  72. function IsInTurn(arr){ //判断是否是拐角  
  73.     if(arr[0]>s_path[3][0]){  
  74.         if(arr[1]>s_path[3][1]){  
  75.             if(IsPass((arr[0]-1)+","+arr[1])||IsPass(arr[0]+","+(arr[1]-1)))  
  76.                 return false;  
  77.         }  
  78.         else if(arr[1]<s_path[3][1]){  
  79.             if(IsPass((arr[0]-1)+","+arr[1])||IsPass(arr[0]+","+(arr[1]+1)))  
  80.                 return false;  
  81.         }  
  82.     }  
  83.     else if(arr[0]<s_path[3][0]){  
  84.         if(arr[1]>s_path[3][1]){  
  85.             if(IsPass((arr[0]+1)+","+arr[1])||IsPass(arr[0]+","+(arr[1]-1)))  
  86.                 return false;  
  87.         }  
  88.         else if(arr[1]<s_path[3][1]){  
  89.             if(IsPass((arr[0]+1)+","+arr[1])||IsPass(arr[0]+","+(arr[1]+1)))  
  90.                 return false;  
  91.         }  
  92.     }  
  93.     return true;  
  94. }  
  95. function IsOutScreen(arr){ //是否超出场景范围  
  96.     if(arr[0]<0||arr[1]<0||arr[0]>(w-1)||arr[1]>(h-1))  
  97.         return true;  
  98.     return false;  
  99. }  
  100. function InOpen(arr){//获得传入在openlist数组的位置,如不存在返回false,存在为true,位置索引保存全局变量num中。  
  101.     var bool=false;  
  102.     for(var i=0;i<openlist.length;i++){  
  103.         if(arr[0]==openlist[i][3][0]&&arr[1]==openlist[i][3][1]){  
  104.             bool=true;num=i;break;}  
  105.     }  
  106.     return bool;  
  107. }  
  108. function InClose(arr){  
  109.     var bool=false;  
  110.     for(var i=0;i<closelist.length;i++){  
  111.         if((arr[0]==closelist[i][3][0])&&(arr[1]==closelist[i][3][1])){  
  112.             bool=true;break;}  
  113.     }  
  114.     return bool;  
  115. }  
  116. function IsPass(pos){ //pos这个点是否和障碍点重合   
  117.     if((";"+n_path+";").indexOf(";"+pos+";")!=-1)  
  118.         return true;  
  119.     return false;  
  120. }  
  121. function Sort(arr){//整理数组,找出最小的F,放在最后的位置。  
  122.     var temp;  
  123.     for(var i=0;i<arr.length;i++){  
  124.         if(arr.length==1)break;  
  125.         if(arr[i][0]<=arr[i+1][0]){  
  126.             temp=arr[i];  
  127.             arr[i]=arr[i+1];  
  128.             arr[i+1]=temp;  
  129.         }  
  130.         if((i+1)==(arr.length-1))  
  131.             break;  
  132.     }  
  133. }  
  134. function main(){//主函数  
  135.        // alert('');  
  136.         GetF(//把原点周围8点传入GetF进行处理。算A*核心函数了 :),进行求F,更新openlist数组  
  137.             GetRound(s_path[3]) //求原点周围8点  
  138.         );  
  139.   //  debugdiv.innerHTML+="A:"+openlist.join('|')+"<br />";//调试  
  140.         Sort(openlist);//整理数组,找出最小的F,放在最后的位置。  
  141.     //debugdiv.innerHTML+="B:"+openlist.join('|')+"<br />";//调试  
  142.         s_path=openlist[openlist.length-1];//设置当前原点为F最小的点  
  143.         closelist[closelist.length]=s_path;//讲当前原点增加进closelist数组中  
  144.         openlist[openlist.length-1]=null;//从openlist中清除F最小的点  
  145.     //debugdiv.innerHTML+="C:"+openlist.join('|')+"<br />";//调试  
  146.         if(openlist.length==0){alert("Can't Find the way");return;}//如果openlist数组中没有数据了,则找不到路径  
  147.         openlistopenlist.length=openlist.length-1;//上次删除把数据删了,位置还保留了,这里删除  
  148.         if((s_path[3][0]==p_end[0])&&(s_path[3][1]==p_end[1])){//如果到到终点了,描绘路径  
  149.             getPath();  
  150.         }  
  151.         else{//否则循环执行,标准原点  
  152.             maptt.rows[s_path[3][1]].cells[s_path[3][0]].style.backgroundColor="green";setTimeout("main()",100);  
  153.         }  
  154. }  
  155. function getPath(){//描绘路径  
  156.     var str="";  
  157.     var t=closelist[closelist.length-1][4];  
  158.     while(1){  
  159.         str+=t.join(",")+";";  
  160.         maptt.rows[t[1]].cells[t[0]].style.backgroundColor="#ffff00";  
  161.         for(var i=0;i<closelist.length;i++){  
  162.             if(closelist[i][3][0]==t[0]&&closelist[i][3][1]==t[1])  
  163.                 t=closelist[i][4];  
  164.         }  
  165.         if(t[0]==p_start[0]&&t[1]==p_start[1])  
  166.             break;  
  167.     }  
  168.     alert(str);  
  169. }  
  170. function setPos(){//初始原点为起点  
  171.     var h=(Math.abs(p_end[0]-p_start[0])+Math.abs(p_end[1]-p_start[1]))*gw;  
  172.     s_path=[h,0,h,p_start,p_start];  
  173. }  
  174. function set(id,arr){//设置点的类型  
  175.     switch(id){  
  176.         case 1:  
  177.             p_start=arr;  
  178.             maptt.rows[arr[1]].cells[arr[0]].style.backgroundColor="#ff0000";break;  
  179.         case 2:  
  180.             p_end=arr;maptt.rows[arr[1]].cells[arr[0]].style.backgroundColor="#0000ff";break;  
  181.         case 3:  
  182.             n_path+=arr.join(",")+";";maptt.rows[arr[1]].cells[arr[0]].style.backgroundColor="#cccccc";break;  
  183.         default:  
  184.             break;  
  185.     }  
  186. }  
  187. function setflag(id){flag=id;}  
  188. </script>  
  189. <table id="maptt" cellspacing="1" cellpadding="0" border="0" bgcolor="#000000">  
  190. <script>  
  191. for(var i=0;i<h;i++){  
  192.     document.write("<tr>");  
  193.     for(var j=0;j<w;j++){  
  194.         document.write('<td onclick="set(flag,['+j+','+i+']);" bgcolor="#ffffff" width="20" height="20"></td>');  
  195.     }  
  196.     document.write("</tr>");  
  197. }  
  198. </script>  
  199. </table>  
  200. <a href="javascript:setflag(1);">StarPoint</a><br>  
  201. <a href='javascript:setflag(2);'>EndPoint</a><br>  
  202. <a href='javascript:setflag(3);'>Wall</a><br>  
  203. <input type="button" onclick="setPos();main();this.disabled=true;" value="find">  
  204. <div id="debugdiv"></div>  
  205.   
  206. </body>  
  207. </html>  

原文连接:http://www.gamedev.net/reference/articles/article2003.asp
中文翻译:http://data.gameres.com/message.asp?TopicID=25439

我是从http://www.cnblogs.com/jimtomjim/archive/2009/07/20/1527112.html拷贝来的

Tags: a*

符合w3c 的 strict标准,用 rel 替换_blank打开新窗口

说实话,我没有用过这种方法,也不知道是否非常有用。但总体来说,它的效率肯定不如直接target="_blank"好吧?

如果不用JS,那以后的版本里怎么办才好呢?难道不开新窗了?怎么办?未来该如何操作?

原文如下:

itpob:http://www.cnblogs.com/itpob/archive/2009/07/19/1526700.html

  1. 现在一般网站打开新窗口采用的是target="_blank",这在过渡型DOCTYPE(xh tml1-transitional. dtd)下是允许的,但也不符合W3C的strict(xhtml1-strict.dtd)标准。  
  2.   
  3. 如果你去验证,会发现有下面的错误提示:  
  4.   
  5. "there is no attribute target for this element(in this HTML version)"  
  6.   
  7. 这是因为W3C认为如果不经过用户同意,没有明确提示就打开一个新窗口是不礼貌的。所以我们只好用下面的rel属性来解决这个问题。rel是 HTML4.0新增加的一个属性,这个属性用来说明链接和包含此链接页面的关系,以及链接打开的目标。rel有许多的属性值,比如next、 previous,、chapter、section等等。  
  8.   
  9. 我们用rel属性的external和一个js脚本来解决问题,代码如下:  
  10.   
  11.  <a href=”http://www.kepu8.com“ rel="external"> 打开一个新窗口</a>  
  12.   
  13.     * 大量古细菌在海底被发现  
  14.     * 英开发致命超级病菌-绿脓杆菌早期检测技术   
  15.     * 无需 DNA 细菌也变身  
  16.     * 小袋鼠育儿袋内吃奶照片  
  17.     * 大白鲨类似连环杀手-捕食方式揭秘  
  18.     * 蚂蚁长寿差异之谜:蚁后更长寿的秘诀在于多睡觉   
  19.     * 张启发院士:培育绿色超级稻可缓解农业生态问题   
  20.     * 广西反季节龙眼新品种挂果枝率达98%以上   
  21.     * 日本专家从柚子皮中提取出能抑制过敏的物质   
  22.     * 水稻精确定量栽培技术实现新突破  
  23.   
  24.   
  25. 我们把js文件存储为external.js,然后通过<script type="text/javascript" src="external.js"></script>调用  
  26.   
  27. 下面是js文件  
  28.   
  29. function externallinks() {   
  30.     if (!document.getElementsByTagName) return;   
  31.     var anchors = document.getElementsByTagName("a");   
  32.     for (var i=0; i<anchors.length; i++) {   
  33.         var anchor = anchors[i];  
  34.         if (anchor.getAttribute("href") &&   
  35.             anchor.getAttribute("rel") == "external")   
  36.             anchor.target = "_blank";   
  37.     }   
  38. }   
  39. window.onload = externallinks;  

Tags: w3c, strict, rel, _blank

如何避免switch-case组合

这是cssrain站长翻译的一篇文章,事实上,在PHP中,已经不太建议使用switch-case了。
特别是在面向OO的代码中,你几乎也看不到这样的代码出现

不是说这个方式不好。而是,它的可扩展性不强。所以在大多数情况下,都放弃采用这种方式。

以下是翻译内容,来源于:http://www.cssrain.cn/article.asp?id=1384

我很年轻,还没有做过很长的编程。所以我对使用switch-case 语法没有什么很深刻的印象,至少在我的记忆中是这样。或许你认为这是一件坏事情。你甚至会怀疑我为什么不使用它们。我真的不知道为什么,似乎我天生就不喜欢使用它,如下所示:

JavaScript代码
  1. switch (something) {  
  2.   case 1:  
  3.     doX();  
  4.   break;  
  5.   case 2:  
  6.     doY();  
  7.   break;  
  8.   case 3:  
  9.     doN();  
  10.   break;  
  11.   // And so on...  
  12. }  

显然,虚构此代码的作者不够了解使用其他JavaScript方法来构建此功能。其实有很多种方式更适合这种情况,而不是一个丑陋的switch. 有许多许多更轻松,更优雅的方式来实现这种功能。
switch-case组合肯定是非常有用的,当你有一个变量并且依靠它的值的不同来做不同的事情。使用多个if-else不太恰当,所以人们通常使用switch-case来代替多个if-else.我敢肯定你也是.
上面的例子依赖于 something 判断 ,然后根据条件运行doX , doY或doN 。在JavaScript中,同样的逻辑可以表示一个简单的查找表的形式————对象,如下所示:

JavaScript代码
  1. var cases = {  
  2.    1: doX,  
  3.    2: doY,  
  4.    3: doN  
  5. };  
  6. if (cases[something]) {  
  7.    cases[something]();  
  8. }  

这不仅简洁,而且也可以重复使用和修改条件。所有条件都是对象的一部分,因此,如果您需要改变某些条件那就非常简单了。

所以,我想说的是:请不要使用switch-case,除非绝对必要的。 为什么? 因为有更好的替代品,比它更简单!

关于“ switch-case”的语法,请浏览:http://en.wikipedia.org/wiki/Switch_statement

如果想阅读原文,请点击这里:http://james.padolsey.com/javascript/how-to-avoid-switch-case-syndrome/
提示:译文跟原文有出入,请看原文。

Tags: javascript

用div挡住flash,给flash加上链接(兼容ie+firefox,具备a链接所有属性)

本文来自博客园,原理,我感觉和我以前写的很象。。。我写的如何用DIV挡住SWF?差不多也是这个意思吧?

问题描述:公司合作的一个酒店预订网站需要在页面上投广告,但对方给了一个flash文件,要求链接到其首页。直接在html的flash object前面加上<a href=...>,发现链接是点不动的。

解决过程:
开发人员没有意识到这个问题,写出的问题代码如下:

 

XML/HTML代码
  1. <a href="http://www.youiyou.net">  
  2.     <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="468" height="60">  
  3.         <param name="movie" value="**.swf">  
  4.         <param name="quality" value="high">  
  5.         <embed src="*.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="468" height="60"></embed>  
  6.     </object>  
  7. </a>  

鼠标放上去是没有任何效果的,原因是默认情况下flash会被放到最高层,可能有朋友也碰到过下拉菜单被flash挡住的情况,也属于这个情况。

网上找到的解决方案是用一个透明的大button包在flash的最外层,或是用一个层盖住flash,然后定义button的onclick事件,但这种方式在firefox下工作不正常。
同时用户最关心的seo作用消失了,因为这不是一个正常的链接,是用javascript实现跳转的。

 

XML/HTML代码
  1. <button style="width:468;height:60;background:transparent;border:0;padding:0;cursor:hand" onclick="window.location.href='http://www.youiyou.net/'">   
  2.     <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="468" height="60">  
  3.         <param name="movie" value="**.swf">  
  4.         <param name="quality" value="high">  
  5.         <embed src="*.swf" wmode="transparent" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="468" height="60"></embed>  
  6.         <param name="wmode" value="transparent">  
  7.     </object>  
  8. </button>  

要想具有<a href...>的所有原生特性,最完美的方法应该就是用一个透明的<a href=...>链接盖住flash,最终我们采用了以下的代码,用一张大透明图链接盖住flash。
将flash放到了一个zindex为-1的层中,同时设置了wmode属性(代码中的 wmode="transparent" 和<param name="wmode" value="transparent">分别在firefox和ie下起作用)。
masker层是用来挡住flash所在层的,margin-top用到定位。blank.gif是一个透明的图片。效果如下所示,
大小: 14.94 K
尺寸: 500 x 58
浏览: 1790 次
点击打开新窗口浏览全图
title,鼠标手形均正常

XML/HTML代码
  1. <div style="z-index:-1">  
  2.     <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="468" height="60">  
  3.         <param name="movie" value="**.swf">  
  4.         <param name="quality" value="high">  
  5.         <embed src="*.swf" wmode="transparent" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="468" height="60"></embed>  
  6.         <param name="wmode" value="transparent">  
  7.     </object>  
  8. </div>  
  9. <div id="masker" style="cursor: hand; margin-top:-60px; width:468px; height:60px; z-index:1; visibility: visible;"><a href="http:www.youiyou.net"><img src="blank.gif" width="468" height="60" border="0" /></a></div></div>  
原文是博客园的dbgeng写的,地址为:http://www.cnblogs.com/dbgeng/archive/2009/06/27/1512320.html

Tags: div, flash