不到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 篱式条件判断
Aug 22 Javascript
javascript firefox不显示本地预览图片问题的解决方法
Nov 12 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
Jun 01 Javascript
使用jquery.upload.js实现异步上传示例代码
Jul 29 Javascript
jQuery操作DOM之获取表单控件的值
Jan 23 Javascript
jquery实现的缩略图预览滑块实例
Jun 25 Javascript
javascript下使用Promise封装FileReader
Feb 19 Javascript
Bootstrap实现提示框和弹出框效果
Jan 11 Javascript
Angular5.1新功能分享
Dec 21 Javascript
基于webpack4搭建的react项目框架的方法
Jun 30 Javascript
JS实现处理时间,年月日,星期的公共方法示例
May 31 Javascript
nuxt引入组件和公共样式的操作
Nov 05 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
终于听上了直流胆调频
2021/03/02 无线电
删除及到期域名的查看(抢域名必备哦)
2008/05/14 PHP
PHP中strtotime函数使用方法分享
2012/01/10 PHP
QQ互联一键登录审核不通过的解决方案
2014/09/10 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
2017/04/18 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
对象特征检测法判断浏览器对javascript对象的支持
2009/07/25 Javascript
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
JQuery+JS实现仿百度搜索结果中关键字变色效果
2011/08/02 Javascript
jquery 选取方法都有哪些
2014/05/18 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
Vue精简版风格概述
2018/01/30 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
python使用cookie库操保存cookie详解
2014/03/03 Python
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
python列表返回重复数据的下标
2020/02/10 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
HTML5中Localstorage的使用教程
2015/07/09 HTML / CSS
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
西班牙最好的在线购买葡萄酒的商店:Vinoseleccion
2019/10/30 全球购物
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
农民工创业典型事迹
2014/01/25 职场文书
辞职信怎么写?
2019/05/21 职场文书
变长双向rnn的正确使用姿势教学
2021/05/31 Python