zoukankan      html  css  js  c++  java
  • 限制textarea 文本框的长度(收集了几个办法)

    文章参考地址:http://blog.csdn.net/nhconch/article/details/4223076

    需求背景:

    前几天,因为客户有一个需求说,需要对一个评论(一个textarea文本框)的长度进行限制,简单的理解就是 这个文本框只能输入100个字符,然后就不能在输入了!

    实现方案一:用maxlength属性

     <textarea maxlength="10"></textarea>

    这个方式很简单的哦,但是 在我这边测试的时候,并不能完全兼容主流浏览器

    兼容性效果如下:

    IE8 Firefox 17 Chrome 23
    不兼容 兼容 兼容

    实现方案二:用javascript实现

    <textarea name="txt1" cols="45" rows="2" onKeyDown='if (this.value.length>=20){event.returnValue=false}'></textarea>

    这里就用到了一个onKeyDown。但是效果也不太理想。

    兼容性效果如下:

    IE8 Firefox 17 Chrome 23
    兼容 不兼容 兼容

    实现方案三:综合上面的方法

    因为上面无法兼容IE 和firefox,没办法,只能贱一点了!~所以,我就把上面的方法给综合起来~~

    代码如下:

     <textarea name="txt1" cols="45" maxlength="20" rows="2"  onKeyDown='if (this.value.length>=20){event.returnValue=false}'>b</textarea>

    注意哦,我只是把maxlength加上了!

    兼容性效果如下:

    IE8 Firefox 17 Chrome 23
    兼容 兼容 兼容

    原因很简单,maxlength是对firefox和chrome兼容,而那js代码是对IE 兼容。所以就ok啦!!我把

    嘻嘻。。那天因为要提交这个ticket 所以急着交咯,反正客户那边通过啦。。哇哇哇。。

    实现方案四:JavaScript的substring

     <textarea name="blogdesc" cols="50" rows="5" onkeyup="limitLength(this,20)">x </textarea>  

    js 代码:

    复制代码
    function limitLength(obj, length) {
                var desc = obj.value;
                obj.value = substr(obj.value, length);
            }
            function substr(str, length) {
                var l = 0, i = 0;
                while (l < length && i < str.length) {
                    l += 1;
                    if (str.substring(i, i + 1).match(/[u4e00-u9fa5]/)) l += 2; //一个中文是相当于3个英文   
                    i += 1;
                }
                return str.substring(0, i);
            }  
    复制代码

     

    兼容性效果如下:

    IE8 Firefox 17 Chrome 23
    兼容 兼容 兼容

     

    但是,其实这个虽然上面三个都兼容,但是有一个很不友好的问题是,当你达到字符限制的时候,它还会打出来,直到你松开按键的时候就好了。不过,这个时候 会有闪一下把后面多余的字符给删除了!~。不太友好哦!~亲。

    实现方案五:JavaScript

     <textarea maxlength="10" onpropertychange="onmyinput(this)" oninput="return onmyinput(this)"
            onpaste="return onmypaste(this);" onkeypress="return onmykeypress(this);"></textarea>

    js代码是:

    复制代码
    function onmyinput(o) {
                if (o.value.length >= o.getAttribute("maxlength")) {
                    if (o.value.length > o.getAttribute("maxlength"))
                        o.value = o.value.substring(0, o.getAttribute("maxlength"));
                    return false;
                }
                return true;
            }
            function mygetclipdata() {
                if (!document.all) {
                    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
                    var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
                    var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
                    trans.addDataFlavor('text/unicode');
                    var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
                    clip.getData(trans, clip.kGlobalClipboard);
                    var str = new Object();
                    var strLength = new Object();
                    trans.getTransferData("text/unicode", str, strLength);
                    if (str)
                        str = str.value.QueryInterface(Components.interfaces.nsISupportsString);
                    var pastetext;
                    if (str)
                        pastetext = str.data.substring(0, strLength.value / 2);
                    return pastetext;
                }
                else {
                    return window.clipboardData.getData("Text");
                }
            }
            function mysetclipdata(o) {
                if (!document.all) {
                    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
                    var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
                    var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
                    trans.addDataFlavor("text/unicode");
                    var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
                    str.data = o;
                    trans.setTransferData("text/unicode", str, o.length * 2);
                    var clipid = Components.interfaces.nsIClipboard;
                    clip.setData(trans, null, clipid.kGlobalClipboard);
                }
                else {
                    window.clipboardData.setData("Text", o);
                }
            }
            function onmypaste(o) {
                var nMaxLen = o.getAttribute ? parseInt(o.getAttribute("maxlength")) : "";
                if (!document.all) {
                    alert("不可能执行的代码");
                }
                else {
    
                    if (document.selection.createRange().text.length > 0) {
                        var ovalueandclipboarddata = o.value + window.clipboardData.getData("Text");
                        if (o.getAttribute && ovalueandclipboarddata.length - document.selection.createRange().text.length > nMaxLen) {
                            if (window.clipboardData.getData("Text").substring(0, document.selection.createRange().text.length + nMaxLen - o.value.length) != "")
                                window.clipboardData.setData("Text", window.clipboardData.getData("Text").substring(0, document.selection.createRange().text.length + nMaxLen - o.value.length));
                            else
                                return false;
                        }
                    }
                    else {
                        var ovalueandclipboarddata = o.value + window.clipboardData.getData("Text");
                        if (o.getAttribute && ovalueandclipboarddata.length > nMaxLen) {
                            if (ovalueandclipboarddata.substring(0, nMaxLen - o.value.length) != "")
                                window.clipboardData.setData("Text", ovalueandclipboarddata.substring(0, nMaxLen - o.value.length));
                            else
                                return false;
                        }
                    }
                    return true;
                }
            }
            function onmykeypress(o) {
                if (!document.all) {
                    var nMaxLen = o.getAttribute ? parseInt(o.getAttribute("maxlength")) : "";
    
                    if (onmykeypress.caller.arguments[0].ctrlKey == true) {
                        if (onmykeypress.caller.arguments[0].which == 118) {
    
                            if (o.selectionStart < o.selectionEnd) {
                                var ovalueandclipboarddata = o.value + mygetclipdata();
                                if (o.getAttribute && (ovalueandclipboarddata.length - o.selectionEnd + o.selectionStart > nMaxLen)) {
                                    if (mygetclipdata().substring(0, o.selectionEnd - o.selectionStart + nMaxLen - o.value.length) != "")
                                        mysetclipdata(mygetclipdata().substring(0, o.selectionEnd - o.selectionStart + nMaxLen - o.value.length));
                                    else
                                        return false;
                                }
                            }
                            else {
                                var ovalueandclipboarddata = o.value + mygetclipdata();
                                if (o.getAttribute && ovalueandclipboarddata.length > nMaxLen) {
                                    if (ovalueandclipboarddata.substring(0, nMaxLen - o.value.length) != "")
                                        mysetclipdata(ovalueandclipboarddata.substring(0, nMaxLen - o.value.length));
                                    else
                                        return false;
                                }
                            }
                            return true;
    
                        }
                    }
    
    
                    if (onmykeypress.caller.arguments[0].which == 0 || onmykeypress.caller.arguments[0].which == 8)
                        return true;
                    if (o.value.length >= o.getAttribute("maxlength")) {
                        if (o.selectionStart < o.selectionEnd)
                            return true;
                        if (o.value.length > o.getAttribute("maxlength"))
                            o.value = o.value.substring(0, o.getAttribute("maxlength"));
                        return false;
                    }
                    else
                        return true;
    
                }
                else {
                    if (document.selection.createRange().text.length > 0)
                        return true;
                    if (o.value.length >= o.getAttribute("maxlength"))
                        return false;
                    else
                        return true;
                }
            }
    复制代码
     
    IE8 Firefox 17 Chrome 23
    兼容 兼容 兼容
     
     
     
     
     
    有时候不是我们失去了目标,而是失去了方向。
  • 相关阅读:
    HashMap死循环造成CPU100%
    ArrayList升级为线程安全的List
    并发容器-ConncurrentHashMap
    并发容器-概览
    不可变性final
    CAS
    原子类-Adder累加器
    hue-使用mysql作为元数据库
    yhd日志分析(二)
    yhd日志分析(一)
  • 原文地址:https://www.cnblogs.com/871735097-/p/3670106.html
Copyright © 2011-2022 走看看