不到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(jquery)利用函数修改全局变量的代码
Nov 02 Javascript
判断客户端浏览器是否安装了Flash插件的多种方法
Aug 11 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
May 11 Javascript
当达到输入长度时表单自动切换焦点
Apr 06 Javascript
jQuery原生的动画效果
Jul 10 Javascript
实现easyui的datagrid导出为excel的示例代码
Nov 10 Javascript
jQuery弹出div层过2秒自动消失
Nov 29 Javascript
vue中component组件的props使用详解
Sep 04 Javascript
深入理解ES7的async/await的用法
Sep 09 Javascript
ES6学习教程之对象字面量详解
Oct 09 Javascript
vue实现中部导航栏布局功能
Jul 30 Javascript
vue 动态给每个页面添加title、关键词和描述的方法
Aug 28 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的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
php将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
thinkPHP3.2简单实现文件上传的方法
2016/05/16 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
javascript 定义初始化数组函数
2009/09/07 Javascript
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
2011/01/17 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
2013/04/17 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
2016/12/19 Javascript
详解jQuery选择器
2016/12/21 Javascript
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
vue组件watch属性实例讲解
2017/11/07 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
vue+koa2实现session、token登陆状态验证的示例
2019/08/30 Javascript
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
国外平面设计第一市场:99designs
2016/10/25 全球购物
美国二手奢侈品寄售网站:TheRealReal
2016/10/29 全球购物
建筑工程技术应届生求职信
2013/11/17 职场文书
体育老师的教学自我评价分享
2013/11/19 职场文书
大二学生学习个人自我评价
2014/01/19 职场文书
公司年会策划方案
2014/05/17 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
班干部学习委员竞选稿
2015/11/20 职场文书
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python
浅谈MySQL中的六种日志
2022/03/23 MySQL
Win10 Anaconda安装python-pcl
2022/04/29 Servers