浏览模式: 标准 | 列表分类:Javascript
Submitted by gouki on 2009, August 4, 6:49 AM
链式调用,在PHP中使用的时候往往被人称作:连贯操作。
如果经常用ZF的人,会在Select类中很明显的看到这一点。目前连贯操作已经几乎被各大框架所引用(无非是以前不返回值,现在返回$this。哈哈)
以下是cssrain网站联盟中的karry(playgoogle)写的JS的连贯操作(链式调用),其实在jQuery中,这样的操作太常见了。
以下为全文内容:
用过jQuery的朋友一定对jQuery中方法的链式调用印象深刻,最近发布的YUI3也支持了方法的链式调用。这是一个非常不错的语法特性, 能让代码更加简洁、易读。很多时候链式调用可以避免多次重复使用一个对象变量,从而减少代码,而js是一种客户端执行的脚本语言,减少代码就减少了js文 件的大小,减少了服务器的压力。链式调用这么多优点,它是如何实现的呢?这篇文章就是想探讨一下这个问题。
链式调用例子如:$("p").append("test").fadeIn("fast");
看一段jQuery的源码:
append: function() {
return this.domManip(arguments, true, function(elem){
if (this.nodeType == 1)
this.appendChild( elem );
});
}
以上是jQuery中append方法的实现。append方法是向每个匹配的元素内部追加内容的方法,很明显,属于赋值操作,但是却有返回值,返回的是当前操作的dom(通常返回this指针)。这是链式调用的关键,你会发现这不过是个语法小技巧而已。
很明显,在赋值器方法中(或者本身没有返回值的方法中)很容易实现链式调用,而取值器相对来说不好实现链式调用,因为你需要取值器返回你需要的数据而不是this指针(当然,如果你坚持要实现链式方法,也可以用回调函数来实现)。
设计一个简单的支持链式调用的类:
JavaScript代码
- function Dog(name,color){
- this.name=name||"";
- this.color=color||"";
- }
- Dog.prototype.setName=function(name){
- this.name=name;
- return this;
- };
- Dog.prototype.setColor(color){
- this.color=color;
- return this;
- };
- Dog.prototype.yelp(){
- alert("我的名字叫:"+this.name+",我的颜色是:"+this.color);
- return this;
- };
使用方式:
JavaScript代码
- var dog = new Dog();
- dog.setName("旺财").setColor("白色").yelp();
取值器你也想支持链式调用?
那就用回调函数来实现,将本来应该返回的值直接传给回调函数,而return仍然返回this指针。接着上面的Dog类写一个方法:
JavaScript代码
- Dog.prototype.getName(callback){
- callback.call(this,this.name);
- return this;
- }
使用方式:
JavaScript代码
- function showName(name){
- alert(name);
- }
- dog.setName("旺财").getName(showName).setColor("白色");
Tags: 链式, 连贯操作
Javascript | 评论:0
| 阅读:20748
Submitted by gouki on 2009, August 3, 12:12 PM
文章来自http://www.knowsky.com/537382.html,虽然不满这个网站的广告,但还是有些东西值得一观
事件 描述
onactivate 当对象设置为活动元素时触发。
onafterprint 对象所关联的文档打印或打印预览后立即在对象上触发。
onbeforeactivate 对象要被设置为当前元素前立即触发。
onbeforecut 当选中区从文档中删除之前在源对象触发。
onbeforedeactivate 在 activeElement 从当前对象变为父文档其它对象之前立即触发。
onbeforeeditfocus 在包含于可编辑元素内的对象进入用户界面激活状态前或可编辑容器变成控件选中区前触发。
onbeforepaste 在选中区从系统剪贴板粘贴到文档前在目标对象上触发。
onbeforeprint 对象的关联文档打印或打印预览前在对象上触发。
onbeforeunload 在页面将要被卸载前触发。
onclick 在用户用鼠标左键单击对象时触发。
oncontextmenu 在用户使用鼠标右键单击客户区打开上下文菜单时触发。
oncontrolselect 当用户将要对该对象制作一个控件选中区时触发。
oncut 当对象或选中区从文档中删除并添加到系统剪贴板上时在源元素上触发。
ondblclick 当用户双击对象时触发。
ondeactivate 当 activeElement 从当前对象变为父文档其它对象时触发。
ondrag 当进行拖曳操作时在源对象上持续触发。
ondragend 当用户在拖曳操作结束后释放鼠标时在源对象上触发。
ondragenter 当用户拖曳对象到一个合法拖曳目标时在目标元素上触发。
ondragleave 当用户在拖曳操作过程中将鼠标移出合法拖曳目标时在目标对象上触发。
ondragover 当用户拖曳对象划过合法拖曳目标时持续在目标元素上触发。
ondragstart 当用户开始拖曳文本选中区或选中对象时在源对象上触发。
ondrop 当鼠标按钮在拖曳操作过程中释放时在目标对象上触发。
onfilterchange 当可视滤镜更改状态或完成转换时触发。
onfocusin 当元素将要被设置为焦点之前触发。
onfocusout 在移动焦点到其它元素之后立即触发于当前拥有焦点的元素上触发。
onkeydown 当用户按下键盘按键时触发。
onkeypress 当用户按下字面键时触发。
onkeyup 当用户释放键盘按键时触发。
onload 当浏览器装入对象后立即触发。
onlosecapture 当对象失去鼠标捕捉时触发。
onmousedown 当用户用任何鼠标按钮单击对象时触发。
onmouseenter 当用户将鼠标指针移动到对象内时触发。
onmouseleave 当用户将鼠标指针移出对象边界时触发。
onmousemove 当用户将鼠标划过对象时触发。
onmouseout 当用户将鼠标指针移出对象边界时触发。
onmouseover 当用户将鼠标指针移动到对象内时触发。
onmouseup 当用户在鼠标位于对象之上时释放鼠标按钮时触发。
onmousewheel 当鼠标滚轮按钮旋转时触发。
onmove 当对象移动时触发。
onmoveend 当对象停止移动时触发。
onmovestart 当对象开始移动时触发。
onpaste 当用户粘贴数据以便从系统剪贴板向文档传送数据时在目标对象上触发。
onpropertychange 当在对象上发生对象上发生属性更改时触发。
onreadystatechange 当对象状态变更时触发。
onresizeend 当用户更改完控件选中区中对象的尺寸时触发。
onresizestart 当用户开始更改控件选中区中对象的尺寸时触发。
onscroll 当用户滚动对象的滚动条时触发。
onselect 当当前选中区改变时触发。
onselectstart 对象将要被选中时触发。
onunload 在对象卸载前立即触发。
Javascript | 评论:0
| 阅读:15135
Submitted by gouki on 2009, July 29, 6:37 AM
怎么说呢,这个东西不太适合存储ID进数据库的用户,因为我在打开该文件后发现,里面的key全是t,s之类的,作者shawphy也建议换成j,s,q之类的key,但对于普通 用户来说太累了。
当然,这个数据应该是配合json2select插件而来的,所以我们不能奢求什么。
如果确实需要,到这里下载数据,然后自己通过程序生成json文件,修改一下json2select插件。当然更能做的就是问一下google,百度,谁有三级联动的代码。
原文如下:
去年写过一个小插件,json2select 一直想要转换出配套的数据,但总有这样那样的问题之后,终于拖到了现在。
好在一切悲剧的日子已经过去了,新时代已经来临。猛击这里
三级联动,直辖市精确到城镇街道,一般城市到达区。强烈推荐。
这一切都要感谢 Asfman ,辛勤的工作,当然也少不了感谢搜狐白社会,是他们提供了这么好的数据,也要感谢我们伟大祖国,我们中华民族地大物博,省市也很多……
这套数据有100K多一点,但可以想办法压缩
把其中重复字符串替换掉,把街道替换成j,市替换成s,区替换成q,都可以减少文件体积。要用的时候先用正则替换后,再eval执行字符串就能得到数据了,可以达到68K左右
另外,保存成gb2312的话也可以减小体积。目前我手头的是52K左右大小了。但可能导致乱码,慎用。
进一步,如果通过词频分析,找出重复最多的前20个,替换的话,相信可以把体积维持在30K以下了。但手头没工具,最近也很忙,所以大家自己发挥吧。
我粗略压缩后的东西我就不单独发布了。
Javascript | 评论:0
| 阅读:18844
Submitted by gouki on 2009, July 28, 9:35 PM
司徒正美的一些关于javascript的处理的兼容写法。如果不想用这些,可以直接用jQuery中的功能。如bind,unbind,$('XX'),$(document).ready()等
绑定事件
JavaScript代码
- var addEvent = function( obj, type, fn ) {
- if (obj.addEventListener)
- obj.addEventListener( type, fn, false );
- else if (obj.attachEvent) {
- obj["e"+type+fn] = fn;
- obj.attachEvent( "on"+type, function() {
- obj["e"+type+fn]();
- } );
- }
- };
另一个实现
JavaScript代码
- var addEvent = (function () {
- if (document.addEventListener) {
- return function (el, type, fn) {
- el.addEventListener(type, fn, false);
- };
- } else {
- return function (el, type, fn) {
- el.attachEvent('on' + type, function () {
- return fn.call(el, window.event);
- });
- }
- }
- })();
移除事件
JavaScript代码
- var removeEvent = function(obj, type, fn) {
- if (obj.removeEventListener)
- obj.removeEventListener( type, fn, false );
- else if (obj.detachEvent) {
- obj.detachEvent( "on"+type, obj["e"+type+fn] );
- obj["e"+type+fn] = null;
- }
- }
加载事件与脚本
JavaScript代码
- var loadEvent = function(func) {
- var oldonload = window.onload;
- if (typeof window.onload != 'function') {
- window.onload = func;
- }else {
- window.onload = function() {
- oldonload();
- func();
- }
- }
- }
阻止事件
JavaScript代码
- var cancelEvent = function(event) {
- event = event||window.event
- if (event.preventDefault) {
- event.preventDefault( );
- event.stopPropagation( );
- } else {
- event.returnValue = false;
- event.cancelBubble = true;
- }
- }
取得事件源对象
相当于Prototype.js框架的Event.element(e)
JavaScript代码
- var getTarget = function(event){
- event = event || window.event;
- var obj = event.srcElement ? event.srcElement : event.target;
- return obj
- }
Javascript | 评论:0
| 阅读:16514
Submitted by gouki on 2009, July 26, 10:40 AM
膘叔:如果不了解javascript的话,你可以尝试看一下PHP,在PHP中有三个函数:
func_get_arg(),func_get_args(),func_get_num(),这三个函数是用来处理PHP中某个方法参数不固定的时候的行为。你可以将它当作是伪重载(overload)的另一种处理方法。也可以用来更改某个函数的默认行为。
javascript中也有类似的方法,那就是callee,caller等 。以下是playgoogle网站的整理内容,作者为karry,可以参考一下。
caller
返回一个对函数的引用,该函数调用了当前函数。也就是说,返回的是调用该函数的函数。
functionName.caller
functionName 对象是所执行函数的名称。
说明
对 于函数来说,caller 属性只有在函数执行时才有定义。如果函数是由顶层调用的,那么 caller 包含的就是 null 。如果在字符串上下文中使用 caller 属性,那么结果和 functionName.toString 一样,也就是说,显示的是函数的反编译文本。值得注意的一点是,事件的触发总是带着一个匿名的函数。
点击查看--caller测试示例
callee
返 回正被执行的 Function 对象,也就是所指定的 Function 对象的正文,他是arguments对象的一个属性。[function.]arguments.callee,可选项 function 参数是当前正在执行的 Function 对象的名称。
说明
callee 属性的初始值就是正被执行的 Function 对象。
callee 属性是 arguments 对象的一个成员,它表示对函数对象本身的引用,这有利于匿名函数的递归或者保证函数的封装性,例如下边示例的递归计算1到n的自然数之和。而该属性仅当相 关函数正在执行时才可用。还有需要注意的是callee拥有length属性,这个属性有时候用于验证还是比较好的。arguments.length是 实参长度,arguments.callee.length是形参长度,由此可以判断调用时形参长度是否和实参长度一致。
点击查看--callee测试示例
apply and call
它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式有所区别:
apply(thisArg,argArray);
call(thisArg[,arg1,arg2…] ]);
即所有函数内部的this指针都会被赋值为thisArg,这可实现将函数作为另外一个对象的方法运行的目的
apply的说明
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。如果没有提供 argArray 和 thisArg任何一个参数,那么 Global 对象将被用作 thisArg,并且无法被传递任何参数。
call的说明
call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisArg指定的新对象。如果没有提供 thisArg参数,那么 Global 对象被用作 thisArg
相关技巧:
应用call和apply还有一个技巧在里面,就是用call和apply应用另一个函数(类)以后,当前的
函数(类)就具备了另一个函数(类)的方法或者是属性,这也可以称之为“继承”。
点击查看--call 和 apply 测试示例
Tags: caller, callee
Javascript | 评论:0
| 阅读:18424