使用AmplifyJS和JQuery编写更好更优雅的javascript事件处理代码

使用AmplifyJS和JQuery编写更好更优雅的javascript事件处理代码

大家好,又见面了,我是全栈君。

事件(或消息)是一种经常使用的软件设计模式。可以减少消息处理者和消息公布者的之间的耦合,比方J2EE里面的JMS规范。设计模式中的观察者模式(也叫公布/订阅模式)。这对于javascript代码相同适用。之前写的JQuery相关博客中。具体介绍了JQuery的事件处理机制和特性,具体可以參考这个文件夹下的文章。


JQuery事件处理事实上就是使用了公布/订阅模式,包含它提供的命名空间机制、自己定义事件都非常的棒,可是JQuery事件处理有一个缺陷:JQuery事件都是和DOM元素相关的,可是非常多时候我们并不须要DOM元素。仅仅希望使用事件的公布/订阅这样的机制。

代码1:假设某个DOM元素不存在。那么不能依靠它使用事件的公布和订阅。

// not-exsit不存在的dom元素,事件处理无效
 $("not-exsit").bind("self-event",function(){alert(11);});
 $("not-exsit").trigger("self-event");


代码2:JQuery并没有提供全局的bind/trigger。以下代码会报错。

// 报异常$.trigger is not a function
  $.bind("self-event",function(){alert(11);});
  $.trigger("self-event");


通过上面的代码1和代码2,我们就能够看出JQuery事件的不足之处了。我们能够在项目中使用AmplifyJS框架,就能够解决上面的问题。

AmplifyJS官网http://amplifyjs.com/ 和代码下载地址http://www.bootcdn.cn/amplifyjs/

<script src="amplify.js"></script>
<script>
	amplify.subscribe( "self-event", function(context){
		console.log("priority=5,data="+JSON.stringify(context));
	}, 5);
	
	
	amplify.subscribe( "self-event", function(context){
		console.log("priority=6,data="+JSON.stringify(context));
	}, 6); 
  
	amplify.subscribe( "self-event", function(context){
		console.log("priority=3,data="+JSON.stringify(context));
	}, 3);
  
  
  amplify.publish("self-event",{data:11});
  
</script>

这段代码能够正常的执行,通过AmplifyJS的使用方式能够看到。它刚好弥补了JQuery事件处理的不足。


以下附上AmplifyJS的源代码amplify.core.js。能够看到源代码非常的简短,也非常easy看懂。

/*!
 * Amplify Core 1.1.2
 *
 * Copyright 2011 - 2013 appendTo LLC. (http://appendto.com/team)
 * Dual licensed under the MIT or GPL licenses.
 * http://appendto.com/open-source-licenses
 *
 * http://amplifyjs.com
 */
(function( global, undefined ) {

var slice = [].slice,
	subscriptions = {};

var amplify = global.amplify = {
	publish: function( topic ) {
		if ( typeof topic !== "string" ) {
			throw new Error( "You must provide a valid topic to publish." );
		}

		var args = slice.call( arguments, 1 ),
			topicSubscriptions,
			subscription,
			length,
			i = 0,
			ret;

		if ( !subscriptions[ topic ] ) {
			return true;
		}

		topicSubscriptions = subscriptions[ topic ].slice();
		for ( length = topicSubscriptions.length; i < length; i++ ) {
			subscription = topicSubscriptions[ i ];
			ret = subscription.callback.apply( subscription.context, args );
			if ( ret === false ) {
				break;
			}
		}
		return ret !== false;
	},

	subscribe: function( topic, context, callback, priority ) {
		if ( typeof topic !== "string" ) {
			throw new Error( "You must provide a valid topic to create a subscription." );
		}

		if ( arguments.length === 3 && typeof callback === "number" ) {
			priority = callback;
			callback = context;
			context = null;
		}
		if ( arguments.length === 2 ) {
			callback = context;
			context = null;
		}
		priority = priority || 10;

		var topicIndex = 0,
			topics = topic.split( /\s/ ),
			topicLength = topics.length,
			added;
		for ( ; topicIndex < topicLength; topicIndex++ ) {
			topic = topics[ topicIndex ];
			added = false;
			if ( !subscriptions[ topic ] ) {
				subscriptions[ topic ] = [];
			}

			var i = subscriptions[ topic ].length - 1,
				subscriptionInfo = {
					callback: callback,
					context: context,
					priority: priority
				};

			for ( ; i >= 0; i-- ) {
				if ( subscriptions[ topic ][ i ].priority <= priority ) {
					subscriptions[ topic ].splice( i + 1, 0, subscriptionInfo );
					added = true;
					break;
				}
			}

			if ( !added ) {
				subscriptions[ topic ].unshift( subscriptionInfo );
			}
		}

		return callback;
	},

	unsubscribe: function( topic, context, callback ) {
		if ( typeof topic !== "string" ) {
			throw new Error( "You must provide a valid topic to remove a subscription." );
		}

		if ( arguments.length === 2 ) {
			callback = context;
			context = null;
		}

		if ( !subscriptions[ topic ] ) {
			return;
		}

		var length = subscriptions[ topic ].length,
			i = 0;

		for ( ; i < length; i++ ) {
			if ( subscriptions[ topic ][ i ].callback === callback ) {
				if ( !context || subscriptions[ topic ][ i ].context === context ) {
					subscriptions[ topic ].splice( i, 1 );
					
					// Adjust counter and length for removed item
					i--;
					length--;
				}
			}
		}
	}
};

}( this ) );

更具体的API使用,能够參考以下这2篇文章:

AmplifyJS源代码简析:事件分发

Extending Your jQuery Application with Amplify.js


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115403.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Markdown学习

    Markdown学习

    2021年10月6日
    32
  • ca证书 csr_SSL证书CSR文件生成方式及注意事项

    ca证书 csr_SSL证书CSR文件生成方式及注意事项原标题 SSL 证书 CSR 文件生成方式及注意事项 SSL 证书中 CSR 文件是指什么 CSR 生成方式如何选择 CSR 有什么作用 生成 CSR 文件方法有哪些 SSL 大全网 ssldaquan com 来详细说下 SSL 证书中 CSR 文件的详细作用及 CSR 生成方式及注意事项 什么是 CSR 文件 CSR CertificateS 是证书签名请求文件 包含了您的服务器信息和公司信息 申请证书

    2025年7月11日
    2
  • Bootstrap 之Table样式[通俗易懂]

    Bootstrap 之Table样式[通俗易懂]将标签添加class=‘table’类后的样式Table样式编号姓名年龄001郭靖25002黄蓉23003杨过24我们可以看到,Tabl

    2022年9月20日
    2
  • 一个简单的ETL开发的过程(informatica)

    一个简单的ETL开发的过程(informatica)大致的了解过程,中间不涉及组件部分。 正文PowerCenter的开发过程大致可以分为几步:1.在客户端PowerCenterDesigner中导入源表和目标表的结构定义。(只是表结构)2.在PowerCenterDesigner中执行的事件为:   1&gt;.创建Mapping。   2&gt;.拖动源和目标进入Mapping。(类似于定义变量)   …

    2022年5月29日
    100
  • 酒店管理系统源码_客户管理系统源码

    酒店管理系统源码_客户管理系统源码(1)资源完全开放型:系统所有的资源,功能交由用户管理,权限控制到按钮,针对不同的用户,组装不同的界面,分配不同的使用功能.不放心再加权限到按钮。(2)系统突出以营销、预订、房源、房价等对营销具有影响力的信息处理。房价码可按年,季,月,周,日设定。(3)强化以客源为中心的信息完整性、长久性、可操作性。建立了客档为中心的用户信息管理系统。(4)使用数据穿透查询技术,对数据进行多元,多层次的查询.从汇中数据到明细发生,紧密联系在一起,灵活实用。(5)客档、角色、佣金、房价方案、授权折扣、操作权

    2022年9月24日
    2
  • matlab debounce,Debounce Temporal Properties

    matlab debounce,Debounce Temporal PropertiesTemporalOperatorsTheSimulink®DesignVerifier™libraryprovidesthreebasictemporaloperatorblockscanbeusedtomodeltemporalproperties.Theintentofthetemporaloperatorsistosupportthe…

    2022年6月20日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号