热门标签 | 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设计模式一书,让我们一点点积累一点点成长,希望对大家有所帮助。

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


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
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社区 版权所有