浅谈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 相关文章推荐
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
Sep 22 Javascript
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
Aug 13 Javascript
Javascript 读后台cookie代码
Sep 15 Javascript
jQuery 滑动方法slideDown向下滑动元素
Jan 16 Javascript
jQuery实现两款有动画功能的导航菜单代码
Sep 16 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
Sep 05 Javascript
js实现拖拽上传图片功能
Aug 01 Javascript
js获取html页面代码中图片地址的实现代码
Mar 05 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
Jun 10 Javascript
解决Vue打包后访问图片/图标不显示的问题
Jul 25 Javascript
Javascript操作select控件代码实例
Feb 14 Javascript
Vue 的双向绑定原理与用法揭秘
May 06 Javascript
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中调用ASP.NET的WebService的代码
2011/04/22 PHP
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
PHP将数据导出Excel表中的实例(投机型)
2017/07/31 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
laravel 如何实现引入自己的函数或类库
2019/10/15 PHP
PHP反射基础知识回顾
2020/09/10 PHP
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
2013/11/22 Javascript
javascript操作referer详细解析
2014/03/10 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
js倒计时抢购实例
2015/12/20 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
微信小程序 开发之滑块视图容器(swiper)详解及实例代码
2017/02/22 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
[49:08]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python和C语言混合编程实例
2014/06/04 Python
python3编码问题汇总
2016/09/06 Python
python操作oracle的完整教程分享
2018/01/30 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
在python中bool函数的取值方法
2018/11/01 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
介绍一下Ruby的多线程处理
2013/02/01 面试题
自荐信如何“自荐”
2013/10/24 职场文书
会计的岗位职责
2014/03/15 职场文书
建筑安全生产责任书
2014/07/22 职场文书
环保志愿者活动方案
2014/08/14 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
开展创先争优活动总结
2014/08/28 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
调任通知
2015/04/21 职场文书
师范生见习自我总结
2015/06/23 职场文书
SQL注入详解及防范方法
2021/12/06 MySQL
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers