使用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)
上一篇 2022年2月4日 下午9:00
下一篇 2022年2月4日 下午10:00


相关推荐

  • 【spring-kafka】@KafkaListener详解与使用

    【spring-kafka】@KafkaListener详解与使用说明从2.2.4版开始,您可以直接在注释上指定Kafka使用者属性,这些属性将覆盖在使用者工厂中配置的具有相同名称的所有属性。您不能通过这种方式指定group.id和client.id属性。他们将被忽略;可以使用#{…​}或属性占位符(${…​})在SpEL上配置注释上的大多数属性。比如:@KafkaListener(id=”consumer-id”,topics=”SHI_TOPIC1″,concurrency=”${listen.concurrency:3}”,

    2022年10月14日
    3
  • Pytest(16)随机执行测试用例pytest-random-order「建议收藏」

    Pytest(16)随机执行测试用例pytest-random-order「建议收藏」前言通常我们认为每个测试用例都是相互独立的,因此需要保证测试结果不依赖于测试顺序,以不同的顺序运行测试用例,可以得到相同的结果。pytest默认运行用例的顺序是按模块和用例命名的ASCII编码

    2022年7月31日
    5
  • 基于Redis6.2.6版本部署Redis Cluster集群

    基于Redis6.2.6版本部署Redis Cluster集群基于 Redis6 2 6 版本部署 RedisCluster 集群 1 Redis6 2 6 简介以及环境规划在 Redis6 x 版本中主要增加了多线程的新特性 多线性对于高并发场景是非常有必要的 Redis6 x 新特性如下 多线程 IO 重新设计了客户端缓存功能 RESP3 协议支持 SSLACL 权限控制提升了 RDB 日志加载速度发布官方的 Redis 集群代理模块 RedisCluster 集群原理可以查看之前发布的文章 环境规划 IP 主机名端口号

    2025年10月3日
    5
  • HDU 4828 (卡特兰数+逆)

    HDU 4828 (卡特兰数+逆)

    2022年1月1日
    54
  • 代码空间项目 — InstantiationException的异常

    代码空间项目 — InstantiationException的异常java.lang.InstantiationException实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。这次项目中查询type时候

    2022年7月1日
    25
  • Javascript 之 ES7 新特性详解

    Javascript 之 ES7 新特性详解ES7 ES8 前言本篇文章主要介绍 ES7 ES8 的一些新功能 并结合 ES6 的一些 API 做出了相应的比较 ES71 Array prototype includes includes 作用 是查找一个值在不在数组里 若是存在则返回 true 不存在返回 false 1 基本用法 a b c includes a true

    2026年3月17日
    3

发表回复

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

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