浅谈javascript的调试


Posted in Javascript onJanuary 28, 2015

最近比较吐槽,大家都知道,现在web前端相对几年前来说已经变得很重了,各种js框架,各种面对对象,而且项目多了,就会提取公共模块。

这些模块的UI展示都一样,不一样的就是后台逻辑,举个例子吧,我们做企业差旅的时候,通常都有一个成本中心的js公共模块,客户在预定机票的时候来填写这个成本中心,而这种成本中心分布在online,offline和app等预定端,这样也是方便后期和客户公司进行月结算。

我们还知道,项目做大了,复杂化了,SOA化了之后,很多问题就来了,就像web中的一个理论,所有前端的数据都是不可信的,那对方团队的接口数据又何尝不是,以前项目小的时候,不会那么不自信,也只会在Logic error的时候会记录下日志,正常的业务流程一般很少记录,毕竟info日志看着不美观,而且还会消耗服务器带宽,也还会拖累web的性能。

但是项目大了,当你某天在项目中遇到了奇怪的bug时,你靠着残缺不全的日志,好不容易用肉眼逐行追溯到了接口,但是参数太多,无法准确的还原接口的参数数据,但是你又100%的自信认定肯定就是接口的返回问题,但是又拿不出完整的报文,这时候你又没法找接口提供方,当时那个无奈呀,多想最好每行都有日志该多好啊。

有了教训后,记流程日志的趋势越来越盛行,最终也酿造了一个年初的大事件,稀里糊涂的说了一大堆,web后端如此,那现在的重前端不也一样要记录日志么?我们知道既然是公共的js模块,那这个模块肯定自己封装了一些方法,肯定是绝对不可以让第三方程序去操作它自己的文本结点,比如下面这样:

<!--third  module -->

公司:<input type="text" id="company" value="xxx有限公司" />

员工姓名:<input type="text" id="username" value="张三" />

<!-- -->

<script type="text/javascript">

    //成本中心

    var costCenter = (function () {

         var company = (document.getElementById("company") || "") && document.getElementById("company").value;

         var username = (document.getElementById("username") || "") && document.getElementById("username").value;

         var result = {

             getInfo: function () {

                 return { company: company, username: username };

             },

             validation: function () {

                 return Boolean(company && username);

             }

         };

         return result;

     })();

 </script>

为了简化操作,第三方UI提供了公司名和员工姓名的UI结点,并且封装了一个costcenter类来提供读取方法,可以看到,我的预定程序只需读取costCenter.getInfo就好了,也起到了一个封装的作用。

但是问题就出现在这里,项目实战中会因为各种原因导致在costcenter中取不到值,当然也可能是common ui的bug。

但是当时你又不能非常确定是否真的取到了值,但是在逻辑上就算取不到值,原则上你也不能阻止订单提交,所以为了彻底追踪bug,就写了个logCenter单例类来记录日志。通常用js来记录log有这种方法。

<1> ajax

这种方式很容易想到,但是你使用原生的xmlhttprequest的话,还需要考虑浏览器兼容,但不用原生的话,就要借助于第三方框架,比如jquery,但是毕竟还是有很多公司是不使用jquery的,所以这个要根据实际的需要来使用了。

    //日志中心

    var logCenter = (function () {

        var result = {

            info: function (title, message) {

                //ajax操作

                $.get("http://xxx.com", { "title": title, "message": message }, function () {

                }, "post");

             }

         };

         return result;

     })();

<2>image

我们的dom中有一个叫做image的对象,所以可以通过动态给它的src赋值来达到请求后台url的目的,同时在url中加上我们需要传递 title和message信息,这种动态给image.src的方式是不需要考虑浏览器兼容性的问题,非常不错。

    //日志中心

    var logCenter = (function () {

        var result = {

            info: function (title, message) {

                //ajax操作

                $.get("http://xxx.com", { "title": title, "message": message }, function () {

                }, "post");

             },

             info_image: function (title, message) {

                 //image

                 var img = new Image();

                 img.src = "http://www.baidu.com?title=" + title + "&message=" + message + "&temp=" + (Math.random() * 100000);

             }

         };

         return result;

     })();

以上就是本文的主要内容了,后续我们将继续深入探讨

Javascript 相关文章推荐
jsTree 基于JQuery的排序节点 Bug
Jul 26 Javascript
Google (Local) Search API的简单使用介绍
Nov 28 Javascript
移动设备web开发首选框架:zeptojs介绍
Jan 29 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
Mar 24 Javascript
javascript数组克隆简单实现方法
Dec 16 Javascript
超全面的javascript中变量命名规则
Feb 09 Javascript
学习使用Bootstrap栅格系统
May 11 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
Mar 19 Javascript
微信小程序自定义组件components(代码详解)
Oct 21 Javascript
vue实现购物车功能(商品分类)
Apr 20 Javascript
js实现详情页放大镜效果
Oct 28 Javascript
vue实现按钮切换图片
Jan 20 Vue.js
js的for in循环和java里foreach循环的区别分析
Jan 28 #Javascript
js鼠标悬浮出现遮罩层的方法
Jan 28 #Javascript
Jquery 实现grid绑定模板
Jan 28 #Javascript
Javascript控制input输入时间格式的方法
Jan 28 #Javascript
js使用Array.prototype.sort()对数组对象排序的方法
Jan 28 #Javascript
js封装可使用的构造函数继承用法分析
Jan 28 #Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
Jan 28 #Javascript
You might like
在PHP中使用灵巧的体系结构
2006/10/09 PHP
php采集时被封ip的解决方法
2010/08/29 PHP
PHP模拟QQ登录的方法
2015/07/29 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
利用php操作memcache缓存的基础方法示例
2017/08/02 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
JS解析XML的实现代码
2009/11/12 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
2012/01/21 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
java中String类型变量的赋值问题介绍
2016/03/23 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)
2017/07/11 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
2017/11/28 Javascript
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
Python 获取中文字拼音首个字母的方法
2018/11/28 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
python3实现表白神器
2019/04/09 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
python 如何实现遗传算法
2020/09/22 Python
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
德国药房apodiscounter中文官网:德国排名前三的网上药店
2019/06/03 全球购物
毕业典礼主持词大全
2014/03/26 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
张家口市高新区党工委群众路线教育实践活动整改方案
2014/10/25 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
图书馆义工感想
2015/08/07 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python