给自定义对象加上自定义事件的支持的教程

我一般是不看别人写的代码的,为啥?累!而且这位同志给的还是经过压缩的!汗。。。考我是不是?还有,这位同志也不给个示例的代码,只说是代码没有问题。我努力的试着去“破解”,但是脑细胞死的太快了!在我没有变成白痴之前,我毅然决定,不在往下看下去。不就是给自定的对象加入自定事件的支持吗?我写个示例吧,就算是教程了,如果看不懂,我也没有办法了!我不会傻到给你写好代码,让你拿去卖钱的!
好了,下面是我写的代码,注意看了:

自定义事件

function JCEvent(pParent){
var self = this;
var body = JCEvent.$(pParent) || document.body;
var oOutline = null;

var outline_click = function(){
if(self.onClick instanceof Function)
self.onClick();
}

this.create = function(){
oOutline = JCEvent.$c("DIV");
body.appendChild(oOutline);
oOutline.onclick = outline_click;
if(typeof this.onCreate == "function")
this.onCreate();
}

this.getOutline = function(){
return oOutline;
}

this.setSkin = function(pSkin){
var oldSkin = oOutline.className;
oOutline.className = pSkin;

if(typeof this.onChangeSkin == "function")
this.onChangeSkin(oldSkin,pSkin);
}

this.getSkin = function(){
return oOutline.className;
}
}

(function($){
$.$ = function(p){
return (typeof(p) != "object") ? document.getElementById(p) : p;
}

$.$c = function(pTag){
return document.createElement(pTag);
}

$.$css = function(pKey,pValue,p){
var obj = p ? $.$(p) : this;
obj.style[pKey] = pValue;
obj.$css = $.$css;
return obj;
}
})(JCEvent);

var c1 = new JCEvent("div1");
c1.onCreate = function(){
alert("onCreate事件\n创建 c1");
}
c1.onChangeSkin = function(pOld,pNew){
alert("onChangeSkin事件\n设置c1的皮肤:\n新皮肤:" + pNew + "\n旧皮肤:" + pOld);
}
c1.onClick = function(){
this.setSkin(this.getSkin() == "JCEventDemo" ? "" : "JCEventDemo");
}
c1.create();
JCEvent.$css("top","20px",c1.getOutline()).$css("left","100px").$css("backgroundColor","#ff00ff").$css("height","100px").$css("width","100px").$css("position","absolute");

var c2 = new JCEvent("div2");
c2.onCreate = function(){
alert("onCreate事件\n创建 c2");
}
c2.onChangeSkin = function(pOld,pNew){
alert("onChangeSkin事件\n设置c2的皮肤:\n新皮肤:" + pNew + "\n旧皮肤:" + pOld);
}
c2.onClick = function(){
this.setSkin(this.getSkin() == "JCEventDemo" ? "" : "JCEventDemo");
}
c2.create();
JCEvent.$css("top","60px",c2.getOutline()).$css("left","200px").$css("backgroundColor","#00ff00").$css("height","100px").$css("width","200px").$css("position","absolute");
var c3 = new JCEvent("div3");
c3.create();
JCEvent.$css("top","70px",c3.getOutline()).$css("left","300px").$css("backgroundColor","#cc6600").$css("height","100px").$css("width","150px").$css("position","absolute");

c1.setSkin("JCEventDemo");
c1.getOutline().innerHTML = "Click me!";
c2.getOutline().innerHTML = "Click me!";
c3.getOutline().innerHTML = "Don't click me!";

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

示例中,自定义了一个:JCEvent,c1,c2,c3都是这它的实例。
每个实例都有一个oOutline,我一般用它来做为对象的容器。pParent是用来指示自定义对象在哪里显示的,也就相当于占位符吧,如果不指定,就是document.body。

示例中,我定义了三个自定事件:onCreate,onChangeSkin,onClick
onCreate 在 create方法里触发。
onChangeSkin在setSkin方法里触发。
onClick在oOutline.onclick里触发。

调用顺序:
由于onCreate是在create方法里调用的,所以c1.onCreate要在c1.create()之前声明。

事件的参数,见:

this.setSkin = function(pSkin){
  var oldSkin = oOutline.className;
  oOutline.className = pSkin;

if(typeof this.onChangeSkin == "function")
   this.onChangeSkin(oldSkin,pSkin);
 }

this.onChangeSkin(oldSkin,pSkin);
这样,你就可以在每个实例里运用oldSkin和newSkin了。

如:
 c1.onChangeSkin = function(pOld,pNew){
  alert("onChangeSkin事件\n设置c1的皮肤:\n新皮肤:" + pNew + "\n旧皮肤:" + pOld);
 }

另外,示例中:

$.$css = function(pKey,pValue,p){
  var obj = p ? $.$(p) : this;
  obj.style[pKey] = pValue;
  obj.$css = $.$css;
  return obj;
 }

这一段,写成Object.prototype.$css = function(...)是绝对不成功的,至于为什么,就不是这里的讨论范围。

没话可说了,就留空白吧,看不懂的同志,在补补你们的javascript知识。
说点题外话:不要老是整jQuery,prototype,json等。

(0)

相关推荐

  • JavaScript自定义事件介绍

    很多DOM对象都有原生的事件支持,向div就有click.mouseover等事件,事件机制可以为类的设计带来很大的灵活性,相信.net程序员深有体会.随着web技术发展,使用JavaScript自定义对象愈发频繁,让自己创建的对象也有事件机制,通过事件对外通信,能够极大提高开发效率. 简单的事件需求 事件并不是可有可无,在某些需求下是必需的.以一个很简单的需求为例,在web开发中Dialog很常见,每个Dialog都有一个关闭按钮,按钮对应Dialog的关闭方法,代码看起来大概是这样 复制代码

  • js自定义事件及事件交互原理概述(二)

    js自定义事件(一)的目的只是让大家简单的理解自定事件是如何模拟出来的,大家不难发现会有很多缺陷,比如: 1.此事件对象只能注册一个事件,不能提供多个事件 2.注册方法没有返回的一些信息 下面我们就来解决这些问题.如下为MyEvent.js源代码: 复制代码 代码如下: function MyEvent(){ this.handlers={}; } MyEvent.prototype={ addHandler:function(type,handler) { if(typeof this.han

  • js自定义事件代码说明

    复制代码 代码如下: <form onreturn="ReturnCallBack();" jstype="vali"> </form> <script type="text/javascript"> var ReturnCallBack = function(){ //CODE return true; } </script> 代码看起来太悬了,怎么好象多了一个onreturn事件... 说说我这

  • js实现屏蔽默认快捷键调用自定义事件示例

    具体如何屏蔽更多的快捷键可以自行google搜索. 这里要说的是如何屏蔽后去执行自定义的事件. 这里为了方便使用的Kibo做例子,使用google搜索出来的结果一般都是javascript原生实现,很简单的,这里不做介绍. 这里是实现了在一个textarea中enter进行保存的例子,屏蔽掉了原来的回车事件. 代码如下: 复制代码 代码如下: //键盘监听 var areaKey = new Kibo($("#aac010")[0]); areaKey.down('enter',doS

  • javascript 自定义事件初探

    还有,"通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率.".相信C#程序员对事件的好处是深有体会的.好了,Code is cheap.看代码: function class1() { // 最简单的事件设计模式 } class1.prototype = { show: function () { this .onShow(); }, onShow: function () { } } function test() { var obj = new cla

  • js自定义事件及事件交互原理概述(一)

    在JS中事件是JS与浏览器交互的主要途径.事件是一种叫做观察者的设计模式,这是一种创建松散耦合代码的技术.对象可以发布事件,用来表示在该对象生命周期中某个有趣的时刻到了.然后其他对象可以观察该对象,等待这些有趣的时刻到来并通过运行代码来响应. 观察者模式有两类对象组成:主题和观察者.主体负责发布事件,同时观察者通过订阅这些事件来观察该主体.该模式的一个关键概念是主体并不知道观察者的任何事情,也就是说它可以独自存在并正常运作即使观察者不存在.从另一方面说,观察者知道主体并能注册事件的回调函数(事件

  • 给自定义对象加上自定义事件的支持的教程

    我一般是不看别人写的代码的,为啥?累!而且这位同志给的还是经过压缩的!汗...考我是不是?还有,这位同志也不给个示例的代码,只说是代码没有问题.我努力的试着去"破解",但是脑细胞死的太快了!在我没有变成白痴之前,我毅然决定,不在往下看下去.不就是给自定的对象加入自定事件的支持吗?我写个示例吧,就算是教程了,如果看不懂,我也没有办法了!我不会傻到给你写好代码,让你拿去卖钱的! 好了,下面是我写的代码,注意看了: 自定义事件 function JCEvent(pParent){ var s

  • JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法

    本文实例讲述了JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法.分享给大家供大家参考,具体如下: 这里演示js如何给页面中所有的img对象加上onclick事件,且实现在新窗体中查看该图片文件的功能: <script type="text/JavaScript" language="javascript"> <!-- ///给页面中所有img对象添加onclick事件 //author:aganar /// function

  • vue 实现click同时传入事件对象和自定义参数

    仅仅传入自定义参数 HTML <div id="app"> <button @click="tm(123)">ddddd</button> </div> JS代码 new Vue({ el:'#app', methods:{ tm:function(e){ console.log(e); } } }) 仅仅传入事件对象 HTML <div id="app"> <button @cl

  • Node.js自定义对象事件的监听与发射

    一.Node.js是以事件驱动的,那我们自定义的一些js对象就需要能监听事件以及发射事件. 在Node.js中事件使用一个EventEmitter对象发出,该对象在events模块中.它应该是使用观察者设计模式来实现把事件监听器添加到对象以及移除,之前写OC那块的时候也有些观察者设计模式,在OC中也经常用到:通知中心.KVO,也很容易理解. .addListener(eventName,callback):将回调函数附加到对象的监听器中.当eventName的事件被触发时,回调函数被放置在事件队

  • 详解Angularjs 如何自定义Img的ng-load 事件

    在使用AngularJs的过程中,我们常常会用到一些ng-事件,如ng-click.ng-change等,这些事件都是AngularJs事先为我们定义好的.也有的情况下,我们会用到一些使用频率不高的dom事件,如img的onload(图片加载完成后触发),但AngularJs中默认没有这个事件,那么我们该如何自定义添加ng-load这个事件呢? 只需要给app对象添加如下指令即可: myApp.directive('imageonload', function () { return { res

  • vue自定义移动端touch事件之点击、滑动、长按事件

    用法: **HTML** <div id="app" class="box" v-tap="vuetouch" //vuetouch为函数名,如没有参数,可直接写函数名 v-longtap="{fn:vuetouch,name:'长按'}" //如果有参数以对象形式传,fn 为函数名 v-swipeleft="{fn:vuetouch,name:'左滑'}" v-swiperight="{f

  • Python进阶之自定义对象实现切片功能

    切片是 Python 中最迷人最强大最 Amazing 的语言特性(几乎没有之一),在<Python进阶:切片的误区与高级用法>中,我介绍了切片的基础用法.高级用法以及一些使用误区.这些内容都是基于原生的序列类型(如字符串.列表.元组......),那么,我们是否可以定义自己的序列类型并让它支持切片语法呢?更进一步,我们是否可以自定义其它对象(如字典)并让它支持切片呢? 1.魔术方法:__getitem__() 想要使自定义对象支持切片语法并不难,只需要在定义类的时候给它实现魔术方法 __ge

  • Vertx基于EventBus发送接受自定义对象

    先看官方文档步骤: 需要一个编解码器,看源码: 可见内置了需要数据类型的实现,所以发送其他消息可以发送,但是如果发送自定义对象就需要自己实现编解码逻辑了 一 自定义编解码器 /** * 自定义对象编解码器,两个类型可用于消息转换,即发送对象转换为接受需要的对象 */ public class CustomizeMessageCodec implements MessageCodec<OrderMessage, OrderMessage> { /** * 将消息实体封装到Buffer用于传输 *

  • JPA自定义对象接收查询结果集操作

    最近使用JPA的时候,碰到需要自定义查询结果集的场景,网上搜了一下,都是需要自定义方法写一大串代码实现的,太繁琐了,有那时间还不如用mybaits. 用JPA就是要尽量通过声明接口解决持久层问题,要不然鬼用.逼得没办法去了官网看看文档,再没有就放弃了,没时间看源码.最终找到我想要的结果了. 例如,传统的JPA接口实现如下所示: class Person { @Id UUID id; String firstname, lastname; Address address; static class

  • Python自定义对象实现切片功能

    目录 1.魔术方法:__getitem__() 2.自定义序列实现切片功能 3.自定义字典实现切片功能 切片是 Python 中最迷人最强大最 Amazing 的语言特性(几乎没有之一),在<Python进阶:切片的误区与高级用法>中,我介绍了切片的基础用法.高级用法以及一些使用误区.这些内容都是基于原生的序列类型(如字符串.列表.元组--),那么,我们是否可以定义自己的序列类型并让它支持切片语法呢?更进一步,我们是否可以自定义其它对象(如字典)并让它支持切片呢? 1.魔术方法:__getit

随机推荐