不到30行JS代码实现Excel表格的方法


Posted in Javascript onNovember 15, 2014

本文实例讲述了不到30行JS代码实现Excel表格的方法,可见jQuery并非不可替代。分享给大家供大家参考。具体分析如下:

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

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

效果展示如下图所示:

不到30行JS代码实现Excel表格的方法

代码分析:

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});

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript中的逻辑判断符&amp;&amp;、||与!介绍
Dec 31 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
Mar 09 Javascript
jquery获取多个checkbox的值异步提交给php
Jul 07 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
Sep 04 Javascript
很不错的两款Bootstrap Icon图标选择组件
Jan 28 Javascript
javascript中错误使用var造成undefined
Mar 31 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
Oct 09 Javascript
jQuery选择器之子元素选择器详解
Sep 18 jQuery
使用cookie绕过验证码登录的实现代码
Oct 12 Javascript
微信小程序的生命周期的详解
Oct 19 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
Nov 02 Javascript
基于vue-cli3和element实现登陆页面
Nov 13 Javascript
Node.js中HTTP模块与事件模块详解
Nov 14 #Javascript
jquery中append()与appendto()用法分析
Nov 14 #Javascript
jQuery 插件开发指南
Nov 14 #Javascript
使用JavaScript和C#中获得referer
Nov 14 #Javascript
JavaScript window.location对象
Nov 14 #Javascript
详谈JavaScript 匿名函数及闭包
Nov 14 #Javascript
详谈JavaScript内存泄漏
Nov 14 #Javascript
You might like
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
2015/12/15 PHP
实现PHP搜索加分页
2016/10/12 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
php之可变变量的实例详解
2017/09/12 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
jQuery动画与特效详解
2015/02/01 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
JSON字符串和对象相互转换实例分析
2016/06/16 Javascript
vue.js实现表格合并示例代码
2016/11/30 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
2017/05/08 jQuery
BootStrap 页签切换失效的解决方法
2017/08/17 Javascript
浅谈Node.js 子进程与应用场景
2018/01/24 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
webpack-url-loader 解决项目中图片打包路径问题
2019/02/15 Javascript
JS中超越现实的匿名函数用法实例分析
2019/06/21 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
Python pickle模块用法实例分析
2015/05/27 Python
浅析Python基础-流程控制
2016/03/18 Python
Python中six模块基础用法
2019/12/08 Python
python matplotlib 绘图 和 dpi对应关系详解
2020/03/14 Python
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
后勤采购员岗位职责
2013/12/19 职场文书
群教班子对照检查材料
2014/08/26 职场文书
学习党代会心得体会
2014/09/05 职场文书
法人委托书范本
2014/09/15 职场文书