为调试JavaScript添加输出窗口的代码


Posted in Javascript onFebruary 07, 2010

虽然不是很复杂的实现,但每次都要这样就会很麻烦,所以我写了一小段脚本,用来自动生成这个输出窗口。
代码

window.Babu = {}; 
Babu.Debugging = {}; 
Babu.Debugging.writeLine = function(format, arg1, arg2) { 
var console = Babu.Debugging._getConsole(); 
if (console.get_visible()) { 
var msg = format; 
if (typeof msg !== "undefined" && msg !== null) { 
var index; 
if (typeof msg === "string") { 
var array = format.match(/\{(\d+)\}/g); 
if (array) { 
for (var i = 0; i < array.length; i++) { 
index = array[i]; 
index = parseInt(index.substr(1, index.length - 2)) + 1; 
msg = msg.replace(array[i], arguments[index]); 
} 
} 
} 
} 
var span = document.createElement("SPAN"); 
span.appendChild(document.createTextNode(msg)); 
console._output.appendChild(span); 
console._output.appendChild(document.createElement("BR")); 
span.scrollIntoView(); 
return span; 
} 
} 
Babu.Debugging._getConsole = function() { 
var console = Babu.Debugging._console; 
if (!console) { 
var div = document.createElement("DIV"); 
div.style.position = "fixed"; 
div.style.right = "3px"; 
div.style.bottom = "3px"; 
div.style.width = "350px"; 
div.style.height = "180px"; 
div.style.backgroundColor = "white"; 
div.style.color = "black"; 
div.style.border = "solid 2px #afafaf"; 
div.style.fontSize = "12px"; 
document.body.appendChild(div); 
Babu.Debugging._console = console = div; 
div = document.createElement("DIV"); 
div.style.backgroundColor = "#e0e0e0"; 
div.style.position = "absolute"; 
div.style.left = "0px"; 
div.style.right = "0px"; 
div.style.top = "0px"; 
div.style.height = "16px"; 
div.style.padding = "2px 2px"; 
div.style.margin = "0px"; 
console.appendChild(div); 
console._toolbar = div; 
div = document.createElement("DIV"); 
div.style.overflow = "auto"; 
div.style.whiteSpace = "nowrap"; 
div.style.position = "absolute"; 
div.style.left = "0px"; 
div.style.right = "0px"; 
div.style.top = "20px"; 
div.style.bottom = "0px"; 
div.style.height = "auto"; 
console.appendChild(div); 
console._output = div; 
var btn; 
btn = document.createElement("SPAN"); 
btn.innerHTML = "收缩"; 
btn.style.margin = "0px 3px"; 
btn.style.cursor = "pointer"; 
console._toolbar.appendChild(btn); 
btn.onclick = function() { if (console.get_collapsed()) console.expand(); else console.collapse(); } 
btn = document.createElement("SPAN"); 
btn.innerHTML = "清除"; 
btn.style.margin = "0px 3px"; 
btn.style.cursor = "pointer"; 
console._toolbar.appendChild(btn); 
btn.onclick = Babu.Debugging.clearConsole; 
btn = document.createElement("SPAN"); 
btn.innerHTML = "关闭"; 
btn.style.cursor = "pointer"; 
btn.style.margin = "0px 3px"; 
console._toolbar.appendChild(btn); 
btn.onclick = function() { Babu.Debugging.hideConsole(); } 
console.get_visible = function() { return this.style.display !== "none" }; 
console.get_collapsed = function() { return !(!this._collapseState) }; 
console.collapse = function() { 
if (!this.get_collapsed()) { 
this._output.style.display = "none"; 
this._toolbar.childNodes[1].style.display = "none"; 
this._toolbar.childNodes[2].style.display = "none"; 
this._toolbar.childNodes[0].innerHTML = "展开"; 
this._collapseState = { width: this.style.width, height: this.style.height } 
this.style.width = "30px"; 
this.style.height = "16px"; 
} 
} 
console.expand = function() { 
if (this.get_collapsed()) { 
this._output.style.display = ""; 
this._toolbar.childNodes[1].style.display = ""; 
this._toolbar.childNodes[2].style.display = ""; 
this._toolbar.childNodes[0].innerHTML = "收缩"; 
this.style.width = this._collapseState.width; 
this.style.height = this._collapseState.height; 
this._collapseState = null; 
} 
} 
} 
return console; 
} 
Babu.Debugging.showConsole = function() { 
Babu.Debugging._getConsole().style.display = ""; 
} 
Babu.Debugging.hideConsole = function() { 
var console = Babu.Debugging._console; 
if (console) { 
console.style.display = "none"; 
} 
} 
Babu.Debugging.clearConsole = function() { 
var console = Babu.Debugging._console; 
if (console) console._output.innerHTML = ""; 
}

调用方法很简单:
Babu.Debugging.writeLine("调试信息"); 
Babu.Debugging.writeLine("带参数的调试信息:参数1={0},参数2={1}", arg1, arg2);

调用之后,会自动在窗口的右下角出现一个固定位置的窗口,并显示相应的内容。效果图请看下面:
为调试JavaScript添加输出窗口的代码
Javascript 相关文章推荐
二级域名或跨域共享Cookies的实现方法
Aug 07 Javascript
使用jQuery同时控制四张图片的伸缩实现代码
Apr 19 Javascript
通过js简单实现将一个文本内容转译成加密文本
Oct 22 Javascript
浅谈EasyUI中编辑treegrid的方法
Mar 01 Javascript
js数组如何添加json数据及js数组与json的区别
Oct 27 Javascript
详解Angularjs filter过滤器
Feb 06 Javascript
JavaScript简单获取系统当前时间完整示例
Aug 02 Javascript
整理关于Bootstrap列表组的慕课笔记
Mar 29 Javascript
微信小程序中顶部导航栏的实现代码
Mar 30 Javascript
微信小程序实践之动态控制组件的显示/隐藏功能
Jul 18 Javascript
vue下拉菜单组件(含搜索)的实现代码
Nov 25 Javascript
Nuxt.js 静态资源和打包的操作
Nov 06 Javascript
JavaScript 读取元素的CSS信息的代码
Feb 07 #Javascript
js png图片(有含有透明)在IE6中为什么不透明了
Feb 07 #Javascript
JavaScript Event学习第八章 事件的顺序
Feb 07 #Javascript
JavaScript Event学习第七章 事件属性
Feb 07 #Javascript
JavaScript Event学习第六章 事件的访问
Feb 07 #Javascript
JavaScript Event学习第五章 高级事件注册模型
Feb 07 #Javascript
JavaScript Event学习第四章 传统的事件注册模型
Feb 07 #Javascript
You might like
PHP 中执行系统外部命令
2006/10/09 PHP
php空间不支持socket但支持curl时recaptcha的用法
2011/11/07 PHP
PHP自动识别字符集并完成转码详解
2013/08/02 PHP
php向js函数传参的几种方法
2014/08/10 PHP
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
php常用字符函数实例小结
2016/12/29 PHP
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
JavaScript中setAttribute用法介绍
2013/07/20 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
2015/10/22 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
JS判断时间段的实现代码
2017/06/14 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
2018/03/14 Javascript
vue+axios 前端实现的常用拦截的代码示例
2018/08/23 Javascript
Vue指令指令大全
2019/02/09 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
Python中os和shutil模块实用方法集锦
2014/05/13 Python
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
Python中使用haystack实现django全文检索搜索引擎功能
2017/08/26 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
英国手机零售商:Metrofone
2019/03/18 全球购物
兼职业务员岗位职责
2014/01/01 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
幼儿园学前班幼儿评语
2014/12/29 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android
Redis基本数据类型List常用操作命令
2022/06/01 Redis