zoukankan      html  css  js  c++  java
  • js 控制输入文字个数(换行不算)

    如题,换行符在textarea中是要当成一个字符的。用普通的maxlength属性就不行了,于是想到通过事件来控制输入文字的长度。

    注意哦,回车换行不能算成字符。这样的话,普通的substring等方法可能都不适用,要考虑文字中的换行符。

    目前的实现如下,还有不完美的地方。如drag事件没有考虑。

    <html>
    <head>
    </head>
    <body>
        <p>
            textArea2
        </p>
        <textarea id='txtArea2' data-maxlength=10 cols='50' rows='10'></textarea>
        <script>
    
                            var txtArea2 = document.getElementById("txtArea2");
                txtArea2.onkeydown = function(e) {
                    var maxlength = this.getAttribute("data-maxlength");
    
                    var selectionText = this.value.substring(this.selectionStart, this.selectionEnd);
                    var selectionCnt = getLength(selectionText);
    
                    if (getLength(this.value) - selectionCnt >= maxlength) {
                    // 退格键,回车键,删除键,上下左右键
                        if (! (e.keyCode == 8 || e.keyCode == 13 || e.keyCode == 46 || (e.keyCode >= 37 && e.keyCode <= 40))) {
                            e.preventDefault();
                        }
                    }
    
                }
    
                txtArea2.oninput = function() {
                // 只要有输入,就会触发,包括日语输入法,这个事件不能去
                    var txtArea = this;
                    var maxlength = txtArea.getAttribute("data-maxlength");
                    txtArea.value = txtArea.value.substr(0, maxlength);
                }
    
                txtArea2.onpaste = function(e) {
                    // 粘贴事件,只对应chorme。IE的话用window.clipboardData
                    var clipboardData = e.clipboardData;
                    var data = clipboardData.getData('Text');
                    if (data != '') {
                        var part1 = this.value.substring(0, this.selectionStart);
                        var part2 = this.value.substring(this.selectionStart, this.selectionEnd);
                        var part3 = this.value.substring(this.selectionEnd);
    
                        var maxlength = this.getAttribute("data-maxlength");
    
                        var allowlength = maxlength - getLength(part1) - getLength(part3);
                        var pasteData = data.substr(0, allowlength);
                        var newStr = part1 + pasteData + part3;
                        this.value = newStr;
                        this.selectionStart = this.selectionEnd = part1.length + pasteData.length;
                        console.log(newStr);
                        e.preventDefault();
                    }
                }
    
                // 字符统计函数(回车换行算字符)
                function getLength(input) {
                    input = input || '';
                    input = input.replace(/
    /g, '');
                    return input.length;
                }
        </script>
    </body>
    
    </html>

    上面的只是测试用的,没有包装成通用方法。不过效果已经实现了。

    在此记录一下,有空再来完善一下。

    测试环境:chorme。

    IE未测试。

  • 相关阅读:
    Unity3d:Unknown type 'System.Collections.Generic.CollectionDebuggerView'1
    Unity3d:The requested item has been unloaded
    installshield 注册dll
    sql查找字符串是否包含字符
    asp获取勾选checkbox的值
    Pyqt5.2.1生成的.ui文件转换成.py
    scrapy爬虫的编写步骤
    IBM MQ 集成CXF 发送JMS 消息
    io输出流变为输入流
    hibernate flush clear的区别
  • 原文地址:https://www.cnblogs.com/xiashengwang/p/6946280.html
Copyright © 2011-2022 走看看