热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

再起航,我的学习笔记之JavaScript设计模式28(委托模式)

委托模式

概念介绍

**委托模式(Entrust): **多个对象接收并处理同一请求,他们将请求委托给另一个对象统一处理请求。

利用委托优化循环

如果我们有一个需求需要让用户点击过的列表改变颜色,我们该怎么处理?我想肯定有很多人,和我之前的想法一样
首先我们想要让用户点击过的列表改变颜色,首先我们肯定要获取需要添加点击事件的li标签,然后再去用for循环给每个li添加点击事件让其变颜色,就像下面这样

var	li=document.getElementsByTagName('li');
	
	for(var i=li.length-1;i>=0;i--){
		li[i].Onclick=function(){
			this.style.backgroundColor='red';
		}
	}

我们看看效果
再起航,我的学习笔记之Javascript设计模式28(委托模式)

首先我们这样做,想法肯定没错,但是我们这样做无形之中增加了很多点击事件,万一我们这个列表很多,那么内存消耗就会变得很大。那么这个时候我们就可以通过委托模式来简化绑定事件来达到我们的目的

我们知道一个完整的事件流要经过事件捕获、触发事件、事件冒泡三个阶段,那么这个时候我们就可以通过把子元素的事件委托给
父元素去绑定执行,那么我们可以把代码做如下修改

var ul=document.getElementById('demo');
ul.Onclick=function(e){
	var e=e||window.event,
	tar=e.target||e.srcElement;
	if(tar.nodeName.toLowerCase()==='li'){
		tar.style.backgroundColor='yellow';
	}
}

我们依然可以实现效果
再起航,我的学习笔记之Javascript设计模式28(委托模式)

我们现在做的就是通过监听ul的点击事件判断目标元素是否是我们需要寻找的元素,如果是则执行相应的操作。这样我们为父元素绑定一个事件,通过委托模式就实现了所有子元素的点击事件需求。达到了我们优化的目的。

渲染js生成的元素

通过上面委托模式我们还能针对js中后生成的元素进行渲染添加点击事件
我们想在页面中创建一个DIV然后里面添加一个P标签然后通过js再在这个P标签下增加一个P标签,然后同时为这两个P标签添加点击事件,以前我们如果想要为这种不存在的元素添加点击事件可能是件很麻烦的事情但是有了委托模式之后,我们再实现这个功能我们发现会变得很轻松,我们来看看具体实现
html页面内容

我是html里的P标签

接着我们再通过js添加一个新的P标签并且给父元素添加点击事件

var test=document.getElementById('test');
test.Onclick=function(){
	var e=e||window.event,
	tar=e.target||e.srcElement;
	if (tar.nodeName.toLowerCase()==='p') {
		tar.innerHTML='我能修改这段文字';
	}
}
var p=document.createElement('p');
p.innerHTML='我是js里后来添加的P标签';
test.appendChild(p);

我们来看看效果
再起航,我的学习笔记之Javascript设计模式28(委托模式)

优化请求

当然使用委托模式还能优化我们的请求,比如下面我们模拟接收后台的请求去给页面元素赋值
html代码

如果我们要同时赋值,那么我们通常的做法是请求两次请求不同的方法,达到我们的目的

    $.get("/Home/Insert", function(res) {
        console.log(res);
        var json = JSON.parse(res);
        $("#test").html(json.Message) ;
    });
    $.get("/Home/Update", function(res) {
        console.log(res);
        var json = JSON.parse(res);
        $("#test2").html(json.Message);
    });

再起航,我的学习笔记之Javascript设计模式28(委托模式)

如果模块数量过多,我们这种请求方式,既会造成我们资源的浪费,如果用户网络不好,还会造成漫长的等待,这个时候我们就可以使用委托模式把这些请求打包,委托以另一个对象发送,当得到相应数据时在通过委托对象拆包数据分发给各个方法。

var Entrust= {
        Insert:function(res) {
           console.log(res);
           var json = JSON.parse(res);
           $("#test").html(json.Message) ;
        },
        Update:function(res) {
           console.log(res);
           var json = JSON.parse(res);
           $("#test2").html(json.Message) ;
        }
    }

    $.get("/Home/Entrust", function(res) {;
        var json = JSON.parse(res);
        console.log(json);
        Entrust["Insert"] && Entrust["Insert"](json.Insert);
        Entrust["Update"] && Entrust["Update"](json.Update);
    });

好了现在我们就可以通过一个请求完成之前多个请求所要完成的事情,既节省了流量又节省了时间上的开销。
再起航,我的学习笔记之Javascript设计模式28(委托模式)

总结

委托模式是通过委托者将请求委托给被委托者去处理实现的。因此委托模式解决了请求与委托者之间的耦合。通过被委托者对接收到的请求的处理后,分发给相应的委托者去处理。

也谢谢大家看到这里:)如果你觉得我的分享还可以请点击推荐,分享给你的朋友让我们一起进步~

好了以上就是本次分享的全部内容,本次示例参考自Javascript设计模式一书,让我们一点点积累一点点成长,希望对大家有所帮助。

欢迎转载,转载请注明作者,原文出处。


推荐阅读
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
author-avatar
amroc_394
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有