zoukankan      html  css  js  c++  java
  • JavaScript模拟QQ签名(HTML5 contenteditable属性)

    例图:

    一、思路

    1、单击元素时,使元素可以编辑,并获得焦点

    2、按下键盘检测用户编辑元素中的文本

    3、监听按下Enter键操作或离开可编辑元素焦点时,更新数据库

    二、代码

     1 $(function(){
     2     // return obj { length: 字节长度, limitStr: 限定的字符串(字节长度小于等于intVal) }
     3     function getStringByteInfo ( string, intVal ) {
     4         var str = $.trim(string) || '', length = str.length, len, reg, charStr, limitStr = '';
     5         if ( length > 0 ) {
     6             len = 0;
     7             reg = /[^x00-xff]/;  // 匹配双字节字符(包括汉字在内)
     8 
     9             for ( var i = 0; i < length; i++) {
    10                 charStr = str.charAt(i);
    11                 if ( reg.test(charStr) ) {
    12                     len += 2;
    13                 }
    14                 else {
    15                     len ++;
    16                 }
    17                 if (len <= intVal) {
    18                     limitStr += str.charAt(i);
    19                 }
    20             }
    21         }
    22         return {
    23             length: len || 0,
    24             limitStr: limitStr || ''
    25         }
    26     }
    27 
    28     // 检测文本字节长度
    29     function detectionLength ( jqObj ) {
    30         var $obj = jqObj || $(),
    31         str = $obj.text(),
    32         strObj = getStringByteInfo(str, 40);
    33 
    34         if (strObj.length > 40) {
    35             alert('最多只能输入40字节');
    36             $obj.text(strObj.limitStr);
    37         }
    38     }
    39 
    40     // 更新数据库
    41     function saveSignature ( jqObj ) {
    42         var $obj = jqObj || $(),
    43         str = $.trim($obj.text()),
    44         url = 'xxx?signature' + encodeURIComponent(str); // 假设这是发送ajax请求的url
    45 
    46         if (str != '' && str != '编辑个性签名') {
    47             $.ajax(url, {
    48                 dataType: 'json',
    49                 data: {},
    50                 success: function(){
    51                     // do something
    52                 },
    53                 error: function(){},
    54                 complete: function(){}
    55             });
    56         }
    57         else {
    58             $obj.text('编辑个性签名');
    59         }
    60     }
    61 
    62     // keyPress Liseners
    63     // 监听Enter键
    64     function enterLiseners ( jqObj, event ) {
    65         var $obj = jqObj || $(),
    66             code = event.keyCode || event.which;
    67 
    68         if (code === 13) {
    69             jqObj.removeAttr('contenteditable');
    70             saveSignature(jqObj);
    71         }
    72     }
    73 
    74     $('#signature')
    75     .bind('click', function(){
    76         $(this).attr('contenteditable', 'true').trigger('focus');
    77     })
    78     .bind('keydown', function(e){
    79         detectionLength($(this));
    80         enterLiseners($(this), e);  // 更新数据库
    81     })
    82     .bind('blur', function(){
    83         $(this).removeAttr('contenteditable');
    84         saveSignature($(this)); // 更新数据库
    85     })
    86 });

    三、完整实例

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>contenteditable</title>
    <style>
    body, p {
        margin: 0;
        padding: 0;
    }
    .layout-box {
        padding: 10px;
        width: 300px;
        height: 36px;
        margin: 50px auto;
        background-color: green;
        font-size: 0;
    }
    #signature,
    .layout-box:before {
        display: inline-block;
        vertical-align: middle;
    }
    .layout-box:before {
        content: '';
        width: 0;
        height: 100%;
        overflow: hidden;    
    }
    #signature {
        width: 100%;
        max-height: 36px;
        min-height: 18px;
        line-height: 18px;
        background-color: #FFF;
        font-size: 12px;
        color: #000;
        word-break: break-all;
    }
    #signature:focus {
        outline: none;
    }
    </style>
    <script src="http://code.jquery.com/jquery-1.10.2.js"></script>
    </head>
    
    <body>
    
    <div class="layout-box">
        <p id="signature">编辑个性签名</p>
    </div>
    
    <script>
    /*
    
    一、思路
    
    1、单击元素时,使元素可以编辑,并获得焦点
    2、按下键盘检测用户编辑元素中的文本
    3、监听按下Enter键操作或离开可编辑元素焦点时,更新数据库
    
    */
    
    $(function(){
        // return obj { length: 字节长度, limitStr: 限定的字符串(字节长度小于等于intVal) }
        function getStringByteInfo ( string, intVal ) {
            var str = $.trim(string) || '', length = str.length, len, reg, charStr, limitStr = '';
            if ( length > 0 ) {
                len = 0;
                reg = /[^x00-xff]/;  // 匹配双字节字符(包括汉字在内)
    
                for ( var i = 0; i < length; i++) {
                    charStr = str.charAt(i);
                    if ( reg.test(charStr) ) {
                        len += 2;
                    }
                    else {
                        len ++;
                    }
                    if (len <= intVal) {
                        limitStr += str.charAt(i);
                    }
                }
            }
            return {
                length: len || 0,
                limitStr: limitStr || ''
            }
        }
    
        // 检测文本字节长度
        function detectionLength ( jqObj ) {
            var $obj = jqObj || $(),
            str = $obj.text(),
            strObj = getStringByteInfo(str, 40);
    
            if (strObj.length > 40) {
                alert('最多只能输入40字节');
                $obj.text(strObj.limitStr);
            }
        }
    
        // 更新数据库
        function saveSignature ( jqObj ) {
            var $obj = jqObj || $(),
            str = $.trim($obj.text()),
            url = 'xxx?signature' + encodeURIComponent(str); // 假设这是发送ajax请求的url
    
            if (str != '' && str != '编辑个性签名') {
                $.ajax(url, {
                    dataType: 'json',
                    data: {},
                    success: function(){
                        // do something
                    },
                    error: function(){},
                    complete: function(){}
                });
            }
            else {
                $obj.text('编辑个性签名');
            }
        }
    
        // keyPress Liseners
        // 监听Enter键
        function enterLiseners ( jqObj, event ) {
            var $obj = jqObj || $(),
                code = event.keyCode || event.which;
    
            if (code === 13) {
                jqObj.removeAttr('contenteditable');
                saveSignature(jqObj);
            }
        }
    
        $('#signature')
        .bind('click', function(){
            $(this).attr('contenteditable', 'true').trigger('focus');
        })
        .bind('keydown', function(e){
            detectionLength($(this));
            enterLiseners($(this), e);  // 更新数据库
        })
        .bind('blur', function(){
            $(this).removeAttr('contenteditable');
            saveSignature($(this)); // 更新数据库
        })
    });
    
    </script>
    
    
    </body>
    </html>
    View Code
  • 相关阅读:
    CSS hack:针对IE6,IE7,firefox显示不同效果
    让IE6支持png24透明/半透明的方法
    IE8的css hack
    jQuery Mobile笔记三
    jQuery Mobile笔记二
    js常见面试题
    CSS3-transform3D
    CSS3-transform-style
    CSS3-媒体类型
    CSS3-盒模型-resize属性
  • 原文地址:https://www.cnblogs.com/yangjunhua/p/3198223.html
Copyright © 2011-2022 走看看