最近想写一个类型微博的文本域,能实现字数计算的功能。发现用键盘事件可以实现,但是一旦使用鼠标右键在文本域粘贴后,字数就不能更新了。但是看到新浪、腾讯的输入框在用鼠标粘贴的时候,依旧能更新字数。
求高手指点一下思路,我觉得可以使用循环一直判断,不知道有没有更好的方法?

解决方案 »

  1.   

    IE6,7,8绑定 propertychange 事件。
    IE9绑定 keydown, cut, input 事件。(propertychange,input事件在IE9下有BUG)
    其他浏览器绑定 input 事件。
    例如你实现了兼容浏览器的事件绑定方法 addEvent ,那么针对IE外的浏览器这样绑定事件:
    addEvent(node, 'input', function(evt){
       //do somthing
    });由于事件的激发非常频繁,你还要设计一个事件缓存机制延迟并定时计算字数。
      

  2.   

    <script type="text/javascript">
    function init(){
    var a=document.getElementById("test");
    a.onkeyup=count;
    a.onmouseover=count;
    a.onmouseout=count;
    }
    function count(){
    var a=document.getElementById("test").value.length;
    document.getElementById("div").innerHTML=a;
    }
    window.onload=init;
    </script>
    </head><body>
    <textarea id="test"></textarea>
    <div id="div"></div>
    </body>这样试试
      

  3.   

    onchange onpaste 然后加上健盘事件
      

  4.   

    onpaste onpaste byteLength = function(b) { 
    if (typeof b == "undefined") { 
    return 0 

    var a = b.match(/[^\x00-\x80]/g); 
    return (b.length + (!a ? 0 : a.length)) 
    }; return function(q, g) { 
    g = g || {}; 
    g.max = g.max || 140; 
    g.min = g.min || 41; 
    g.surl = g.surl || 20; 
    var p = trim(q).length; 
    if (p > 0) { 
    var j = g.min, 
    s = g.max, 
    b = g.surl, 
    n = q; 
    var r = q.match(/(http|https):\/\/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-A-Z0-9a-z\$\.\+\!\_\*\(\)\/\,\:;@&=\?~#%]*)*/gi) || []; 
    var h = 0; 
    for (var m = 0, 
    p = r.length; m < p; m++) { 
    var o = byteLength(r[m]); 
    if (/^(http:\/\/t.cn)/.test(r[m])) { 
    continue 
    } else { 
    if (/^(http:\/\/)+(weibo.com|weibo.cn)/.test(r[m])) { 
    h += o <= j ? o: (o <= s ? b: (o - s + b)) 
    } else { 
    h += o <= s ? b: (o - s + b) 


    n = n.replace(r[m], "") 

    return Math.ceil((h + byteLength(n)) / 2)byteLength = function(b) { 
    if (typeof b == "undefined") { 
    return 0 

    var a = b.match(/[^\x00-\x80]/g); 
    return (b.length + (!a ? 0 : a.length)) 
    }; return function(q, g) { 
    g = g || {}; 
    g.max = g.max || 140; 
    g.min = g.min || 41; 
    g.surl = g.surl || 20; 
    var p = trim(q).length; 
    if (p > 0) { 
    var j = g.min, 
    s = g.max, 
    b = g.surl, 
    n = q; 
    var r = q.match(/(http|https):\/\/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-A-Z0-9a-z\$\.\+\!\_\*\(\)\/\,\:;@&=\?~#%]*)*/gi) || []; 
    var h = 0; 
    for (var m = 0, 
    p = r.length; m < p; m++) { 
    var o = byteLength(r[m]); 
    if (/^(http:\/\/t.cn)/.test(r[m])) { 
    continue 
    } else { 
    if (/^(http:\/\/)+(weibo.com|weibo.cn)/.test(r[m])) { 
    h += o <= j ? o: (o <= s ? b: (o - s + b)) 
    } else { 
    h += o <= s ? b: (o - s + b) 


    n = n.replace(r[m], "") 

    return Math.ceil((h + byteLength(n)) / 2) 
    } else { 
    return 0 byteLength = function(b) { 
    if (typeof b == "undefined") { 
    return 0 

    var a = b.match(/[^\x00-\x80]/g); 
    return (b.length + (!a ? 0 : a.length)) 
    }; return function(q, g) { 
    g = g || {}; 
    g.max = g.max || 140; 
    g.min = g.min || 41; 
    g.surl = g.surl || 20; 
    var p = trim(q).length; 
    if (p > 0) { 
    var j = g.min, 
    s = g.max, 
    b = g.surl, 
    n = q; 
    var r = q.match(/(http|https):\/\/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-A-Z0-9a-z\$\.\+\!\_\*\(\)\/\,\:;@&=\?~#%]*)*/gi) || []; 
    var h = 0; 
    for (var m = 0, 
    p = r.length; m < p; m++) { 
    var o = byteLength(r[m]); 
    if (/^(http:\/\/t.cn)/.test(r[m])) { 
    continue 
    } else { 
    if (/^(http:\/\/)+(weibo.com|weibo.cn)/.test(r[m])) { 
    h += o <= j ? o: (o <= s ? b: (o - s + b)) 
    } else { 
    h += o <= s ? b: (o - s + b) 


    n = n.replace(r[m], "") 

    return Math.ceil((h + byteLength(n)) / 2) 
    } else { 
    return 0 
    } byteLength = function(b) { 
    if (typeof b == "undefined") { 
    return 0 

    var a = b.match(/[^\x00-\x80]/g); 
    return (b.length + (!a ? 0 : a.length)) 
    }; return function(q, g) { 
    g = g || {}; 
    g.max = g.max || 140; 
    g.min = g.min || 41; 
    g.surl = g.surl || 20; 
    var p = trim(q).length; 
    if (p > 0) { 
    var j = g.min, 
    s = g.max, 
    b = g.surl, 
    n = q; 
    var r = q.match(/(http|https):\/\/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-A-Z0-9a-z\$\.\+\!\_\*\(\)\/\,\:;@&=\?~#%]*)*/gi) || []; 
    var h = 0; 
    for (var m = 0, 
    p = r.length; m < p; m++) { 
    var o = byteLength(r[m]); 
    if (/^(http:\/\/t.cn)/.test(r[m])) { 
    continue 
    } else { 
    if (/^(http:\/\/)+(weibo.com|weibo.cn)/.test(r[m])) { 
    h += o <= j ? o: (o <= s ? b: (o - s + b)) 
    } else { 
    h += o <= s ? b: (o - s + b) 


    n = n.replace(r[m], "") 

    return Math.ceil((h + byteLength(n)) / 2) 
    } else { 
    return 0 
    } byteLength = function(b) { 
    if (typeof b == "undefined") { 
    return 0 

    var a = b.match(/[^\x00-\x80]/g); 
    return (b.length + (!a ? 0 : a.length)) 
    }; return function(q, g) { 
    g = g || {}; 
    g.max = g.max || 140; 
    g.min = g.min || 41; 
    g.surl = g.surl || 20; 
    var p = trim(q).length; 
    if (p > 0) { 
    var j = g.min, 
    s = g.max, 
    b = g.surl, 
    n = q; 
    var r = q.match(/(http|https):\/\/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-A-Z0-9a-z\$\.\+\!\_\*\(\)\/\,\:;@&=\?~#%]*)*/gi) || []; 
    var h = 0; 
    for (var m = 0, 
    p = r.length; m < p; m++) { 
    var o = byteLength(r[m]); 
    if (/^(http:\/\/t.cn)/.test(r[m])) { 
    continue 
    } else { 
    if (/^(http:\/\/)+(weibo.com|weibo.cn)/.test(r[m])) { 
    h += o <= j ? o: (o <= s ? b: (o - s + b)) 
    } else { 
    h += o <= s ? b: (o - s + b) 


    n = n.replace(r[m], "") 

    return Math.ceil((h + byteLength(n)) / 2) 
    } else { 
    return 0 


    })(); 详细出处参考:http://www.jb51.net/article/28130.htm

    })(); 详细出处参考:http://www.jb51.net/article/28130.htm

    })(); 详细出处参考:http://www.jb51.net/article/28130.htm


    })(); 详细出处参考:http://www.jb51.net/article/28130.htm 
    } else { 
    return 0 


    })(); 详细出处参考:http://www.jb51.net/article/28130.htm