初次看到prototype.js框架里面的Function.prototype.bind = function() {}和class.create()方法实在有些不理解,因为通常mickey在使用jquery的时候并没多想这些强大的库里面为我们提供的那些及其方便使用的原型方法是如何实现的。所以在看到prototype.js此类的框架的部分源码后,对里面一些基础的类扩展原型方法的巧妙使用理解起来吃力的原因了。但是mickey经过层层分析,段段调用,因此得出了以下结论,如有不足之处请留言指正。
prototype.js中的Function.prototype.bind方法:
1
2
3
4
5
6
7
8
9
| Function.prototype.bind = function() {
var __method = this;
var args = Array.prototype.slice.call(arguments);
var object=args.shift();
return function() {
return __method.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
}
} |
为所有function对象增加一个新的prototype(原型)方法bind:
- 将调用bind方法的对象保存到__method(方法)变量里面。
- 将调用bind方法时传递的参数转换成为数组保存到变量args。
- 将args数组的第一位[0]元素提取出来保存到变量object。
- 返回一个函数。
这个被返回的函数在再次被调用的时候执行如下操作:
- 使用apply方法将调用bind方法的函数里面的this指针替换为object。
- 将传递到这个匿名函数里面的参数转换为数组,与args数组组合形成一个新的数组,传递给__method方法。
var args = Array.prototype.slice.call(arguments)将这条代码简写来看可以成为这样[].slice.call(arguments);但是这样会给内存里增加一个空的数组对象,为了容易阅读点在简化可以把它假看成为这样的形式slice.call(arguments),去掉call可以假看成为这样的形式function slice(arguments){….},其实在slice就是一个为所有数组定义好的prototype方法而已它与我们自定义的原型方法不同的是,它是javascript为开发者预先定义好的内置方法,他只能被数组调用。mickey在编辑器里面alert(Array.prototype.slice)之后得到的就是funciton slice(){…}。
既然slice也只是一个普通函数方法,slice.call(object)这样让slice里面的this临时的被替换一下也是可以的。就如[].slice(){..}里面的this指针会指向调用slice方法的数组对象一样。使用call方法或apply方法可以将调用此方法的对象内的this指针临时性的改变为传递参数中的第一个参数,这一切都是临时性的,它会在函数执行完毕内存释放后重置。
var object=args.shift()将数组中的[0]位置的对象保存到object变量,这个object就是要被替换的指针。
1
2
3
4
5
6
| function o(){
this.num = 1;
var fn = function(arg){alert(this.num+arg)}.bind(this,2);
fn();
}
new o() |
代码的第3行:一个匿名函数调用了bind方法,并传递o对象和一个数字2到bind函数里面,这两个传递过去的参数都将被转换成为数组形式,o对象会被单独提取出来放入object里。之后bind函数调用完毕,返回一个函数保存到 fn变量里边,现在fn变量里保存了bind函数的返回函数,fn里面的内容就文章第一个代码块的第五行到第七行。
代码第4行:调用fn函数,或者说是在调用bind函数的返回值。这时候会弹出数字“3”。
bind方法中的匿名函数间接保存了它运行环境里面的变量,通常这样的方法称之为“闭包”。
这在很多开源框架为开发者制作出的强大方法和属性便是这样出来的,对于初学者mickey来说以上言论如有不正确的地方还是我想还是可以勉强原谅的,如果您发现了不妥之处请留言指出。
jquery的作者john Resig要出新书了,这本书的书名为《Secrets of the JavaScript Ninja》(google翻译为秘密的js忍者),此书将于2009年3月28日由曼宁出版社,不知道出版之后国内能不能及时翻译出来,amazon上面已经可以开始订购这本书了,价格为$26.39 。关于这本书的内容我google了下,以下是sitepoint对他的采访内容:
这本书的目标读者有哪些?适不适合JavaScript新手看,还是更倾向于把有经验的程序员提升到Ninja的层次?
Resig:更适合于有经验的开发人员。对JavaScript新手来说,合适的书已经不少了,不过我仍然感觉当下的市场满足不了读者的需求。
这本书有什么独特之处值得大家期待呢?
Resig:这本书大胆地揭示了跨浏览器开发问题。市面上几乎所有JavaScript图书只介绍了JavaScript在“安全领域”的应用,相当一部分只展示了少量应对bug的方法。一旦深入DOM并直面跨浏览器的难题——所有库都要应对的问题——读者就会发现最耗时的工作在哪里了。
书的封面: 继续阅读 »
SEO咋看之下对于mymickey来说已经很高级了,但是今天在网上看到一张google和百度的用户行为和习惯采集的图片,实在是令人吃惊,竟然可以将每个用户的一举一动都记录在案,用此数据就可以分析出一些比较活跃的用户的使用习惯和心里,比如说喜欢看哪些新闻图片,相比之下Google Analytics和雅虎站长工具那种记录下用户的来源,用户点击量,用户停留时间这些小case又高级了很多。
鼠标轨迹、停留时间、点击热点。如果网站管理员细致到具备这样强大的功能毫无疑问就可以迅速的提高站点的访问量。对于小白的我来说;这种全时跟踪用户的一举一动。无论从服务器端的接收和前端的程序算法,想都不用想”实在太可怕了“!mymickey想互联网是一个完全靠分享支撑起来的产物。于是google了下(但是网络上的午餐也有不免费的)还找到了点资料,发现这个其实也不是什么新奇的话题了,很多站点都在使用……(也就是说你的一举一动都在被人监视着).
crazyegg.com一个非常强大又漂亮的用户习惯采集工具,只需要加入他们给予的一段javascript代码到你的页面里就行了。
userfly.com一个飞…常强大的工具,我查看了他的demo之后发生了一件极为可怕的事情,他尽然将我的一举一动都用拍摄下来了,之后出现一个flash动画将这一切又重新播出来给我看……
feng-gui.com 还有这个风鬼好像是国人开发的,可以在上面直接上传图片之后点击图片可以显示出热点。
下面还有个视频,蛮有趣的。
继续阅读 »
最近在做一个表格的时候发现table元素的标题caption里面的元素在使用绝对定位的时候会跑出去,开始还以为是块级元素没有定义width的问题,后来才发现这个好像是firefox里面的一个BUG,也可能是firefox对此标签支持的问题吧。
<table>
<caption>
<span id="Pre"><<</span>
<div><span id="Year"></span>年<span id="Month"></span>月</div>
<span id="Next">>></span>
</caption>
<thead>
<tr>
<th>日</th>
<th>一</th>
<th>二</th>
<th>三</th>
<th>四</th>
<th>五</th>
<th>六</th>
</tr>
</thead>
</table>
#Pre{position:absolite; left:0;cursor:pointer}
#Next{position:absolite; right:0;;cursor:pointer}
caption{position:relative;}
在firefox里这两个Span标记跑到外边去啦。
最后只好用float这两个span元素了。
但是float导致span换行,之后用负数的margin搞定。
#Pre{float:left; cursor:pointer}
#Next{float:right;cursor:pointer;margin-top:-14px}
养成习惯性的写符合语义的标签是很重要的,但愿这个caption元素不是W3C的过期元素。
我刚刚出生的时候火车站的时钟开始倒转。
那时我70岁,我的父亲抛弃了我。
好心的黑人阿姨将我养大。
我60多岁的时候喜欢上了6岁的黛西。
我的钢琴老师告诉我:
如果你身边的人死了,你才会知道自己有多爱他。
继续阅读 »
博客刚刚开张,当然要让别人来阅读了,现在大家都是通过搜索引擎查找资料的,所以被搜索引擎收录你的文章是个问题,幸好google推出了Google Sitemaps,顾名思意“google站点地图”。
他可以在你博客或者其他内容的网站更新的时候通知到google,你的站点更新了。
在这里推荐大家使用”Google XML Sitemaps”这个插件,它可以在你的站点更新之后自动帮你生成一份XML数据表,这份表格“Google XML Sitemaps”插件会自动帮你提交到Google Sitemaps,这样google就可以快速的索引你站点里面的内容。
下载之后存放到wordpress/wp-content/plugins文件下面,之后在控制面板里面启用这个插件,之后将看到下面这段文字。
“This plugin will generate a sitemaps.org compatible sitemap of your WordPress blog which is supported by Ask.com, Google, MSN Search and YAHOO. Configuration Page。作者: 访问作者主页” Arne Brachhold
点击绿色部分进入配置页面,里面有很多选项但是大部分保持默认就可以了。先配置好插件生成的提交文件的目录:

如果第一次没有重建sitemap那么手动点击重建下,这之后每次你修改文章或者是发布新文章插件都会帮您自动重建
XML,并帮您提交给Google。

今天重装了一次wrodpress,之后进入初始化安装页面的时候却提示:”您好像已经安装了 WordPress,重新安装请先删除旧的数据表”。这个数据表其实是保存在mysql数据库里面你之前安装的那个wordpress写的一些文章和数据。
进入你的mysql数据库删除掉你原来的记录,刷新wordpress初始化安装页面,就会显示安装成功,输入你帐号和e-mail了,之后重建你的帐号,原来的wordpress又会回来了。
看了《javascript高级程序设计》里面有个表格排序的例子;觉得很有意思,所以自己用jquery的基本库做了一个,里面的概念基本和书里面的差不多
很多高手也位jquery写了专门的排序库,因为自己也想尝试一下,
当然运行速度实在不能接受,但是我会慢慢的把他改进的。
注:这里只是拿出了一部分代码来,查看演示demo
文档载入后给’th’添加click事件。
1.
$('th').click(function(){
var date1=(new Date()).getTime()
var dataType=$(this).attr('dataType');
找到点击对象的自定义属性dataType,当然这个不符合W3C的标准是无法通过检验的,也可以用ID或者class来定义,但是我觉得这样直观点在Transitional模式下也可以正常解读.
2.
var index=$('th').index(this)+1;
找到被点击对象在文档中的位置加上1,加1是为了给所对应的列的td添加样式才做的。
因为用:eq()只能得到td的全文档位置,而用:nth-child()的话得到的是每个td在自己的父元素里面的序列位置。
3.
将tbody里所有tr存到变量row.
4.
$.each(row,function(i){ arr[i]=row[i] })
遍历所有行讲它插入arr数组.
5.if($(this).hasClass('select')){arr.reverse()}
如果这个’th’被点击过那么它将会被添加select样式,如果是这样直接将原来的arr数组反向。
6.
else {
arr.sort(sortStr(index,dataType))
$('.select').removeClass();
$('td:nth-child('+index+')').addClass('select');
$(this).addClass('select')
}
否则,将arr用sort()方法进行排序sort()方式可以接受1个函数,这个函数接受2个参数作为需要比较的数据,我在这里定义为
sortStr();
它有两个参数:
function sortStr(index,dataType){
return function(a,b){
var aText=$(a).find('td:nth-child('+index+')').text();
var bText=$(b).find('td:nth-child('+index+')').text();
if(dataType!='roomType'){
aText=Parse(aText,dataType)
bText=Parse(bText,dataType)
return aText>;bText?-1:bText>;aText?1:0;
}
else return aText.localeCompare(bText)
}
}:
继续阅读 »
点击第一张图片可像上面滚动 点击最下面的图片可以向下滚动浏览。
先看HTML
<div id=”container”>
<div id=”div1″><img /><img src=”jpg/1.jpg” /><img /></div>
<div id=”div2″><img /><img src=”jpg/2.jpg” /><img /></div>
<div id=”div3″><img /><img src=”jpg/3.jpg” /><img /></div>
<img id=”big” src=”jpg/1.jpg” />
</div>
1.定义变量j
$("#container div img:last-child").addClass("after");
$("#container div img:first-child").addClass("before");
var bigSrc =$("#div2 img:nth-child(2)").attr("src");
$("#big").attr("src",bigSrc);
2.初始化的时候给定DIV里面第一张和最后一张没有src属性的img标签添加Class属性;
<div id=”div1″><img class=”before” /><img src=”jpg/1.jpg” /><img class=”after” /></div>添加完Class后的样子
img.after{top:100px} img.before{top:-100px;}
并使用中间的那张图片作为大图显示
$("#div1 img ,#div3 img").click(function(e){
3.给第一个DIV和最后一个DIV里面的IMG添加click事件;事件函数的参数e是点击的对象。
if($(this).css("top")!="0px"){return false}
4.如果这个图片的CSS的top没有达到0px则这个点击事件到这里结束,因为如果之前有一次点击滚动效果没有结束的话,再去点击他就会
造成多一次事件累计,具体请看下面。
if($(e.target).parent().attr("id")=="div1"){j=3}else{j=1}
5.$(e.target)获取对象的源目标,如果他的父元素的ID是第一个DIV那么J就赋值为3否则为1.
var beforeIMG =$(this).parent().siblings().find(“img:nth-child(2)”).add($(this));
6.找到被点击对象的父元素的兄弟元素里面包含的第二张图片,和被点击对象自身;保存在变量beforeIMG里面.
var afterIMG=$(this).parent().siblings().find("img:nth-child("+j+")")
.add($(this).parent().find("img:nth-child("+j+")"));
7.找到被点击对象父元素的兄弟元素的第j张图片,如果这个时候点击的图片是最上面的图片那么j变量的值就是1
那么afterIMG变量就包含了#div1与#div2和#div3里面的第一图片,当然他是一个数组对象,下面我们将遍历
处理这个数组对象。假设我们点击的是第一张小图片,那么j变量包含3,这里选择出来的就是当前显示出来的那张图片
的下面一张图片<div id=”div1″><img /><img src=”jpg/1.jpg” />’<img />’</div>
这里用引号包含起来的就是被选中的图片,我们现在要把他向上面滑动,因为图片都是绝对定位,下面的图片如果
向上面滑动的话,中间显示出来的那张图片就会被它给顶上去。下一步就遍历这个图片,为他添加滑动效果.
继续阅读 »