基于原生js实现滑块验证思考组件的封装
前言
本文具体的代码实现转载自_release
的原生JS封装拖动验证滑块你会吗?,大部分的代码实现来自原作者,本人基于原作者的实现加入了一些自己的思考,总结了一下封装一个组件常见的思路。
预览效果

最终使用
引入
<script src = "./slider.js"></script>
或者
import SliderTools from './slider.js'
初始化
<div class="slider-wrapper"></div>
<script>
var slider = new SliderTools({
el:document.querySelector('.slider-wrapper'),
complete:function(){
alert('验证成功啦!!!');
}
})
</script>
原生JS封装一个组件的常见步骤:
想要封装一个原生的JS组件库,我们常常无从下手,这时候最简单的办法就是先不去封装成库,而是只在页面中实现这个组件的功能。然后在这个功能实现的基础上进行代码抽离,实现封装。常见的封装组件的实现步骤如下:
闭包中封装一个类 类的参数统一化 类中执行init函数 其他功能的实现 导出类
接下来,我们就按照这个思路来封装一下这个滑块验证组件。
1. 闭包中封装一个类
我们将组件封装到闭包中,是为了避免组件受到全局变量的污染,或者污染全局变量。
// 闭包
(function(){
// SliderTools就是一个类,这里我们没有使用ES6中的Class
function SliderTools(options){
// 暂时没有代码
}
})()
闭包中的类就是用来实现这个组件的全部功能,通过原生js来实现组件,通常是将其功能挂载到类的实例上。
2. 类的参数统一化
我们知道要实现一个组件,必然需要支持参数的传递,我们需要给用户提供较多的参数进行个性化定制,但是用户可能并不会每个参数都传递,也就是说我们需要一些默认参数。因此,我们首先就需要对用户传入的参数和默认参数进行合并,甚至很多时候还需要对用户传入参数进行校验,比如要求用户传入对象,却传入了数组等等。这些都可以统称为参数的统一化。
function SliderTools(options){
// 默认参数
var defaultOptions = {
el: document.body,
complete:this.complete
};
// 合并参数
this.options = Object.assign({},defaultOptions,options);
}
3. 类中执行init函数
类在外界实例化时,必须进行初始化,也就是说必须提供一个入口来实现组件的功能,通常是定义一个init函数,初始化时就执行这个init函数,所有的功能都从init函数开始。
function SliderTools(options){
var defaultOptions = {
el: document.body,
complete:this.complete
};
this.options = Object.assign({},defaultOptions,options);
this.init(); // 初始化
this.diffX = 0;
this.flag = false; // 是否推动到最右侧
}
// 原型上挂载init函数
SliderTools.prototype.init = function(){
this.createSlider();
this.bindEvents();
}
4. 其他功能的实现
我们可以看到init函数中执行了createSlider函数和bindEvents函数,这些函数就是具体的组件功能函数了。一般想要封装一个组件,需要将HTML元素插入进来,将Css样式插入进来,将事件进行绑定等。这里的createSlider就是添加元素和添加样式。我们可以看下具体的实现:
SliderTools.prototype.createSlider = function(){
this.options.el.innerHTML = `
<div id="slider">
<div class="drag_bg"></div>
<div class="drag_text" onselectstart="return false;" unselectable="on">拖动滑块验证</div>
<div class="handler handler_bg"></div>
</div>
`;
util.addCss(
` #slider {position: relative;background-color: #e8e8e8;width: 300px;height: 34px;line-height: 34px;text-align: center;}
.slide_ok { color: #fff;}`
);
}
这里我们只是展示了部分样式,在封装组件的过程中,我们通常还会用到一些工具类函数,这些工具类函数用于帮助我们实现特定的功能,比如上面的util.addCss就是用来添加CSS样式。
5.导出类
到目前为止,如果我们已经实现了一个类的全部功能,那么我们需要将其导出才能进行使用。由于我们使用的是原生js,因此我们需要判断一下试运行在浏览器环境还是node.js环境,不同的环境导导出方式不同。
var root = (typeof self == 'object' && self.self == self && self) ||
(typeof global == 'object' && global.global == global && global) ||
this || {};
if (typeof exports != 'undefined' && !exports.nodeType) {
if (typeof module != 'undefined' && !module.nodeType && module.exports) {
exports = module.exports = SliderTools;
}
exports.SliderTools = SliderTools;
} else {
root.SliderTools = SliderTools;
}
总结
本文基于原生JS实现一个滑动验证(具体实现不是目的),总结了原生JS封装一个组件的常见步骤,主要包括:
闭包中封装一个类 类的参数统一化 类中执行init函数 其他功能的实现 导出类
以后我们自己再进行组件封装,就可以按照这些步骤照葫芦画瓢。掌握一个组件的实现不是目的,关键是掌握一系列方法论,举一反三。
完整的滑块验证组件实现源码可以查看:原生JS实现滑块验证