JavaScript的constructor属性与typeof函数的区别

有时你可能需要对变量进行类型检查,或者判断变量是否已定义。有两种方法可以使用:typeof函数与constructor属性

typeof函数的用法可能不用我多说,大家都知道怎么用。而constructor属性大家可能就陌生点。在《精通JavaScript》与《JavaScript 语言精粹》里都有提到construct的用法,但我用自己的几个浏览器(IE7.0 / Firefox3.6.8 / Opera)测试的结果却和书上说的不一样。但是仍然是有办法通过constructor属性来检查变量类型的。

这里先补充一下,为什么明明有typeof函数可以很方便地用来检测类型,还要用constructor呢?

因为typeof会把所有的数组类型以及用户自定义类型判断为object,从而无法知道更确切的信息。而constructor却可以解决这个问题。

ok,明白了我们为什么要用constructor,现在让我带大家一步步认识一下typeof和constructor用法之间的差异吧~

首先我们运行一下下面这段代码:
1 var i;
2 alert(typeof(i));  //”undefined”
3 alert(i.constructor); //error

这3行代码告诉你什么情况下可以用constructor。

你可以看到第2行返回了字符串’undefined’,而第三行则发生了错误,原因是i变量还没有类型定义,自然也没有constructor的存在。

从这一点上看,typeof可以检查到变量是否有定义,而construct只能检查已定义变量的类型。

再运行一下下面这段代码:
1 var i = 2;
2 alert(typeof(i)); //”number”
3 alert(i.constructor); //
4 alert(typeof(i.constructor)); //”function”
 
你会看到第2行返回了字符串’number’,第3行返回了一串类似函数定义的代码字符串(这就是跟《精通JavaScript》一书中介绍的不一样的地方)。

我们再用typeof检查一下constructor到底是个什么样类型的属性,第4行返回结果’function’,也就是说,实际上constructor是一个函数,更确切地说是一个构造函数。这时你就可以知道,为什么constructor可以检查出各种类型了。

有经验的程序员看到这里应该知道要怎么利用constructor来检查变量类型了。方法有多种,这里提供一种比较容易理解的方法。

其实想法很简单,就是把construcor转化为字符串,通过寻找匹配字符串(function名)来确定是否指定类型。如下例子:
1 function user() {};
2 var i = new user();
3 alert((i.constructor+”).match(/user/) == null);
 
这仅仅是个简单的例子。如果返回true则变量i不是user类型,返回false则变量是user类型。

当然,这样检测是不够精确的,比如其实他是一个myuser类型的时候,同样会被认为是user类。所以你需要书写更精确的正则表达式去进行匹配。

可以这样简单改进你的正则表达式:
/function user\(\)/
替换上面代码段中的/user/。当然,如果你的构造函数原型是user(a),那么应该这样书写你的正则表达式:
/function user\(a\)/
 
到这里你应该知道怎样使用constructor类型去检查变量类型了吧?

ok,最后再提个醒,如果你要用基于constructor的方法去检查一些基本类型,如

Object / Array / Function / String / Number / Boolean

在你的正则表达式中,一定要将这些单词的首字母大写!!而如果该类型是自定义类型,则根据你定义的时候标识符的写法确定。

最后再给个官方例子:

<script type="text/javascript">
var test=new Date()
if (test.constructor==Array)
{document.write("This is an Array")}
if (test.constructor==Boolean)
{document.write("This is a Boolean")}
if (test.constructor==Date)
{document.write("This is a Date")}
if (test.constructor==String)
{document.write("This is a String")}
</script>
输出在结果:
This is a Date

CSS强制换行和CSS强制不换行

强制不换行
p.www_ghugo_com {
white-space:nowrap;
}
自动换行
p.www_ghugo_com {
word-wrap: break-word;
word-break: normal;
}
强制英文单词断行
p.www_ghugo_com {
word-break:break-all;
}

CSS设置不换行:

overflow:hidden 溢出隐藏
white-space:nowrap 不换行
pre 换行和其他空白字符都将受到保护
nowrap 强制在同一行内显示所有文本,直到文本结束或者遭遇br对象

CSS设置强制换行:

word-break:break-all 强制断开实现转行
normal ; 依照亚洲语言和非亚洲语言的文本规则,允许在字内换行
break-all : 该行为与亚洲语言的normal相同。也允许非亚洲语言文本行的任意字内断开。该值适合包含一些非亚洲文本的亚洲文本
keep-all : 与所有非亚洲语言的normal相同。对于中文,韩文,日文,不允许字断开。适合包含少量亚洲文本的非亚洲文本与之间的高度解决办法
设置或检索对象内文本的字内换行行为。尤其在出现多种语言时。对于中文,应该使用break-all 。

关于html中的rel、rev属性

目前的 html的语意还不够丰富,它所能表达的无非是段落(p),链接(a),引用(blockquote)等。这些仅仅是文学上语意,而不是人们需要表达的真正内容。 真正内容可以是地址、事件、人物等拥有实际意义的信息。然而html并没有将这些实体标准化。

另人可喜的是html5 正在朝着html语义化的方向发展。而我们国内,也正在从几年前讨论DIV+CSS上升到Html语义化,CSS模块化上。这说明web前端一直在发展,虽然我接触web开发没多少年,但这种变化,我是深刻体会到的。

言归正传,正是由于html标签的疲乏,所能表达的语义不够。所以,出现了Microformats这一技术。其实,确切的说Microformats并不是一种新技术,它的实质只是Markup language(HTML、XHTML)的一小段代码和一小段特定的Web内容,所谓formats指的是它有一种固定的标记格式。

rel、rev这2个属性,则是为了丰富网页语义而设计的。更确切的说,rel,rev这2个属性,是为了更明确的告诉搜索引擎网页的内容,更好的指引搜索引擎去理解你的网站内容。这对SEO有一定的作用。

区别:rel与rev具有互补的作用,rel指定了向前链接的关系,rev指定了反向链接的关系.

rel 属性 — rel属性,描述了当前页面与href所指定文档的关系.

* rel属性通常出现在a,link标签中
* 属性值
o alternate — 定义交替出现的链接
o appendix — 定义文档的附加信息
o bookmark — 书签
o chapter — 当前文档的章节
o contents
o copyright — 当前文档的版权
o glossary — 词汇
o help — 链接帮助信息
o index — 当前文档的索引
o next — 记录文档的下一页.(浏览器可以提前加载此页)
o nofollow — 不被用于计算PageRank
o prev — 记录文档的上一页.(定义浏览器的后退键)
o section — 作为文档的一部分
o start — 通知搜索引擎,文档的开始
o stylesheet — 定义一个外部加载的样式表
o subsection — 作为文档的一小部分
* rel是relationship的英文缩写

=================================

rev 属性 — rev属性,描述了href所指定文档与当前页面的关系.

* rev属性通常出现在a,link标签中
* 属性值
o alternate — 定义交替出现的链接
o appendix — 定义文档的附加信息
o bookmark — 书签
o chapter — 当前文档的章节
o contents
o copyright — 当前文档的版权
o glossary — 词汇
o help — 链接帮助信息
o index — 当前文档的索引
o next — 记录文档的下一页.(浏览器可以提前加载此页)
o nofollow — 不被用于计算PageRank
o prev — 记录文档的上一页.(定义浏览器的后退键)
o section — 作为文档的一部分
o start — 通知搜索引擎,文档的开始
o stylesheet — 定义一个外部加载的样式表
o subsection — 作为文档的一小部分

php版的FCKeditor上传文件(或图片)中文显示为乱码的解决方法

测试环境:php 5 , utf-8编码

1、修正上传中文文件时文件名乱码问题
在文件connectors/php/commands.php中查找:
$sFileName = $oFile[‘name’] ;
在后面添加一行:
$sFileName = iconv(“utf-8″,”gbk”,$sFileName);

2、修正文件列表时中文文件名显示乱码问题
在文件connectors/php/util.php中查找:
return ( utf8_encode( htmlspecialchars( $value ) ) ) ;
修改为:
return iconv(”,’utf-8′,htmlspecialchars( $value ));

3、修正新建中文文件夹时的文件夹名乱码问题
在文件connectors/php/commands.php中查找:
$sNewFolderName =
在后面添加一行:
$sNewFolderName = iconv(“utf-8″,”gbk”,$sNewFolderName);

2.6.3版及后续版本的fck下的html文件已经加了utf-8的文件头。

301重定向跳转在线检测工具

检测地址:http://www.seoconsultants.com/tools/headers.asp#results

在我们的网站建设中,时常会遇到需要网页重定向的情况:象网站调整,如改变网页目录结 构,网页被移到一个新地址,再或者,网页扩展名改变,如因应用需要把.php改成.Html或.shtml,在这种情况下,如果不做重定向,则用户收藏夹 或搜索引擎数据库中旧地址只能让访问客户还会得到一个404页面错误信息,访问流量白白丧失;再如某些注册了多个域名的网站,也需要通过重定向让访问这些 域名的用户自动跳转到主站点,等等。


下面是具体跳转的方法,如果你不是很擅长技术。没关系,存下来,用得着的时候,交给你技术看看就好了。

301 redirect: 301代表永久性转移(Permanently Moved),301重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转址。

302 redirect: 302代表暂时性转移(Temporarily Moved ),在前些年,不少Black Hat SEO曾广泛应用这项技术作弊,目前,各大主要搜索引擎均加强了打击力度,象Google前些年对Business.com以及近来对BMW德国网站的惩 罚。即使网站客观上不是spam,也很容易被搜寻引擎容易误判为spam而遭到惩罚。

meta fresh: 这在2000年前比较流行,不过现在已很少见。其具体是通过网页中的meta指令,在特定时间后重定向到新的网页,如果延迟的时间太短(约5秒之內),会被判断为spam。

301 Redirect实现网页重定向

IIS服务器实现301重定向

* 打开internet信息服务管理器,在欲重定向的网页或目录上按右键
* 选择“重定向到URL”
* 在“重定向到”输入框中输入要跳转到的目标网页的URL地址
* 选中“资源的永久重定向”(切记)
* 最后点击“应用”

Apache服务器实现301重定向

相比较来说,Apache实现起来要比IIS简单多了。在Apache中,有个很重要的文件.htaccess,通过对它的设置,可以实现很多强大的功能,301重定向只是其中之一。

Redirect permanent / http://www.bloghuman.com/ (将目录下内容重定向到http://www.bloghuman.com/)
redirect permanent /index.php http://www.bloghuman.com/index.php?go=category_6(将网页index.php重定向到http://www.bloghuman.com/index.php?go=category_6)

通过合理地配置重定向参数中的正则表达式,可以实现更复杂的匹配。有兴趣的朋友可参考本站Apache手册。

PHP下的301重定向

Header( “HTTP/1.1 301 Moved Permanently” ) ;
Header( “Location: http://www.bloghuman.com” );
?

ASP下的301重定向
ASP .NET下的301重定向
ColdFusion下的301重定向

<.cfheader statuscode=”301″ statustext=”Moved permanently”>
<.cfheader name=”Location” value=”http://www.new-url.com”>

旧域名重定向到新域名
创建一个.htaccess文件,并将下面提供的代码写入文件内,它可以确保旧域名所有的目录或者网页正确的跳转到新域名内。

记住.htaccess文件一定要放在旧网站的根目录下,并且新网站要和旧网站保持相同的目录结构及网页文件


Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://www.domain.com/$1 [R=301,L]

css实现图片水平垂直居中

css:

<style>
.box {
/*非IE的主流浏览器识别的垂直居中的方法*/
display: table-cell;
vertical-align:middle;

/*设置水平居中*/
text-align:center;

/* 针对IE的Hack */
*display: block;
*font-size: 175px;/*约为高度的0.873,200*0.873 约为175*/
*font-family:Arial;/*防止非utf-8引起的hack失效问题,如gbk编码*/

width:200px;
height:200px;
border: 1px solid #eee;
}
.box img {
/*设置图片垂直居中*/
vertical-align:middle;
}
</style>

html:

<div class=”box”><a href=”http://www.ghugo.com” target=”_blank”><img src=”logo.gif” /></a></div>

Ecshop与Jquery冲突的解决办法

ecshop 居然与 jquery 冲突,实在杯具。
网上一搜大多说是 transport.js 的Object.prototype.toJSONString 方法导致的。

ECShop把AJAX事件和JSON解析的模块放在common/transport.js之中,可以说它也有自己封装的一套工具,这其实是很正常的。

但恰恰的,在封装JSON各种方法的同时对object的模型进行了重写,这个就跟jQuery冲突了。因为众所周知的,jQuery对各种JavaScript对象进行了扩展。

这一切其实都很容易理解,各有各的理由十分自然,但头痛和无奈的就变得在我们这些使用者身上了。在ECShop论坛上原来也有很多朋友提出了这个问题,也提出了各种各样的方法,我尝试了一些,不好或者甚至无用,所以只好自己动手了。

解决思路大概就是屏蔽ECshop扩展的toJSONString方法,用别的函数代替。

为了照顾下小菜们,就写详细点吧。

1,首先复制一份 transport.js 改名为 transport.org.js 提供给后台使用

2,屏蔽掉transport.js里的toJSON功能 行数大概有497-737行之间
修改352行为:

1. legalParams = “JSON=” + $.toJSON(params);

复制代码

修改408行为:

1. result = $.evalJSON(result);

复制代码

3,修改index.js文件44行改为:

1. var res = $.evalJSON(result);

复制代码

4,修改common.js文件
第34行改为:

1. Ajax.call(‘flow.php?step=add_to_cart’, ‘goods=’ + $.toJSON(goods), addToCartResponse, ‘POST’, ‘JSON’);

复制代码

第850行改为:

1. Ajax.call(‘flow.php?step=add_package_to_cart’, ‘package_info=’ + $.toJSON(package_info), addPackageToCartResponse, ‘POST’, ‘JSON’);

复制代码

第1056行改为:

1. Ajax.call(‘flow.php?step=add_to_cart’, ‘goods=’ + $.toJSON(goods), addToCartResponse, ‘POST’, ‘JSON’);

复制代码

5,修改compare.js文件
第49行改为:

1. this.data = $.evalJSON(cookieValue);

复制代码

第67行改为:

1. var obj = $.evalJSON(cookieValue);

复制代码

第133行改为:

1. document.setCookie(“compareItems”, $.toJSON(this.data));

复制代码

6, 修改global.js文件
第16行改函数名 :function $e()
第114和126行都改为:    var element = $e(element);

<!———–路径修改———–>
修改后台头部引入transport.js路径 admin/templates/pageheader.htm 第9行改为: {insert_scripts files=”../js/transport.org.js,common.js”}

修改themes/default/library/page_header.lbi文件在{insert_scripts files=’transport.js,utils.js’}上面加上如下代码
{insert_scripts files=’jquery.js,jquery.json.js,other.js’}

<!—–修改文件—–>
library/comment_list.lbi
第188行 :

1. Ajax.call(‘comment.php’, ‘cmt=’ + $.toJSON(cmt), commentResponse, ‘POST’, ‘JSON’);

复制代码

compare.dwt
第20行 :

1. var obj = $.evalJSON(document.getCookie(“compareItems”));

复制代码

第24行 :

1. document.setCookie(“compareItems”, $.toJSON(obj));

复制代码

flow.dwt
第138行 :

1. Ajax.call(‘flow.php?step=add_to_cart’, ‘goods=’ + $.toJSON(goods), collect_to_flow_response, ‘POST’, ‘JSON’);

复制代码

第199行 :

1. Ajax.call(‘flow.php?step=add_to_cart’, ‘goods=’ + $.toJSON(goods), fittings_to_flow_response, ‘POST’, ‘JSON’);

复制代码

<!—–jquery文件需置顶的dwt文件—-jquery.js文件需要在compare.js文件加载前加载,否则会报错—–>

brand.dwt
brand_list.dwt
category.dwt
exchange_list.dwt
search.dwt

如:
{* 包含脚本文件 *}
{insert_scripts files=’jquery.js,jquery.json.js,other.js’}
{insert_scripts files=’common.js,global.js,compare.js’}

很高兴,你能看到这里,如果嫌太麻烦,也可以直接下载文件覆盖过去。我把需要修改的文件都打包了。哈哈。。

下载地址:ecshop-jquery

jQuery中循环的每一个功能等待完成,然后再继续循环

First of all, jQuery 1.4 added the delay function, which I assume is what your custom wait implementation is doing.

Using delay, you can sort of fake the functionality of each element “waiting” on the previous element to finish by using the first parameter to the each callback as a multiplier for an intial delay. Like this:

var duration = 5000;

$('elem').each(function(n) {
    $(this).delay(n * duration).fadeIn().delay(duration).fadeOut();
});

So the first element will fadeIn immediately. The second will fadeIn after 5,000 ms. The third after 10,000 ms and so on. Keep in mind that this is faking it. Each element is not actually waiting on the previous element to finish.

firefox下按钮点击出现虚线框的去除方法

简单的。加上 onfocus=’this.blur()’ 就OK了。

eg:<button id=”js_shop_cart_port_list” onfocus=’this.blur()’><span>Select Portfolio</span></button>

其他方法,纯CSS的:

<style type="text/css">
.wrap{position:relative;}
.btns{zoom:1;}
.btns *{outline:0;zoom:1;background:#f2f2f2;}
.btns button::-moz-focus-inner{border-color:transparent!important;}
</style>
<div>
<div>
<button type="button">确定</button><button type="button">取消</button>
<a href="#">确定</a><a href="#">取消</a>
</div>
</div>

ghs.google.com在国内无法访问,经常被和谐的解决办法

用google app engine的都知道,GAE现在可以绑定自己的域名了,但比较杯具的是,google的dns 经常被国内和谐到账无法访问。

现在,有网上的好人帮我们做了个转向的方法。他们维护了一些可用的GHS的IP地址,我们增加别名的时候,只要把ghs.google.com换成ghs.you8g.com就可以了。当然要在那个网站里提交你的域名才行。

具体使用方法可查看网站:http://www.you8g.com/.

还有一个更简单的方法,就是把ghs.google.com换成google.dns.tancee.com这样可以解决大部分时间被和谐的情况。因为这个CNAME记录还是比较稳定点的。