`
afcn0
  • 浏览: 9193 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

Prototype修改版本,比jQuery还好用的事件注册器

阅读更多
Prototype非常强大,但是jQuery也非常好用,Prototype当然也象jQuery学习了,比如$$的css选择器,可是使用起来依然不是那么方便,并且随着1.60出现,Prototype库越来越大,我有个想法,想在一定程度上修改Prototype,增加一些有用的功能,去掉一些没用的东西,第一个版本,我扩展了事件的注册机制
原本在Prototype里面如果想注册事件,必须这样
$("id").observe("click",function(){alert("hello world")})
注册多个元素一般这样
$$("div img").each(function(node){node.observe("click",function(){alert("hello")})})
相当的麻烦,那我扩展出了$E函数,专门接受特殊事件伪类选择器添加事件处理函数,可以这样用
$E("#id::click")(function(){alert("hello world")});
甚至
$E("#id::click")("alert('hello world')");
怎么样,简单吧,其实就是原来的css选择器文本加"::"伪类标志,加事件名,比如"click",还添加了Chain.bindEvent方法,可以实现一次大量元素添加事件,比如,现在我想给很多元素添加事件,看下面代码
var target={
"#bbb::click":"alert(234);return false",
"#bbb2::mouseover":function(){alert("haha")},
"#bbb3::mouseout":"prompt()",
"input::mouseover":"confirm('eee')"
}
Chain.bindEvent(target)
这样就全搞定了,以后你所要维护的就是页面当中的一个事件参数列表了,甚至这个列表可以象css一样在各个页面当中复用,本修改版是基于1.5.11版本
  • chain.rar (20.8 KB)
  • 描述: Chain 版本0.01
  • 下载次数: 64
分享到:
评论
6 楼 sunfengcheng 2008-07-24  
我想知道上面的 Java 代码怎么加上去的,嘿嘿,是不是太菜了??
5 楼 afcn0 2007-10-20  
1. 1.6 rci基本就是最后版本了,"Barring any heinous bugs, RC1 will be our last release candidate, and you can expect the final version of 1.6.0 to land in early November.
"
2.类继承经过讨论已经按照讨论结果修改了,不会再变动了
3.Hash表从写了,现在都是closure,避免与继承的属性冲突
4.自定义事件必须有namespace
看讨论,基本就是release了,当然我在建议$$最后一个参数支持context,虽然现在有select方法
4 楼 afcn0 2007-10-20  
确实是没考虑如何删除事件,但是,这样的写法
$E("#id::click")("alert('hello world')"); 

以及
var target={   
"#bbb::click":"alert(234);return false",   
"#bbb2::mouseover":function(){alert("haha")},   
"#bbb3::mouseout":"prompt()",   
"input::mouseover":"confirm('eee')"  
}   
Chain.bindEvent(target) 

这样的批量注册事件,我看在语法上还是新颖的,删除事件的话,我也想用类似语法,比如
$E("#id::click")(false);

或者类似的
3 楼 笨笨狗 2007-10-19  
Prototype原来的写法很好啊,而且,就这句来说:<br/>
<div class='code_title'>js 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-c' start='1'>
    <li class='alt'><span><span>$$(</span><span class='string'>"div img"</span><span>).each(function(node){node.observe(</span><span class='string'>"click"</span><span>,function(){alert(</span><span class='string'>"hello"</span><span>)})})</span></span></li>
</ol>
</div>
<br/>
有个提高效率的技巧,调用invoke可以避免创建闭包<br/>
<div class='code_title'>js 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-c' start='1'>
    <li class='alt'><span><span>$$(</span><span class='string'>"div img"</span><span>).invoke(</span><span class='string'>"observe"</span><span>,</span><span class='string'>"click"</span><span>,handler)  </span></span></li>
</ol>
</div>
<br/>
而且,不知道楼主考虑过没有,如果你修改了添加事件监听的api,那也该提供一个对应的删除事件监听的api吧?<br/>
<br/>
<br/>
所以,我还是习惯原来的写法。另外现在1.6版还未正式定下来,以后的改变可能会很大,比如类继承的设计,还是先等等再用了。比较期待新的自定义事件的功能:)<br/>
<br/>
倒是对Prototype的迭代方法有点不满,怎么不传入一个处理函数,在第一次循环节点的时候处理每个节点呢?那样就不用循环两次了,所以,我写了个自己的获取某个元素子节点的方法来代替,可以在收集元素的同时对节点做处理,比如添加事件处理函数,可以查某元素的所有子节点、特定标签的子节点、第一个或者最后一个子节点,并在查找过程中处理,提高运行效率:<br/>
<div class='code_title'>js 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-c' start='1'>
    <li class='alt'><span><span class='keyword'>var</span><span> findChild = </span><span class='keyword'>function</span><span>(element,option){  </span></span></li>
    <li class=''><span>    <span class='keyword'>var</span><span> element = $(element);  </span></span></li>
    <li class='alt'><span>    <span class='keyword'>var</span><span> option = Object.extend({tagName:</span><span class='keyword'>null</span><span>,position:</span><span class='string'>"all"</span><span>,iterator:</span><span class='keyword'>null</span><span>},option);  </span></span></li>
    <li class=''><span>    option.tagName = option.tagName ? option.tagName.toLowerCase():<span class='keyword'>null</span><span>;  </span></span></li>
    <li class='alt'><span>    <span class='keyword'>if</span><span>(option.position==</span><span class='string'>"all"</span><span>){  </span></span></li>
    <li class=''><span>        <span class='keyword'>var</span><span> elements = [];  </span></span></li>
    <li class='alt'><span>        <span class='keyword'>if</span><span> (!(element = element.firstChild)) </span><span class='keyword'>return</span><span> elements;  </span></span></li>
    <li class=''><span>        <span class='keyword'>if</span><span>(!option.tagName){  </span></span></li>
    <li class='alt'><span>            <span class='keyword'>while</span><span> (element){  </span></span></li>
    <li class=''><span>                <span class='keyword'>if</span><span>(element.nodeType==1){                      </span></span></li>
    <li class='alt'><span>                    (<span class='keyword'>typeof</span><span> option.iterator != </span><span class='string'>"function"</span><span>) ? </span><span class='keyword'>null</span><span> : option.iterator(element = $(element));  </span></span></li>
    <li class=''><span>                    elements.push(element);  </span></li>
    <li class='alt'><span>                }  </span></li>
    <li class=''><span>                element = element.nextSibling;  </span></li>
    <li class='alt'><span>            }                         </span></li>
    <li class=''><span>        }<span class='keyword'>else</span><span>{  </span></span></li>
    <li class='alt'><span>            <span class='keyword'>while</span><span> (element){  </span></span></li>
    <li class=''><span>                <span class='keyword'>if</span><span>(element.nodeType==1&amp;&amp;element.tagName.toLowerCase()==option.tagName){   </span></span></li>
    <li class='alt'><span>                    (<span class='keyword'>typeof</span><span> option.iterator != </span><span class='string'>"function"</span><span>) ? </span><span class='keyword'>null</span><span> : option.iterator(element = $(element));  </span></span></li>
    <li class=''><span>                    elements.push(element);  </span></li>
    <li class='alt'><span>                }  </span></li>
    <li class=''><span>                element = element.nextSibling;  </span></li>
    <li class='alt'><span>            }  </span></li>
    <li class=''><span>        }  </span></li>
    <li class='alt'><span>        <span class='keyword'>return</span><span> elements;                  </span></span></li>
    <li class=''><span>    }<span class='keyword'>else</span><span> </span><span class='keyword'>if</span><span>(option.position==</span><span class='string'>"last"</span><span>){  </span></span></li>
    <li class='alt'><span>        <span class='keyword'>if</span><span>(!(element = element.lastChild)) </span><span class='keyword'>return</span><span> </span><span class='keyword'>null</span><span>;  </span></span></li>
    <li class=''><span>        <span class='keyword'>if</span><span>(!option.tagName){  </span></span></li>
    <li class='alt'><span>            <span class='keyword'>while</span><span> (element){  </span></span></li>
    <li class=''><span>                <span class='keyword'>if</span><span>(element.nodeType==1){                          </span></span></li>
    <li class='alt'><span>                    (<span class='keyword'>typeof</span><span> option.iterator != </span><span class='string'>"function"</span><span>) ? </span><span class='keyword'>null</span><span> : option.iterator(element = $(element));  </span></span></li>
    <li class=''><span>                    <span class='keyword'>return</span><span> element;  </span></span></li>
    <li class='alt'><span>                }  </span></li>
    <li class=''><span>                element = element.previousSibling;  </span></li>
    <li class='alt'><span>            }                         </span></li>
    <li class=''><span>        }<span class='keyword'>else</span><span>{  </span></span></li>
    <li class='alt'><span>            <span class='keyword'>while</span><span> (element){  </span></span></li>
    <li class=''><span>                <span class='keyword'>if</span><span>(element.nodeType==1&amp;&amp;element.tagName.toLowerCase()==option.tagName){                       </span></span></li>
    <li class='alt'><span>                    (<span class='keyword'>typeof</span><span> option.iterator != </span><span class='string'>"function"</span><span>) ? </span><span class='keyword'>null</span><span> : option.iterator(element = $(element));  </span></span></li>
    <li class=''><span>                    <span class='keyword'>return</span><span> element;  </span></span></li>
    <li class='alt'><span>                }  </span></li>
    <li class=''><span>                element = element.previousSibling;  </span></li>
    <li class='alt'><span>            }  </span></li>
    <li class=''><span>        }  </span></li>
    <li class='alt'><span>    }<span class='keyword'>else</span><span>{  </span></span></li>
    <li class=''><span>        <span class='keyword'>if</span><span> (!(element = element.firstChild)) </span><span class='keyword'>return</span><span> </span><span class='keyword'>null</span><span>;  </span></span></li>
    <li class='alt'><span>        <span class='keyword'>if</span><span>(!option.tagName){  </span></span></li>
    <li class=''><span>            <span class='keyword'>while</span><span> (element){  </span></span></li>
    <li class='alt'><span>                <span class='keyword'>if</span><span>(element.nodeType==1){                          </span></span></li>
    <li class=''><span>                    (<span class='keyword'>typeof</span><span> option.iterator != </span><span class='string'>"function"</span><span>) ? </span><span class='keyword'>null</span><span> : option.iterator(element = $(element));  </span></span></li>
    <li class='alt'><span>                    <span class='keyword'>return</span><span> element;  </span></span></li>
    <li class=''><span>                }  </span></li>
    <li class='alt'><span>                element = element.nextSibling;  </span></li>
    <li class=''><span>            }                         </span></li>
    <li class='alt'><span>        }<span class='keyword'>else</span><span>{  </span></span></li>
    <li class=''><span>            <span class='keyword'>while</span><span> (element){  </span></span></li>
    <li class='alt'><span>                <span class='keyword'>if</span><span>(element.nodeType==1&amp;&amp;element.tagName.toLowerCase()==option.tagName){                       </span></span></li>
    <li class=''><span>                    (<span class='keyword'>typeof</span><span> option.iterator != </span><span class='string'>"function"</span><span>) ? </span><span class='keyword'>null</span><span> : option.iterator(element = $(element));  </span></span></li>
    <li class='alt'><span>                    <span class='keyword'>return</span><span> element;  </span></span></li>
    <li class=''><span>                }  </span></li>
    <li class='alt'><span>                element = element.nextSibling;  </span></li>
    <li class=''><span>            }  </span></li>
    <li class='alt'><span>        }  </span></li>
    <li class=''><span>    }  </span></li>
    <li class='alt'><span>}  </span></li>
</ol>
</div>
<br/>
赶时间写的没有做过优化,不过这个思想应该没错,实际使用中能明显看到效率改进。
2 楼 afcn0 2007-10-19  
对于
$E("div span::['mouseover','mouseout','click']")("dosomething()")
这样的语法,多事件同一事件处理函数,以及
$E("div span::['mouseover','mouseout','click']")("test1()","test2()","test3()")
这样的语法,多事件,多事件处理函数,各位网友认为是不是有必要呢?
另外上个例子当中使用的select语法是1.6里面的方法,这个版本里面没有
1 楼 afcn0 2007-10-19  
其实此版本重点就是$E函数的扩展,主要是扩展了事件伪类,毕竟jQuery除了XPath CSS也支持自己独创的比如:odd :even,那我独创个事件伪类,并且这样的代码
$E("div span::mouseover")("this.select('img').invoke('hide')")
$E("div span::mouseout")("this.select('img').invoke('show')")
也非常清晰,并且使用Chain.bindEvent通过对象列表,基本可以实现事件处理函数不用写成inline的形式,并且我还在考虑是否使用1.6 rc1里面的dom:ready进行事件注册,此版本为事件测试版本,大家看看有没有什么bug

相关推荐

    锋利的jQuery源代码

    在源代码中,可以看到$.fn(即jQuery.prototype)是扩展jQuery功能的主要接口,许多方法如`click()`、`slideUp()`都定义在这里。 接着,我们来看看jQuery的选择器功能。jQuery提供了丰富的选择器语法,包括ID选择器...

    jQuery源码分析-03构造jQuery对象

    - **函数**:作为`ready`事件的回调函数注册。 每种类型的处理方式确保了jQuery对象能够灵活地适应不同的应用场景,并能够正确地获取或创建DOM元素。 #### 五、`jQuery.extend`与`jQuery.fn.extend` `jQuery....

    jQuery技巧之让任何组件都支持类似DOM的事件管理

    本文将探讨如何利用jQuery实现一个技巧,使得任何组件都能够支持类似于DOM事件的管理,包括事件派发、添加/删除监听器、事件冒泡和阻止默认行为。 首先,我们来看传统的发布-订阅模式。这种模式通常用于实现组件间...

    jQuery插件开发学习

    jQuery通过简洁的语法封装了大量JavaScript的常用功能,如选择器(用于选取DOM元素)、DOM操作(添加、删除或修改元素)、事件处理(监听和响应用户行为)以及动画效果(平滑改变CSS属性)。这些功能使得开发者能够...

    jQuery详细教程

    jQuery详细教程,讲解很透彻, 一. jQuery 语法实例 $(this).hide() 演示 jQuery hide() 函数,隐藏当前的 HTML 元素。 $("#test").hide() 演示 jQuery hide() 函数,隐藏 id="test" 的元素。 $("p").hide() ...

    jQuery源码分析(1.7)

    1. **前置过滤器**:jQuery提供了`$.ajaxPrefilter()`方法,可以在发送请求之前对请求选项进行修改。 2. **请求分发器**:`$.ajaxTransport()`允许注册特定类型的请求处理器。 3. **示例**:注册前置过滤器。 ``...

    jQuery 完整文档包括帮助文件

    在这个版本中,jQuery提供了一系列实用的功能,如选择器、DOM操作、事件处理、动画效果和Ajax交互等。例如,使用 `$()` 函数可以快速选取HTML元素,`$(document).ready()` 用于在页面加载完成后执行代码,`$.ajax()`...

    prototype的ajax应用

    `Ajax.Responders`是一个注册器,允许你定义全局的回调函数,处理所有Ajax请求的状态变化,如开始、完成、错误等。 6. **模拟表单提交**: Prototype可以很容易地模拟HTML表单的提交,将表单数据通过Ajax发送到...

    ajax(jquery)学习二.1 装载

    文件中还提到了如何配置验证器的一些选项,如 `errorClass` 和 `validClass` 类别,这些类别用于在 DOM 元素上添加样式,以显示哪些字段有错误或哪些字段是有效的。 #### 3. 具体验证规则 文件中列举了一些常见的...

    jquery插件

    1. **定义命名空间**:为了避免和其他代码冲突,我们通常在$.fn(即jQuery.prototype)上定义我们的插件方法。 ```javascript $.fn.myPlugin = function(options) { // 插件代码 }; ``` 2. **封装函数**:将主要...

    轮播组件jquery

    在jQuery中,我们可以通过选择器获取元素,然后进行操作,如添加或删除类、修改属性、更新HTML内容等。在轮播组件中,这常用于隐藏/显示轮播项、改变导航按钮的状态等。 ### 4. 动画效果 jQuery的`.animate()`方法...

    JQuery学习笔录 简单的JQuery

    使用JQuery能够实现的功能包括但不限于选择元素、修改元素的属性、添加事件监听器、操作DOM树结构等。这些功能的实现,往往比直接使用原生JavaScript更为简洁。 在讨论JQuery对象时,我们需要注意它与DOM对象之间的...

    IconPicker:一个简单的jQuery Icon Picker插件

    IconPicker是一款基于jQuery的图标选择器插件,它为用户提供了方便的方式来选择和管理图标。在Web开发中,图标是界面设计的重要元素,用于增强用户体验和视觉吸引力。IconPicker简化了这一过程,允许开发者轻松地...

    jQuery 源码分析笔记

    Sizzle是一个高效的纯JavaScript CSS选择器引擎,从jQuery 1.3版本开始被引入,提高了jQuery在处理复杂选择器时的性能。 jQuery的`data`和`event`模块是其强大功能的关键部分。`jQuery.data`允许开发者存储数据与...

    jquery简单体验

    与 Prototype 相比,jQuery 更像 Ruby,提供了一种更加直观和高效的方式来操作 DOM、处理事件、执行 AJAX 请求以及创建动态网页。 1. **选择器**: jQuery 的核心之一就是其强大的选择器功能,它借鉴了 CSS 选择器...

    使用JQuery实现的分页插件分享

    当`define`函数存在且支持AMD时,插件会被注册为一个模块,依赖jQuery并传递工厂函数。否则,工厂函数直接以全局模式执行,接收jQuery作为参数。 ```javascript (function (factory) { if (typeof define === ...

    jQuery-plugins:正在研究使其成为插件

    6. **事件处理**: 使用`.on()`方法注册事件监听器,确保当元素动态添加到页面时,插件仍能正确响应。 7. **公开方法**: 为了使插件在创建后可被修改或控制,我们可以公开一些方法。例如,添加一个更新设置的方法:`...

Global site tag (gtag.js) - Google Analytics