zoukankan      html  css  js  c++  java
  • 不到30行JS代码实现的Excel表格

     

    不到30行JS代码实现的Excel表格,jQuery并非不可替代

      某国外程序员展示了一个由原生JS写成不依赖第三方库的,Excel表格应用,有以下特性:

    • 由不足30行的原生JavaScript代码实现
    • 不依赖第三方库
    • Excel风格的语义分析 (公式以 "=" 开头)
    • 支持任意表达式 (=A1+B2*C3)
    • 防止循环引用
    • 基于localStorage的自动本地持久化存储

      效果展示:

      代码分析:

      CSS略,HTML核心仅一行:

    <table></table>

      JavaScript代码:

    for (var i=0; i<6; i++) {
        var row = document.querySelector("table").insertRow(-1);
        for (var j=0; j<6; j++) {
            var letter = String.fromCharCode("A".charCodeAt(0)+j-1);
            row.insertCell(-1).innerHTML = i&&j ? "" : i||letter;
        }
    }
    var DATA={}, INPUTS=[].slice.call(document.querySelectorAll("input"));
    INPUTS.forEach(function(elm) {
        elm.onfocus = function(e) {
            e.target.value = localStorage[e.target.id] || "";
        };
        elm.onblur = function(e) {
            localStorage[e.target.id] = e.target.value;
            computeAll();
        };
        var getter = function() {
            var value = localStorage[elm.id] || "";
            if (value.charAt(0) == "=") {
                with (DATA) return eval(value.substring(1));
            } else { return isNaN(parseFloat(value)) ? value : parseFloat(value); }
        };
        Object.defineProperty(DATA, elm.id, {get:getter});
        Object.defineProperty(DATA, elm.id.toLowerCase(), {get:getter});
    });
    (window.computeAll = function() {
        INPUTS.forEach(function(elm) { try { elm.value = DATA[elm.id]; } catch(e) {} });
    })();

      其实通过上文我们可以看出最核心的几步使用了EMEAScript5和HTML5的特性, 如: 

      querySelectorAll: 提供类似jQuery选择器的查询,由此可见,第三方JS库如jQuery并不是必不少的。

    var matches = document.querySelectorAll("div.note, div.alert");

      defineProperty 提供了类以Java的get,set访问/设置预处理方法,还有其他一些配置属性,如:是否可配置,可枚举等。

    Object.defineProperty(o, "b", {get : function(){ return bValue; },
                                   set : function(newValue){ bValue = newValue; },
                                   enumerable : true,
                                   configurable : true});

      原文 jsfiddle.net

  • 相关阅读:
    2021,6,10 xjzx 模拟考试
    平衡树(二)——Treap
    AtCoder Beginner Contest 204 A-E简要题解
    POJ 2311 Cutting Game 题解
    Codeforces 990G GCD Counting 题解
    NOI2021 SDPTT D2T1 我已经完全理解了 DFS 序线段树 题解
    第三届山东省青少年创意编程与智能设计大赛总结
    Luogu P6042 「ACOI2020」学园祭 题解
    联合省选2021 游记
    Codeforces 1498E Two Houses 题解 —— 如何用结论吊打标算
  • 原文地址:https://www.cnblogs.com/macliu/p/3608663.html
Copyright © 2011-2022 走看看