自适应的字数统计插件(原创)

所属分类:输入-自动完成

 20469  307  查看评论 (7)
分享到微信朋友圈
X
自适应的字数统计插件(原创) ie兼容10

更新时间: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组件进行压缩使用.

在此感谢写这个开源项目的大佬, 从里面我学到很多.

相关插件-自动完成

长度单位转换插件Length.js

Length.js用于长度单位转换的JavaScript库
  自动完成
 24315  290

jq汉字转拼音

汉字转拼音
  自动完成
 32201  378

基于jQuery的分组(带组名输入联想和组数删减)

页面是源于一场王者荣耀大屏幕分组展示,带有组名输入的联想和组数删减
  自动完成
 18560  261

仿淘宝选择商品计算价格

同一个商品有不同的版本,最后选择后计算出价格
  自动完成
 36808  492

讨论这个项目(7)回答他人问题或分享插件使用方法奖励jQ币 评论用户自律公约

    文弱书生 0
    2021/11/25 9:02:17
    你好麻烦请教一下,编辑时候回显数据不计算,这个问题怎么解决呢
        夜幕下灬雪狼0
        2021/12/2 16:12:57
        是vue里面吗?
        夜幕下灬雪狼0
        2021/12/2 16:19:25
        如果是直接修改dom的value属性导致的变动可以使用以下代码手动触发一下input事件.

        let iEvent = new inputEvent('input');
        dom.dispatchEvent(iEvent);
    回复
    少吃辣 0
    2019/10/18 2:57:17
    man 0
    2019/2/9 1:30:14
    如果能固定高度加垂直滚动条,就更完美了,能感知文本粘贴后的字数变化,这里给个赞!
        夜幕下灬雪狼1
        2019/2/13 20:43:07
        其实我第一版是固定高度加垂直滚动条的, 后来由于显示问题就给改了.(主要是滚动的话字数展示的地方就不能放在输入框中了, 因为滚动会导致输入内容被遮挡).
    回复
    夜幕下灬雪狼 0
    2018/12/21 9:20:02
    沙发自己的~・・~~・~ 回复
😃
  • 😀
  • 😉
  • 😥
  • 😵
  • 😫
  • 😘
  • 😡
  • 👍
  • 🌹
  • 👏
  • 🍺
  • 🍉
  • 🌙
  • 💖
  • 💔
😃
  • 😀
  • 😉
  • 😥
  • 😵
  • 😫
  • 😘
  • 😡
  • 👍
  • 🌹
  • 👏
  • 🍺
  • 🍉
  • 🌙
  • 💖
  • 💔
取消回复