当前位置: 首页 > Web前端 > HTML5

一篇文章教你开发一个完整的JavaScript组件

时间:2023-04-04 23:51:31 HTML5

作为开发者,大家应该都知道浏览器中有一些内置的控件:Alert、Confirm等,但是这些控件通常会根据浏览器厂商的不同而有所不同但形状各异,视觉效果往往达不到UI设计师的要求。更重要的是,这种内置控件的风格很难与风格各异的各种互联网产品的设计风格统一。因此,优秀的前端开发者各自开发自己的个性化控件来替代浏览器内置的这些控件。当然,这种优秀的组件在网上已经数不胜数。写这篇文章的目的不是为了展示我开发的组件有多好,也不是为了炫耀。众多开发者相互交流,相互学习,共同进步。好了,废话少说,言归正传。功能介绍替换浏览器自带的Alert和Confirm控件。自定义界面风格与内置控件基本一致。效果预览1、Alert控件2、Confirm控件开发流程1.组件结构设计首先来看内置组件基本用法:1alert("内置Alert控件");2if(confirm("Turnoff内置的Confirm控件?”)){3alert("True");4}else{5alert("False");6}为了保证我们的组件使用与内置控件一致,我们必须考虑覆盖内置控件。考虑到组件开发风格统一、易用易维护、面向对象的特点,我打算将自定义的alert和confirm方法作为一个类(Winpop)的实例方法,最后使用实例方法来覆盖系统的内置控件。方法。为了达到目的,我的基本做法如下:1varobj=newWinpop();//创建Winpop的实例对象2//覆盖警告控件3window.alert=function(str){4obj.alert.call(obj,str);5};6//覆盖确认控件7window.confirm=function(str,cb){8obj.confirm.call(obj,str,cb);9};//这里跟大家推荐一个前端全栈开发交流圈:619586920突破技术瓶颈,提升思维能力。需要注意的是,由于浏览器内置的控件可以阻止浏览器的其他行为,我们的自定义组件是不具备这个能力的。尽可能统一,在预览中可以看到,我们在弹出自定义组件时使用了全屏半透明遮罩层。也正是因为以上原因,confirm组件的使用也略有调整,从内置的返回布尔值的方法改为使用回调函数的方法来保证“OK”和“Cancel”"可以正确添加逻辑。因此,自定义组件的用法变为如下形式:1alert("CustomAlertcomponent");2confirm("ClosethecustomConfirmcomponent?",function(flag){3if(flag){4alert("True");5}else{6alert("False");7}//这里我推荐前端全栈开发交流圈:619586920突破技术瓶颈,提升思维能力8});2.组件代码设计在正式介绍Winpop组件的代码之前,我们先看一下一个Javascript组件的基本结构:1(function(window,undefined){2functionJsClassName(cfg){3varconfig=cfg||{};4this.get=function(n){5returnconfig[n];6}7this.set=function(n,v){8config[n]=v;9}10this.init();11}12JsClassName.prototype={13init:function(){},14otherMethod:function(){}15};//这里推荐一个前端全栈开发交流圈:619586920突破技术瓶颈,提高思维能力16window.JsClassName=window.JsClassName||JsClassName;17})(window);使用一个自执行的匿名函数来包装我们的组件代码,尽可能的减少全局污染,最后我们的类附加到全局的window对象上,这是一个推荐的做法。构造函数中的get和set方法不是必须的,只是作者个人习惯而已。感觉这样写可以统一缓存和读取配置参数和其他组件内部全局变量的调用方法,看起来更面向对象。欢迎读者谈谈自己的想法,谈谈这样写好不好。这次给大家推荐一个免费的学习圈,总结了移动应用网站开发,css,html,webpack,vuenodeangular,面试资源。获取信息???对web开发技术感兴趣的同学欢迎加裙子:???582735936???,不管你是小白还是大牛我都欢迎,还有大牛整理的一套高效学习路线和教程免费分享给你,视频资料每天更新。接下来我们看一下Winpop组件的完整代码:1(function(window,jQuery,undefined){23varHTMLS={4ovl:'

'+''+'
'+'
'+'
',5警报:'',6确认:''+''7}89functionWinpop(){10varconfig={};11this.get=function(n){12returnconfig[n];13}1415this.set=function(n,v){16config[n]=v;17}18this.init();19}//这里推荐一个前端全栈开发交流圈:619586920突破技术瓶颈,提升思维能力2021Winpop.prototype={22init:function(){23this.createDom();24this.bindEvent();25},26createDom:function(){27varbody=jQuery("body"),28ovl=jQuery("#J_WinpopBox");2930if(ovl.length===0){31body.append(HTMLS.ovl);32}3334this.set("ovl",jQuery("#J_WinpopBox"));35this.set("mask",jQuery("#J_WinpopMask"));36},37bindEvent:function(){38var_this=this,39ovl=_this.get("ovl"),40mask=_this.get("mask");41ovl.on("click",".J_AltBtn",function(e){42_this.hide();43});44ovl.on(“点击”,“.J_CfmTrue”,函数(e){45varcb=_this.get(“confirmBack”);46_this.hide();47cb&&cb(真);48});49ovl。on("click",".J_CfmFalse",function(e){50varcb=_this.get("confirmBack");51_this.hide();52cb&&cb(false);53});54mask.on("点击",function(e){55_this.hide();56});57jQuery(document).on("keyup",function(e){58varkc=e.keyCode,59cb=_this.get("confirmBack");;60if(kc===27){61_this.hide();62}elseif(kc===13){63_this.hide();64if(_this.get("type")==="confirm"){65cb&&cb(true);66}67}68});69},70alert:function(str,btnstr){71varstr=typeofstr==='string'?str:str.toString(),72ovl=this.get("ovl");73this.set("类型","警报");74ovl.find(".J_WinpopMain").html(海峡);75if(typeofbtnstr=="undefined"){76ovl.find(".J_WinpopBtns").html(HTMLS.警报);77}else{78ovl.find(".J_WinpopBtns").html(btnstr);79}//这里推荐一个前端全栈开发交流圈:619586920突破技术瓶颈,提升思维能力80this.show();81},82confirm:function(str,callback){83varstr=typeofstr==='string'?str:str.toString(),84ovl=this.get("ovl");85this.set("类型","确认");86ovl.find(".J_WinpopMain").html(海峡);87ovl.find(".J_WinpopBtns").html(HTMLS.确认);88this.set("confirmBack",(回调||函数(){}));89这个.show();90},91显示:function(){92this.get("ovl")。展示();93this.get("掩码").show();94},95隐藏:function(){96varovl=this.get("ovl");97ovl.find(".J_WinpopMain").html("");98ovl.find(".J_WinpopBtns").html("");99ovl.隐藏();100this.get("mask").hide();101},102destroy:function(){103this.get("ovl").remove();104this.get("mask").remove();105deletewindow.alert;106deletewindow.confirm;107}108};109110varobj=newWinpop();111window.alert=function(str){112obj.alert.call(obj,str);113};114window.confirm=function(str,cb){115obj.confirm.call(obj,str,cb);116};117})(window,jQuery);代码略多,重点如下说明:作者偷懒,用了jQuery。在使用之前,请确保jQuery自定义组件结构已经引入并最终追??加到body中。所以在引入上面的js之前,请确保已经加载了文档,并且已经添加了组件。注意:虽然本例中没有使用destroy方法,但读者可以注意该方法中的deletewindow.alert和deletewindow.confirm。组件销毁后,将Alert和Confirm控件恢复为浏览器内置效果组件。最后,如果加上window.Winpop=Winpop,就可以将该对象全球化,供其他类调用。最后,作为一名前端开发工程师,我个人认为Javascript组件开发是一件非常有趣的事情,其中??的乐趣只有亲自尝试才能体会。前端组件的开发,往往需要Javascript、CSS、html的配合才能达到事半功倍的效果。上面提到的Winpop也不例外。这次给大家推荐一个免费的学习圈,总结了移动应用网站开发,css,html,webpack,vuenodeangular,面试资源。获取信息???对web开发技术感兴趣的同学欢迎加裙子:???582735936???,不管你是小白还是大牛我都欢迎,还有大牛整理的一套高效学习路线和教程免费分享给你,视频资料每天更新。最后祝大家早日学业有成,拿到满意的offer,快速升职加薪,走上人生巅峰。