Javascript获取页面事件对象的getEvent函数兼容性写法 | GCidea's blog

作者:JerryXia | 发表于 , 阅读 (2)
目录1. 实践
实践123456789101112131415161718function getEvent() {    if (document.all) {        var iEevent = window.event;        iEevent.target = window.event.srcElement;        return iEevent;    }    var func = getEvent.caller;    while (func != null) {        var arg0 = func.arguments[0];        if (arg0) {            if ((arg0.constructor == Event || arg0.constructor == MouseEvent) || (typeof(arg0) == "object" && arg0.preventDefault && arg0.stopPropagation)) {                return arg0;        ...阅读全文

使用JavaScript实现金额格式化转换 | GCidea's blog

作者:JerryXia | 发表于 , 阅读 (2)
目录1. 前言2. 实现
前言  实现金额数字的每三位打”,”,便于识别金额大小。
实现12345678910111213//s: 希望转换的金额数字;n:希望保留的小数位数function formatMoney(s, n) {     n = n > 0 && n <= 20 ? n : 2;     //正则/[^\d\.-]/g表示去除传入字符串中非数字,非小数点,非负号以外的在金额中不应该出现的字符    s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + "";     var l = s.split(".")[0].split("").reverse();    var r = s.split(".")[1];     var t = "";     for(i = 0; i < l.length; i ++ ) {         t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? "," : "");     }     return...阅读全文

使用JavaScript实现数组去重的4种方法及性能比较 | GCidea's blog

作者:JerryXia | 发表于 , 阅读 (2)
目录1. 方法一2. 方法二3. 方法三4. 方法四5. 说明
方法一思路:创建一个新的结果数组,遍历原数组,利用数组indexOf()方法,判断原数组当前值是否在结果数组中存在,如果存在则跳过,否则压入结果数组。12345678910 function removeDuplicatedItem(ar) {    var ret = [];     for (var i = 0, j = ar.length; i < j; i++) {       if (ret.indexOf(ar[i]) === -1) {            ret.push(ar[i]);       }     }     return ret;}
方法二利用数组下标判断。遍历该数组,使用indexOf()方法判断当前遍历的元素在整个数组中的下标是否等于当前下标。(因为indexOf()方法的原理是返回匹配中的第一个元素的下标,如果这个下标等于当前下标,说明这个元素在整个数组中第一次出现,就可以将其压入结果数组,否则说明是重复的,跳过。)1234567891011function removeDupl...阅读全文

setTimeout与setInterval的对比与互相实现 | GCidea's blog

作者:JerryXia | 发表于 , 阅读 (3)
目录1. 案例2. setTimeout和setInterval对比3. 互相实现3.1. 利用setTimeout实现setInterval3.2. 利用setInterval实现setTimeout
案例
setTimeout和setInterval对比
另外,根据网上一张关于此问题比较流行的图:1234567function click() { // code block1... setInterval(function() { // process ... }, 200); // code block2 }
setInterval可能会存在的问题是:假设onclick回调函数一共要300ms执行完, block1代码执行完花了5ms, 在5ms时执行setInterval, 以此为一个时间点, 在205ms时插入process代码。当onclick回调函数顺利结束, process代码开始执行(即图中的timer code), 然而process代码也执行了一个比较长的时间, 超过了接下来一个插入时间点405ms, 这样代码队列后又插入了一份process代码, pro...阅读全文

JavaScript的闭包案例---2 | GCidea's blog

作者:JerryXia | 发表于 , 阅读 (3)
目录1. 前言2. 描述
前言  接续之前的一篇JavaScript的闭包案例—1,加深对《JavaScript权威指南》P187的理解。
描述  使用闭包,可以实现共享私有状态,实现私有存取器属性。本质上就是在同一个作用域链上定义了两个或多个闭包,来共享同样的私有变量。这是十分重要的一种应用,但是要十分小心因为这种做法将那些本不希望共享的变量共享给了其他闭包,这会造成严重的错误并让我们不解。  假设有这样的需求:需要一个函数对象数组(数组每一项是一个函数),对于某个确定的数组元素,调用之可以返回数组下标。  “看似正确”的做法如下:1234567var funcs = [];for(var i=0;i<10;i++){    funcs[i] = function(){return i;};}console.log(funcs[5]()); //10
正如注释所写,很奇怪的,将打印输出10而并不是5。原因就在于:在循环中,定义了10个函数(对应有自己的作用域链),也就形成了10个闭包,这些闭包都是在同一个函数调用中定义的,因此共享作用域,共享变量i。for循环结束的条件是i>=...阅读全文