更新时间:2021-08-23 00:51:16
更新说明:重构控件, 新增监视器.
初始化
new WordCount(ele) // 可以为selector也可以为dom对象.(需要为input或textarea)`
或是设置dom上的 data-control 属性为 word-count, 将会自动初始化控件.
> 详情信息请查看源码.
发布时间:2018-12-16 12:28:10
这是一个由JavaScript编写而成的字数统计插件.
1. 自动更新字数统计显示位置随着你的输入.
2. 接近字数上限时当前字数会标红.
3. 自动改变输入框大小随着你的输入内容.
<sciprt src="./js/bootstrap.js"></script>
自动执行
<sciprt src="./js/app.js"></script>
字数统计控件
<sciprt src="./js/word-count-control.js"></script>
找到`<textarea></textarea>`标签的父容器并且添加`class="word-count"`与`data-max-length="200"`.
<div class="word-count" data-max-length="300" data-will-full="20"> <textarea></textarea> </div>
属性说明
| 属性 | 描述 | 数据类型 | 是否必须 |
| data-max-length | 设置允许字数上限 | 整形 | 是 |
| data-will-full | 设置当前输入字数与上限字数之间差值为多少时开启提醒, 若不设则使用默认值 | 整形 | 否 |
代码运行流程
** 文件使用顺序 bootstrap.js -> app.js -> word-count-control.js **
bootstrap.js中
当DOM结构加载完毕后执行以下的方法.
function __buildBootstrap () {
_JM = new Demo.App();
_JM.execute();
}app.js
初始化`Demo`对象并且赋值空对象给`controllers`属性
var Demo = {};
Demo.App = function () {
this.controllers = {};
};`Demo.controllers`可以理解为一个容器, 里面存放你写的每个不同功能的模块类, 并且会自动执行一些规定的方法.
可以通过如下方法取得对应模块
Demo.App.prototype.get = function(controller) {
return this.controllers[controller];
};自动执行类中相应的函数方法
Demo.App.prototype.execute = function() {
for (var className in Demo) {
if (className !== "App") {
// 实例化类并传入自身
var controller = new Demo[className](this);
this.controllers[className] = controller;
// 执行模块的execute方法
if (typeof controller.execute === "function") {
controller.execute();
}
// 执行模块的listen方法
if (typeof controller.listen === "function") {
controller.listen();
}
// 执行模块的focus方法
if (typeof controller.focus === "function") {
controller.focus();
}
// 快捷键操作(键盘操作)
if (typeof controller.keyboardShortcuts === "function") {
// 获取顶层文档
var topDocument = document;
if (window.self != window.top) {
topDocument = window.parent.document;
}
topDocument.onkeyup = document.onkeyup = function (e) {
e = e || window.event;
controller.keyboardShortcuts(e);
};
}
// 执行每个模块中以init开头的初始化函数
if (typeof this.controllers[className].init != 'undefined') {
for (var initName in this.controllers[className].init) {
this.controllers[className].init[initName]();
}
}
}
}
};word-count-control.js
获取模块容器并保存起来
Demo.WordCountControl = function (app) {
this.app = app;
};初始化`init`变量
Demo.WordCountControl.prototype.init = {};实现`listen`方法
Demo.WordCountControl.prototype.listen = function () {}自动引入`css`样式表
Demo.WordCountControl.prototype.init['Css'] = function () {
var headDom = document.querySelector('head');
var wordCountCss = document.createElement('link');
wordCountCss.setAttribute('rel', 'stylesheet');
wordCountCss.href = './css/word-count-control.css';
headDom.appendChild(wordCountCss);
}初始化控件的相关代码在此不做赘述, 比较简单.
这样的写法是我在阅读一个php的开源项目时学到的, 因为本人不是很熟悉前端的一些规范/架构什么的所以理解之后直接拿过来用, 这个控件算是一个练手之作, 前端我不是掌握的很好, 如果有什么需要改进的地方可以在下方留言评论.
三个js文件也可以使用nodejs中的glup组件进行压缩使用.
在此感谢写这个开源项目的大佬, 从里面我学到很多.