20
Aug
2008
Author: zerty
In: CSS
一边固定宽度,另一边根据浏览器窗口大小自动缩放宽度是这种很常用的布局。特别是在BS项目的界面设计中,几乎都会用到。BI上有高手专门讨论了这种布局方法,但他用了较多的hack,还回避了IE6的dtd。我在实际使用中,发现回避掉IE6的dtd定义后,会导致ajax模态框无法居中(VS的一个控件,自动生成的代码,很难修改)。 于是自己写了个简单的左右两列的布局,没用到什么hack,很简单,只是练手用用。
css代码:left和right都贴住左侧。设置left在right上面(z-index);在right内加个放内容的层(content);设置content距离right的左侧为200px,即刚巧等于left的宽度。
- * {margin:0; padding:0; list-style:none; }
- .wrapper {width: 100%; }
- .left {width:200px;background:#fcc; position:absolute; left:0 ;z-index:1 }
- .right {width:100%;background:#ccc; position:absolute;left:0}
- .content {margin-left:200px;background:#ffc; }
完整代码
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title></title>
- <style type="text/css">
- * {margin:0; padding:0; list-style:none; }
- .wrapper {width: 100%; }
- .left {width:200px; background:#fcc; position:absolute; left:0 ;z-index:1 }
- .right {width:100%; background:#ccc; position:absolute; left:0}
- .content {margin-left:200px; background:#ffc; }
-
- </style>
- </head>
- <body>
- <div class="wrapper">
- <div class="left">左侧固定宽度200px</div>
- <div class="right">
- <div class="content">
- 右侧宽度自动适应
- </div>
- </div>
- </div>
- </body>
- </html>
7
Aug
2008
Author: zerty
In: CSS
先说下这套架构的优点:
1.可以方便的把繁重的CSS编写工作分配出去,而不会相互造成影响。
2.结构清晰,利于维护和修改。
3.每一张网页都仅加载自己需要的CSS。
总结下来就是:提高开发效率,提高维护效率,提高网页加载效率。

下面我解释一下上面这张CSS结构图:
图中间的5个黑色的图示表示网页,其中上面单独的一张是母版页,下面四张是子页。使用VS的人都知道母版页的作用,相当于asp中的include,把共通的部分作成母版,单独的部分作成子页,提高开发效率。
图上方绿色框内的是全局CSS部分,它们存放在styles文件夹中,由母版调用并作用到所有子页。
图上方蓝色虚线框是单一CSS部分,其中每一张子页都有对应的文件夹用来存放自己独有的CSS文件。它们存放在styles/x文件夹中。 由各自对应的C#文件控制:打开不同的子页时,母版加载当前页的CSS。
图左下角的红色框是主题部分,用来存放全局的样式和图片。作用和绿色框一样,只不过它是由子页加载的,并不是母版统一加载的。 这部分和绿色框合并也无大碍。
接下来我介绍一下那么多CSS文件都有什么用?
—Adm/styles
——Basic.css 全局基础样式
——Layout.css 全局布局样式 (尺寸,定位等)
——General.css 全局美观样式 (颜色,图片等)
—Adm/styles/GroupManager 文件夹(例子)
——Group_Layout.css group页特有的布局样式
——Group_General.css group页特有的美观样式
调用这么多CSS会带来较多的服务器请求,下面附上解决办法。

7
Aug
2008
Author: zerty
In: JavaScript
不同页面传值的老版本
改进点:支持同页面有多个文本框,可自动向不同的文本框传值。先看演示吧
其实原理也很简单。同样先通过getAttribute判断type属性,捕捉到按钮。然后在按钮onclick时把i通过url传入子页面。
- <h2>input1</h2>
- <input type="text" /><input type="submit" />
- <h2>input2</h2>
- <input type="text" /><input type="submit" />
-
- <script type="text/javascript"><!--
- var aInput = document.getElementsByTagName("input");
- for (i = 0 ; i < aInput.length ; i++ )
- {
- (
- function (i){
- if (aInput[i].getAttribute("type") == "submit")
- {
- aInput[i].onclick = function (){
- window.open('b.html?'+i,'newwindow','height=100,width=400')
- }
- }
- }
- )(i)
- }
- // --></script>
子页面用slice方法对url进行切分。并使用window.opener方法捕捉到父页面的文本框,进行赋值。 一切就OK了
- <h2>openWindow</h2>
- <input type="text" /><input type="submit" />
-
- <script type="text/javascript"><!--
- var aInput = document.getElementsByTagName("input");
-
- for (i = 0 ; i < aInput.length ; i++ )
- {
- if (aInput[i].getAttribute("type") == "text") var textboxB = new Object(aInput[i]);
- if (aInput[i].getAttribute("type") == "submit") var btnB = new Object(aInput[i]);
- }
-
- btnB.onclick = function(){
- var sTextValue = textboxB.value
- var aInput = window.opener.document.getElementsByTagName("input");
- var sUrl = document.location;
- var sNo = sUrl.toString().slice(-1)
- window.opener.aInput[sNo-"1"].value = sTextValue
- window.close();
- }
- // --></script>
还没明白的朋友看一下原理图就知道了

30
Jul
2008
Author: zerty
In: 未分类
官方下载地址: http://screenshot-program.com/downloads.php
扩展名:Fireshot
支持Firefox3,同时也有IE版本。
专业版提供即时编辑功能,30天试用期。简装版没有编辑功能,但平时截个图也足够用了。

安装后会在状态栏上显示操作按钮。 左二的“半张纸”表示截取当前可视部分的网页,点一下后变成一整张纸,就可以截取完整的一张网页。

25
Jul
2008
Author: zerty
In: JavaScript
大家仔细看下面两段代码,代码一的window.onload = doIt()函数后面有();而代码二的window.onload = doIt函数名后面没有括号。
把两段代码分别测试后发现不带括号的window.onload在页面加载后显示了正确的效果。 我想window.onload也相当于一个触发事件,如果函数加了括号那就直接先执行函数,再加载body。而不加括号,则相当于将一个函数当作变量赋值到window.onload上,并不立即加载。
代码一:
- <!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>
- <script>
- window.onload = doIt();
- function doIt() {
- var oDiv = document.getElementById("div1");
- alert (oDiv);
- }
- </script>
- </head>
- <body>
- <div id="div1"></div>
- </body>
- </html>
代码二:
- <!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>
- <script>
- window.onload = doIt;
- function doIt() {
- var oDiv = document.getElementById("div1");
- alert (oDiv);
- }
- </script>
- </head>
- <body>
- <div id="div1"></div>
- </body>
- </html>
23
Jul
2008
Author: zerty
In: JavaScript

这是一个Q&A的页面,设计师希望能够点击相关的问题后,在它下方显示对应的答案。这是一个比较常见功能,通常的解决办法是把“答案”当作整个问题容器的子元素,然后点击父元素上的按钮后展开对应的子元素。通过父子元素的对应关系来匹配标题和答案。
但是当初写html的时候并没有考虑到脚本编写(需求是后加的),所以,答案和标题没有父子关系可以对应。 html代码如下。
所以,这里需要用到另一种方法来匹配答案和标题。我们可以通过捕捉元素的位置来匹配它们。也就是说第一条标题,对应的肯定是整个序列中的第一条答案,第二条标题对应的肯定是第二条答案。 这样就可以无视html结构来控制它们的对应关系了。
- <ul class="qusetionList">
- <li class="liHeader"><span class="colABC-A">編號</span><span class="colABC-B">標題</span><span class="colABC-C">編輯者/發問者</span></li>
-
- <li class="liBody"><span class="colABC-A">1</span><span class="colABC-B">想要開小店需要付費嗎?</span><span class="colABC-C"><a href="#" title="" class="openLink"></a> 客服</span></li>
- <li class="answer"><span class="colABC-B">
- 現階段於策視其所以不收取任何費用,請使用者不用擔心。<BR>
- 除了加值服務的功能模組之外。</span><span class="colABC-C"><a href="#" title="" class="closeLink"></a> 客服</span></li>
-
- <li class="liBody"><span class="colABC-A">2</span><span class="colABC-B">想要開小店需要付費嗎?</span><span class="colABC-C"><a href="#" title="" class="openLink"></a> 客服</span></li>
- <li class="answer"><span class="colABC-B">
- 現階段於策視其所以不收取任何費用,請使用者不用擔心。<BR>
- 除了加值服務的功能模組之外。</span><span class="colABC-C"><a href="#" title="" class="closeLink"></a> 客服</span></li>
- </ul>
脚本解释:当点击openLink这个图标时,显示和openLink在序列中位置相同的answer。这里需要将onclick事件放在闭包里面,等到for循环结束后才被激活。如果没有这层闭包,那不管点击哪个openLink,显示的都将是openLink.length的值。
- document.getElementsByClassName = function(eleClassName)
- {
- var getEleClass = [];//定义一个数组
- var myclass = new RegExp("\\b"+eleClassName+"\\b");//创建一个正则表达式对像
- var elem = this.getElementsByTagName("*");//获取文档里所有的元素
- for(var h=0;h<elem.length;h++)
- {
- var classes = elem[h].className;//获取class对像
- if (myclass.test(classes)) getEleClass.push(elem[h]);//正则比较,取到想要的CLASS对像
- }
- return getEleClass;//返回数组
- }
- //上面这是捕捉class的方法,我一直用它,复制过来就OK。
-
- var answer = document.getElementsByClassName("answer");
- var openLink = document.getElementsByClassName("openLink");
- var closeLink = document.getElementsByClassName("closeLink");
-
- for (i = 0; i< openLink.length ; i++ )
- {
- (
- function(i){
- openLink[i].onclick = function (){
- var j = i;
- answer[j].style.display = "block"
- }
- closeLink[i].onclick = function (){
- var j = i;
- answer[j].style.display = "none"
- }
- }
- )(i);
- }
演示地址
14
Jul
2008
Author: zerty
In: CSS
*:lang(ja) .a {color:red !important;} //just for firefox
Firefox hack
*是通配符, 冒号后面跟的是lang伪类,IE(包括IE7)都不支持这个伪类。 注意要在html后面定义好语言,我这里定义的是ja(日文),中文的话是zh。
11
Jul
2008
Author: zerty
In: JavaScript

这是一份报名表单,要求用户在选中“专业人士访问员”和“定性访问员”后,分别显示“可提供被访者类型”和“容易接触到的行业”的对应表单。当呈未选中状态时,这2个框也对应的隐藏起来。
html部分
- <p>
- <label class="title">报名参加的兼职职位(必填项)<br/>按住Ctrl键可多选</label>
- <select onchange="showEasyVisitBox(this)" size="10" style="width: 200px;" multiple="multiple" id="kc_selectjob" name="kc_selectjob">
- <option selected="selected" value="入户访问员">入户访问员</option>
- <option value="街访访问员">街访访问员</option>
- <option value="街访拦截员">街访拦截员</option>
- <option value="电话访问员">电话访问员</option>
- <option value="神秘顾客">神秘顾客</option>
- <option value="专业人士访问员">专业人士访问员</option>
- <option value="企业深访员">企业深访员</option>
- <option value="定性联络员">定性联络员</option>
- <option value="主持人">主持人</option>
- <option value="质量控制员">质量控制员</option>
- <option value="数据录入员">数据录入员</option>
- </select>
- </p>
- <p id="supportvisitBox" style="display: none;">
- <label class="title">可提供被访者类型</label>
- </p>
- <p id="easyvisitBox" style="display: none;">
- <label class="title">容易接触到的行业</label>
- </p>
javascript部分
option不能定义事件(我没试出来),所以事件要定义在select上。 这里使用的是onchange事件,onchange事件是当对象发生变化时触发,在这里用onchange比onclick合理许多,效果也好。
在调试这个脚本的时候,一开始我是用selectedIndex,试验多次发现selectedIndex在多选的情况下只能捕捉到第一个选中的选项,无法承担多选的工作。查了下参考书,才发现自己走了弯路。
- var oListBox = document.getElementById("kc_selectjob");
-
- oListBox.onchange = function showEasyVisitBox(){
- var oEasyvisitBox = document.getElementById("easyvisitBox");
- var oSupportvisitBox = document.getElementById("supportvisitBox");
- if (oListBox.options[5].selected)
- {
- oEasyvisitBox.style.display = "block";
- }
- else {
- oEasyvisitBox.style.display = "none";
- }
-
- if (oListBox.options[7].selected)
- {
- oSupportvisitBox.style.display = "block";
- }
- else {
- oSupportvisitBox.style.display = "none";
- }
-
- }
演示地址
10
Jul
2008
Author: zerty
In: 未分类

维度统计是界面很华丽的一款统计,不但包含了市面所有已经有的统计功能,还有许多新的特色功能。不过其中的资讯功能我很反感,显的很不专业。 这款统计目前正在内测,web界面还没开放,需要安装IM登陆(汗,统计还搞IM)。 需要内测邀请的朋友留下email,我会发给你邀请邮件。
9
Jul
2008
Author: zerty
In: SEO
301重定向已经过很多次了,它可以将网站的主域名和二级域名规范到一个url上,使网页在搜索引擎里只能通过唯一的一个地址可以访问到,以免因重复内容造成降权。所以凡是使用linux的主机,我都会定义个301重定向,以利于SEO。昨天照例把htaccess传到服务器上,没想到传上后网站无法访问,一删除就恢复正常。看了很多遍代码,也没发现什么问题。 干脆就重新学习下URL重写方法。
规范化URL
描述:
在有些web服务器上,一个资源会拥有多个URL。在实际应用和发布中应该使用的是规范的URL,其他的则是简写或者只在内部使用。无论用户在请求中使用什么形式的URL,最终看见的都应该是规范的URL。
解决方案:
对所有不规范的URL执行一个外部HTTP重定向,以改变它在浏览器地址栏中的显示及其后继请求。下例中的规则集用规范的/u/user替换/~user,并修正了/u/user所遗漏的后缀斜杠。
RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R]
RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R]
规范化主机名
描述:
这个规则的目的是强制使用特定的主机名以代替其他名字。比如,你想强制使用www.example.com代替example.com,就可以在以下方案的基础上进行修改:
解决方案:
对运行在非80端口的站点
RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{SERVER_PORT} !^80$
RewriteRule ^/(.*) http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R]
对运行在80端口的站点
RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) http://fully.qualified.domain.name/$1 [L,R]
参考了上面的规则,发现自己原先的代码里少了个!号,加上就恢复正常了。
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{HTTP_HOST} !^do-javascript.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) http://www.do-javascript.com/$1 [r=301,nc]