经常使用JS整理

正则

金额 8位整数 两位小数
/^[0-9]{1,8}(\.\d{1,2})?$/
计算不丢失精度
var CMX = CMX || {};
/**
 ** 加
 **/
CMX.add = function (arg1, arg2) {
    var r1, r2, m, c;
    try {
        r1 = arg1.toString().split(".")[1].length;
    }
    catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    }
    catch (e) {
        r2 = 0;
    }
    c = Math.abs(r1 - r2);
    m = Math.pow(10, Math.max(r1, r2));
    if (c > 0) {
        var cm = Math.pow(10, c);
        if (r1 > r2) {
            arg1 = Number(arg1.toString().replace(".", ""));
            arg2 = Number(arg2.toString().replace(".", "")) * cm;
        } else {
            arg1 = Number(arg1.toString().replace(".", "")) * cm;
            arg2 = Number(arg2.toString().replace(".", ""));
        }
    } else {
        arg1 = Number(arg1.toString().replace(".", ""));
        arg2 = Number(arg2.toString().replace(".", ""));
    }
    return (arg1 + arg2) / m;
};

/**
 ** 减
 **/
CMX.sub = function (arg1, arg2) {
    var r1, r2, m, n;
    try {
        r1 = arg1.toString().split(".")[1].length;
    }
    catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    }
    catch (e) {
        r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
    n = (r1 >= r2) ? r1 : r2;
    return Number(((arg1 * m - arg2 * m) / m).toFixed(n));
};

/**
 ** 乘
 **/
    CMX.mul = function (arg1, arg2) {
        var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
        try {
            m += s1.split(".")[1].length;
        }
        catch (e) {
        }
        try {
            m += s2.split(".")[1].length;
        }
        catch (e) {
        }
        return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
    };

/**
 ** 除
 **/
CMX.div = function (arg1, arg2) {
    var t1 = 0, t2 = 0, r1, r2;
    try {
        t1 = arg1.toString().split(".")[1].length;
    }
    catch (e) {
    }
    try {
        t2 = arg2.toString().split(".")[1].length;
    }
    catch (e) {
    }
    with (Math) {
        r1 = Number(arg1.toString().replace(".", ""));
        r2 = Number(arg2.toString().replace(".", ""));
        return (r1 / r2) * pow(10, t2 - t1);
    }
};

COOKIE

var cookie_operate = {
        set:function(key,val,time){//设置cookie方法
            var date=new Date(); //获取当前时间
            var expiresDays=time;  //将date设置为n天之后的时间
            date.setTime(date.getTime()+expiresDays*24*3600*1000); //格式化为cookie识别的时间
            document.cookie=key + "=" + val +";expires="+date.toGMTString();  //设置cookie
        },
        get:function(key){//获取cookie方法
            /*获取cookie参数*/
            debugger
            var getCookie = document.cookie.replace(/[ ]/g,"");  //获取cookie,而且将得到的cookie格式化,去掉空格字符
            var arrCookie = getCookie.split(";")  //将得到的cookie以"分号"为标识 将cookie保存到arrCookie的数组中
            var tips;  //声明变量tips
            for(var i=0;i<arrCookie.length;i++){   //使用for循环查找cookie中的tips变量
                var arr=arrCookie[i].split("=");   //将单条cookie用"等号"为标识,将单条cookie保存为arr数组
                if(key==arr[0]){  //匹配变量名称,其中arr[0]是指的cookie名称,若是该条变量为tips则执行判断语句中的赋值操做
                    tips=arr[1];   //将cookie的值赋给变量tips
                    break;   //终止for循环遍历
                }
            }
            return tips
        },
        delete:function(key){ //删除cookie方法
            var date = new Date(); //获取当前时间
            date.setTime(date.getTime()-10000); //将date设置为过去的时间
            document.cookie = key + "=v; expires =" +date.toGMTString();//设置cookie
            return tips;
        }
    };

RADIO

写法
<input type="radio" name="list" value="十分满意" />十分满意
   <input type="radio" name="list" value="满意" />满意
   <input type="radio" name="list" value="不满意" />不满意
   <input type="radio" name="list" value="很是差" />很是差
取值
var re = $('input[name="redio的name值"]:checked').val();

js

oninput
<input type="text" oninput="myFunction()">
oninput 事件在用户输入时触发。

该事件在 < input> 或 < textarea> 元素的值发生改变时触发。
提示: 该事件相似于 onchange 事件。不一样之处在于 oninput 事件在元素值发生变化是当即触发, onchange 在元素失去焦点时触发。另一点不一样是 onchange 事件也能够做用于 < keygen> 和 < select> 元素。正则表达式

对象的深浅拷贝

var obj = {a:{b:10}};
function copy(obj){
    var newobj = {};
    for ( var attr in obj) {
        newobj[attr] = obj[attr];
    }
    return newobj;
}
var obj2 = copy(obj);
obj2.a.b = 20;
alert(obj.a.b); //20
深拷贝
var obj = {a:{b:10}};
function deepCopy(obj){
    if(typeof obj != 'object'){
        return obj;
    }
    var newobj = {};
    for ( var attr in obj) {
        newobj[attr] = deepCopy(obj[attr]);
    }
    return newobj;
}
var obj2 = deepCopy(obj);
obj2.a.b = 20;
alert(obj.a.b); //10

Js正则

JS正则表达式有两种一种是 普通方式,一种是构造函数形式数组

  • 普通方式:var reg=/表达式/附加参数
  • 构造函数方式:var reg=new RegExp(“表达式”,”附加参数”);
普通方式与构造函数方式的区别
普通方式中的表达式必须是一个常量字符串,而构造函数中的表达式能够是常量字符串,也能够是一个js变量,例如根据用户的输入来做为表达式参数等等:
var reg=new RegExp(document.forms[0].exprfiled.value,”g”);

| 表达式|可匹配 |
| :-------- | --------:|
| /d | 任意一个数字,0~9 中的任意一个 |
| /w | 任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个 |
| /s| 包括空格、制表符、换页符等空白字符的其中任意一个 |
|[ab5@]| 匹配 "a" 或 "b" 或 "5" 或 "@"|
|1| 匹配 "a","b","c" 以外的任意一个字符|
|[f-k]| 匹配 "f"~"k" 之间的任意一个字母|
|2 |匹配 "A"~"F","0"~"3" 以外的任意一个字符|
| . | 小数点能够匹配除了换行符(/n)之外的任意一个字符 |cookie

举例1:表达式 "/d/d",在匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"12";匹配到的位置是:开始于3,结束于5。

举例2:表达式 "a./d",在匹配 "aaa100" 时,匹配的结果是:成功;匹配到的内容是:"aa1";匹配到的位置是:开始于1,结束于4。函数

举例3:表达式 "bcd" 匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"bc";匹配到的位置是:开始于1,结束于3。debug

举例4:表达式 "1" 匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"1";匹配到的位置是:开始于3,结束于4。code

前面章节中讲到的表达式,不管是只能匹配一种字符的表达式,仍是能够匹配多种字符其中任意一个的表达式,都只能匹配一次。若是使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就能够重复匹配。orm

使用方法是:"次数修饰"放在"被修饰的表达式"后边。好比:"[bcd][bcd]" 能够写成 "[bcd]{2}"。
Alt text对象

Alt text

举例1:表达式 "^aaa" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。由于 "^" 要求与字符串开始的地方匹配,所以,只有当 "aaa" 位于字符串的开头的时候,"^aaa" 才能匹配,好比:"aaa xxx xxx"。

举例2:表达式 "aaa$" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。由于 "$" 要求与字符串结束的地方匹配,所以,只有当 "aaa" 位于字符串的结尾的时候,"aaa$" 才能匹配,好比:"xxx xxx aaa"。排序

举例3:表达式 "./b." 在匹配 "@@@abc" 时,匹配结果是:成功;匹配到的内容是:"@a";匹配到的位置是:开始于2,结束于4。事件

进一步说明:"/b" 与 "^" 和 "$" 相似,自己不匹配任何字符,可是它要求它在匹配结果中所处位置的左右两边,其中一边是 "/w" 范围,另外一边是 非"/w" 的范围。
举例4:表达式 "/bend/b" 在匹配 "weekend,endfor,end" 时,匹配结果是:成功;匹配到的内容是:"end";匹配到的位置是:开始于15,结束于18。
Alt text
在使用修饰匹配次数的特殊符号时,有几种表示方法可使同一个表达式可以匹配不一样的次数,好比:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程当中,老是尽量多的匹配。好比,针对文本 "dxxxdxxxd",举例以下:

Alt text

因而可知,"/w+" 在匹配的时候,老是尽量多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式可以匹配成功。同理,带 "*" 和 "{m,n}" 的表达式都是尽量地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽量的 "要匹配"。这 种匹配原则就叫做 "贪婪" 模式 。

非贪婪模式:
在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可使匹配次数不定的表达式尽量少的匹配,使可匹配可不匹配的表达式,尽量的 "不匹配"。这种匹配原则叫做 "非贪婪" 模式,也叫做 "勉强" 模式。若是少匹配就会致使整个表达式匹配失败的时候,与贪婪模式相似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。举例以下,针对文本 "dxxxdxxxd" 举例:
Alt text
举例1:表达式 "< td>(.*)< /td>" 与字符串 "< td>< p>aa< /p>< /td> < td>< p>bb< /p>< /td>" 匹配时,匹配的结果是:成功;匹配到的内容是 "< td>< p>aa< /p>< /td> < td>< p>bb< /p>< /td>" 整个字符串, 表达式中的 "< /td>" 将与字符串中最后一个 "< /td>" 匹配。

举例2:相比之下,表达式 "< td>(.*?)< /td>" 匹配举例1中一样的字符串时,将只获得 "< td> < p>aa< /p>< /td>", 再次匹配下一个时,能够获得第二个 "< td>< p>bb< /p>< /td>"。
表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串能够单独获取。这一点,在前面的举例中,已经屡次展现了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。好比前面的 "<td>(.*?)</td>"。

其实,"小括号包含的表达式所匹配到的字符串" 不只是在匹配结束后才可使用,在匹配过程当中也可使用。表达式后边的部分,能够引用前面 "括号内的子匹配已经匹配到的字符串"。引用方法是 "/" 加上一个数字。"/1" 引用第1对括号内匹配到的字符串,"/2" 引用第2对括号内匹配到的字符串……以此类推,若是一对括号内包含另外一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 "(" 在前,那这一对就先排序号。

举例以下:

举例1:表达式 "('|")(.*?)(/1)" 在匹配 " 'Hello', "World" " 时,匹配结果是:成功;匹配到的内容是:" 'Hello' "。再次匹配下一个时,能够匹配到 " "World" "。

举例2:表达式 "(/w)/1{4,}" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时,匹配结果是:成功;匹配到的内容是 "ccccc"。再次匹配下一个时,将获得 999999999。这个表达式要求 "/w" 范围的字符至少重复5次,注意与 "/w{5,}" 之间的区别。

举例3:表达式 "<(/w+)/s*(/w+(=('|").*?/4)?/s*)*>.*?<//1>" 在匹配 "<td id='td1' style="bgcolor:white"></td>" 时,匹配结果是成功。若是 "<td>" 与 "</td>" 不配对,则会匹配失败;若是改为其余配对,也能够匹配成功。

Alt text
Alt text
Alt text
Alt text

附加参数:用来扩展表达式的含义,目前主要有三个参数:

  • g:表明能够进行全局匹配。
  • i:表明不区分大小写匹配。
  • m:表明能够进行多行匹配。
if (event.stopPropagation()) {//阻止点击事件向上冒泡
        event.stopPropagation();
    } else {
        window.event.cancelBubble = true;

我是一条小尾巴~~~~~~~~~~


  1. abc
  2. A-F0-3