前端小白之每天学习记录----js简单的组件封装

设计模式:是解决问题的模板

关于设计模式,可以阅读汤姆大叔的博文http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html

这里简单介绍两种设计模式:

1.单例模式:单例就是保证一个类只有一个实例

      eg:在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象字面量的方法,其字面量里可以包含大量的属性和方法:

var people = {
    name: "lxb",
    age: "22",
    eat: function () {
        console.log(‘eat‘);
    }
};

  

2.工厂模式:建造类型的模式, 重点是创造对象

      eg:可以创建许多有相同属性,属性的值不同的对象:

function CreateObj( name, age ){
        var obj = new Object();
        obj.name = name;
        obj.age = age;
        return obj;
    }

    var o1 = CreateObj( xx, xx );
    var o2 = CreateObj( xx, xx );

组件:许多插件组合在一起

想要封装组件,首先要先搭建插件

比如现在我们要搭建一个警告框插件

警告框插件:

1.整体架构准备

第一步:定义一个警告框构造函数

第二步:给这个构造函数加上方法

    方法1:显示警告框

    方法2:隐藏警告框

第三步:把构造函数实例化,并调用显示方法显示警告框

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
        //第一步:定义一个警告框构造函数
        var popAlert = function (opt) {  //opt参数为外部可定制参数集合
            this.opt = opt || {};   //未传参时默认为空
        }       //第二步:
        //显示警告框
        popAlert.prototype.show = function () {
            var oDiv = document.createElement("div"); //新建一个div
            oDiv.setAttribute(‘class‘, ‘alert‘);    //为div添加类名alert
            document.body.appendChild(oDiv);    //把div输出到body
        }
        //隐藏警告框
        popAlert.prototype.hide = function () {

        }     第三步:
        //测试:F12查看
        window.onload = function () {
            var oAlertSuccess = new popAlert(); //实例化
            oAlertSuccess.show();//显示
        }
    </script>
</head>

<body>

</body>

</html>

以上代码会在body创建一个div

2.警告框插件完成

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- 从bootstrap复制的警告款样式 -->
     <!-- <link rel="stylesheet" href="./css/layout.css">  -->
    <!-- 或者直接用bootstrap样式 -->
     <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css">
    <script>
        //定义一个警告框构造函数
        var popAlert = function (opt) {
            this.opt = opt || {};
        }
        //显示警告框
        popAlert.prototype.show = function () {
            //新建div
            var oDiv = document.createElement("div"),
                    that = this, //that 保存构造函数构造的实例对象
                    aClose;
            //添加类名
            this.opt[‘class‘]?// 判断有无外部参数class
            oDiv.classList.add( ‘alert‘, this.opt[‘class‘])
            :oDiv.classList.add( ‘alert‘,"alert-info");//外部没有传参数用默认的
            //为div添加内容
            oDiv.innerHTML = "<a href=‘javascript:;‘ class=‘close‘>x</a>"; //添加一个x的关闭标志
            oDiv.innerHTML += this.opt[‘content‘] || ‘请添加内容‘; //添加外部指定内容
            //把div输出到body下
            document.body.appendChild(oDiv);
            // 为所有x关闭标志绑定点击事件(重复遍历,在后面会改正)
            aClose = document.querySelectorAll(".alert > .close");
            aClose.forEach(function( ele ){
                ele.addEventListener( ‘click‘, function(){
                    that.hide( this.parentNode );  //用构造函数的隐藏方法隐藏点击的关闭标志的父节点(即整个警告框)
                });
            });
        }
        //隐藏警告框
        popAlert.prototype.hide = function ( obj ) {
            obj.style.display = ‘none‘;
        }
         //测试:
        window.onload = function () {
               var oAlertkong = new popAlert();
            oAlertkong.show();

            var oAlertkong2 = new popAlert({
                content: ‘这是默认样式‘,
                // class: ‘alert-success‘
            });
            oAlertkong2.show();

            var oAlertSuccess = new popAlert({
                content: ‘这是成功提示‘,
                class: ‘alert-success‘
            });
            oAlertSuccess.show();

            var oAlertWarning = new popAlert({
                content: ‘这是警告提示‘,
                class: ‘alert-warning‘
            });
            oAlertWarning.show();

            var oAlertInfo = new popAlert({
                content: ‘这是信息提示‘,
                class: ‘alert-info‘
            });
            oAlertInfo.show();

            var oAlertDanger = new popAlert({
                content: ‘这是危险提示‘,
                class: ‘alert-danger‘
            });
            oAlertDanger.show();
        }
    </script>
</head>

<body>

</body>

</html>

3.把警告框插件(popAlert)封装在组件(module)里面

分装好的js部分(plugin.js):

; (function (window, undefined) {
    var module = {}; //定义组件
    //插件1
    var popAlert = function (opt) {
        this.opt = opt || {};
    }
    // 输出
    popAlert.prototype.show = function () {
        var oDiv = document.createElement("div"),
            that = this,
            aClose;
        this.opt[‘class‘] ?
            oDiv.classList.add(‘alert‘, this.opt[‘class‘])
            : oDiv.classList.add(‘alert‘, "alert-info");
        oDiv.innerHTML = "<a href=‘javascript:;‘ class=‘close‘>x</a>";
        oDiv.innerHTML += this.opt[‘content‘] || ‘请添加内容‘;
        document.body.appendChild(oDiv);
    // 绑定事件
        aClose = document.querySelectorAll(".alert > .close");
        aClose.forEach(function (ele) {
            ele.addEventListener(‘click‘, function () {
                that.hide(this.parentNode);
            });
        });
    }
    popAlert.prototype.hide = function (obj) {
        obj.style.display = ‘none‘;
    };

    module[‘popAlert‘] = popAlert; //为组件添加插件一
    window.module = module; //暴露组件到外部

})(window, undefined);

 测试输出的html部分:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- <link rel="stylesheet" href="./css/layout.css"> -->
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css">
    <script src="./js/plugin.js"></script>
    <script>
        //封装在plugin.js里面
        window.onload = function () {
            var oAlertSuccess = new module.popAlert({
                content: ‘这是成功提示‘,
                class: ‘alert-success‘
            });
            oAlertSuccess.show();

            var oAlertWarning = new module.popAlert({
                content: ‘这是警告提示‘,
                class: ‘alert-warning‘
            });
            oAlertWarning.show();

            var oAlertInfo = new module.popAlert({
                content: ‘这是信息提示‘,
                class: ‘alert-info‘
            });
            oAlertInfo.show();

            var oAlertDanger = new module.popAlert({
                content: ‘这是危险提示‘,
                class: ‘alert-danger‘
            });
            oAlertDanger.show();
        }
    </script>
</head>

<body>

</body>

</html>

模态框插件+警告框插件:(新建plugin2.js)

; (function (window, undefined) {
    var module = {};//定义组件
    //插件1:警告框
    var popAlert = function (opt) {
        this.opt = opt || {};
    };
    popAlert.prototype.show = function () {
        var oDiv = document.createElement("div"),
            that = this,
            aClose;
        this.opt[‘class‘] ?
            oDiv.classList.add(‘alert‘, this.opt[‘class‘])
            : oDiv.classList.add(‘alert‘, "alert-info");
        oDiv.innerHTML = "<a href=‘javascript:;‘ class=‘close‘>x</a>";
        oDiv.innerHTML += this.opt[‘content‘] || ‘请添加内容‘;
        document.body.appendChild(oDiv);
        var that = this;
        aClose = document.querySelectorAll(".alert > .close");
        aClose.forEach(function (ele) {
            ele.addEventListener(‘click‘, function () {
                that.hide(this.parentNode);
            });
        });
    };
    popAlert.prototype.hide = function (obj) {
        obj.style.display = ‘none‘;
    };
    //插件2:模态框
    var popModal = function (opt) {
        this.opt = opt || {};
    };
    //显示
    popModal.prototype.show = function () {
        var that = this;
        var modalHtml = "<div class=‘modal fade‘>";//进入的方式:飞入
        modalHtml += "<div class=‘modal-dialog‘>";//布局
        modalHtml += "<div class=‘modal-content‘>";//模态框盒子
        //标题
        modalHtml += "<div class=‘modal-header‘>";
        modalHtml += "<button type=‘button‘ class=‘close‘>x</button>";
        modalHtml += "<h4 class=‘modal-title‘>" + (this.opt[‘title‘] || ‘可定制title标题‘) + "</h4>"
        modalHtml += "</div>";
        //内容
        modalHtml += "<div class=‘modal-body‘>";
        modalHtml += this.opt[‘content‘] || ‘可定制content内容‘;
        modalHtml += "</div>";
        // 底部内容
        modalHtml += "<div class=‘modal-footer‘>";
        modalHtml += this.opt[‘footer‘] || ‘可定制footer底部内容‘;
        modalHtml += "</div>";
        //尾部标签
        modalHtml += "</div>";
        modalHtml += "</div>";
        modalHtml += "</div>";
        //按钮
        modalHtml += "<h2>";
        modalHtml += this.opt[‘tip‘] || "可定制tip提示信息";
        modalHtml += "</h2><button class=‘btn btn-primary btn-lg‘ data-toggle=‘modal‘ data-target=‘#myModal‘>";
        modalHtml += this.opt[‘btn‘] || "可定制btn按钮文本";
        //输出到bady
        var oldHTML = document.body.innerHTML;    //保存旧的文档
        document.body.innerHTML = oldHTML + modalHtml;//添加插件

        //绑定x点击事件 关闭框
        var that = this;
        var oClose = document.querySelector(".modal .close")
        oClose.addEventListener("click", function () {
            that.hide(this);
        });
        //绑定显示事件
        var open = document.querySelector(".btn[data-toggle=modal]");
        open.onclick = function () {
            var oModal = document.querySelector(".modal");
            oModal.style.display = ‘block‘;
            oModal.classList.add(‘in‘);
            //遮罩层
            var backdrop = document.createElement("div"); //新建一个div
            backdrop.setAttribute(‘class‘, ‘modal-backdrop in‘);    //为div添加类名
            document.body.appendChild(backdrop);
        }
    }

    popModal.prototype.hide = function (obj) {
        var objParents = findNode(obj, "modal"); //当前.close的父辈元素 .modal
        objParents.style.display = ‘none‘;//隐藏模态
        document.body.removeChild(document.querySelector(".modal-backdrop"));
        // document.querySelector(".modal-backdrop").style.display = "none";
    }
    //公共的方法:
    //找到关闭按钮的指定父节点
    function findNode(obj, classname) {
        var aClass;
        var regExp = new RegExp(classname);
        while (obj = obj.parentNode) {
            aClass = Array.prototype.slice.call(obj.classList); //类数组--->数组
            if (aClass.length && regExp.test(aClass[0]) && aClass[0].length == 5) {
                break;
            }
        }
        return obj;
    }
    //把插件存入组件
    module = {
        popAlert: popAlert,
        popModal: popModal
    };

    window.module = module;//把组件暴露到外部

})(window, undefined);

 测试使用模态框:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css">
    <script src="./js/plugin2.js"></script>
    <script>
        window.onload = function () {
            var oModal = new module.popModal({
                // title: ‘你好‘,
                // content: ‘这是模态框的内容‘,
                // footer:"作者:你好啊",
                // tip:"下面这个按钮点一下",
                // btn:"点我啊"
            });
            oModal.show();
        }
    </script>
</head>

<body>
</body>
</html>

  

时间: 2024-07-31 14:35:23

前端小白之每天学习记录----js简单的组件封装的相关文章

前端小白之每天学习记录----php(2)数据库操作软件

数据库 存储数据的仓库(软件)(DBA:Database Administrator)数据库管理员mysqlsqlserveroracle...... 数据库软件架构 C(client)->S(server)用户<--->服务器 eg:腾讯qq, 金山杀毒软件,wps, office... B(Browser)->S(server)浏览器<-->服务器 eg:所有从浏览器打开的网站(应用) 存储数据的软件(我们用wps的表格来举例) wps           数据库

前端小白之每天学习记录----简单的原生js路由

路由: 根据不同的url 显示 不同的内容方法:hash(锚链接)实现路由history对象 1.首先要了解什么是hash,在这里你可以认为hash就是网址后面加上的 #/xxx 当<a>标签被点击时 <a href="#/html">ches</a>会在原网址后面加上<a>里面herf的内容,当该内容改变时,会产生一个事件 onhashchange 话不多说,直接上代码: <!DOCTYPE html> <html l

前端小白之每天学习记录----php(4)ajax

ajax技术( 异步请求 ) 局部无刷新技术: ajax技术不需要刷新页面就能得到服务器的结果, 所以增强了体验. 请求: 发送一次网络连接目的: 是为了获取服务器的数据 步骤: 第一步:要使用ajax技术, 必须要获取浏览器的ajax对象 通过浏览器内置的XMLHttpRequest 就可以得到ajax对象 第二步: 打开请求 open( 打开请求的方式, 请求的地址, true ) 第三步: 发送请求 send使用发送数据的,GET方式一般发送null, 因为get方式的数据是通过url地址

前端小白之每天学习记录----php(6)面向对象

php面向对象类: 一类共性事物的抽象 比如: eg:车子 共性:类的共性 eg:轮子.能动 对象:        类造出来的 eg:自行车, 滑板车, 小汽车, 卡车, 对象才是具体的产品,才能使用功能 1.php新建一个类,并实例化(实例化指的是用类新造一个对象): 定义方法:class 类名称 {} public: 属性修饰符: 用来控制 属性/方法 的访问权限 实例化对象:对象名 = new 类名(); <?php /* 定义一个类 class 类名称 { } 类是由n个属性和方法组成的

前端小白之每天学习记录----angula2--(1)

1.1 Angular的发展历史  1.1.1 angular起源 GetAngular ====>by Misko Hevery and Adam Abrons 开发效率高 AnguarJS 1.1.2 迭代之路 12年6月 AngularJS 1 ===>双向绑定.依赖注入.指令 AngularJS 1.3.x====>推出单次绑定语法 放弃ie8浏览器支持 AngularJS 1.5.x =====>增加了类似组件的书写体验 1.1.3 AngularJS 1.x困境 性能问

前端小白之每天学习记录----php(7)session与cookie

服务器端的会话技术(通讯协议) 坐地铁: 深圳通 拿手机刷 cookie( 保存在 客户端的浏览器里面的数据 ) session( 保存在 web服务器里面的数据 ) 如何使用cookie? 1.设置/注销cookie(新建cookie.php) <?php /* array( 'user' => 'ghostwu' ) */ // function setCookie(c_name,value,expiredays) // 变量名,值,过期天数 setcookie( "user&q

前端学习记录 JS DOM

HTML DOM 文档对象模型 被结构化为对象树 HTML DOM 方法是能在 HTML 元素上执行的动作 HTML DOM 属性是能够设置或改变 HTML 元素的值 查找 HTML 元素 document.getElementById(id) 通过元素 id 查找 document.getElementByTagName(name) 通过标签名查找 document.getElementByClassName(name) 通过类名查找元素 改变 HTML 元素 element.innerHTM

前端小白该如何学习?以及掌握哪些能力才能从事前端开发工程师

对于一些没有编程经验的人来说,一开始就学习 web 前端可能会让你觉得比较困难. 因为你的能力还处在初始阶段,你根本不知道你缺少哪方面的知识. 所以,在正式学习之初,你非常有必要先了解一下前端的能力模型. 前端工程师,都需要掌握哪些能力呢? 简单粗暴点,只需要掌握这张图里的能力就行了. 开个玩笑,新手的话,还是要循序渐进. LV1:学会制作静态页面(Web + Mobile) HTML.HTML5: 理解如何浏览和创建网页.基本的语法规范.常用标签及属性.网页之间的链接与跳转.标签节点层级节点.

web文件上传一学习记录 (简单的web浏览器可读文件的上传,servlet 文件上传)

文件上传:这里用得时表单上传的方式,表单上传到的时候 method一定指定为POST,enctype="multipart/form-data". 第一种方式,直接上传.读取.显示内容,并没有存储到服务器端. 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.g