/**/ /********************debug.js***************************************/ // 兼容FireFox的事件处理模式 function getEvent() ... {if(document.all)return window.event;func=getEvent.caller;while(func!=null)...{var arg0=func.arguments[0];if(arg0)...{if(typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation) return arg0;}func=func.caller;}return null;} /**/ /*为了兼容那些不使用prototype.js的程序,写的两个函数如果事先引入过prototype.js, 下面两个Array.prototype 就不需要了*/ if ( ! Array.prototype.map) ... {Array.prototype.map=function(f)...{for(var i=0,ret=[];i<this.length;i++) ret.push(f(this[i],i))return ret}} if ( ! Array.prototype.inject) ... {Array.prototype.inject=function(ret,f)...{for(var i=0;i<this.length;i++) ret=f(ret,this[i],i)return ret}} /**/ /*格式化数字或者字符为每三位分逗号的格式 123456--->123,345 1234---> 1,234参数可以是数字或者字符串,返回字符串*/ function formatNum(s) ... {return (""+s).split("").reverse().map(function(x,i)...{return (i%3 || !i)?x:x+","}).reverse().join("")} JsDebug = ... {maxAjaxLogNum:5, //最多能显示多少条Ajax调试信息maxJsLogNum:50, //最多能显示多少条Javascript调试信息ajaxLog:[], jsLog:[],timeLog:...{},ajax:function(msg)...{var self=JsDebug;self.ajaxLog.unshift(msg)if (self.ajaxLog.length>self.maxAjaxLogNum) self.ajaxLog.length=self.maxAjaxLogNum},debug:function(msg)...{JsDebug.logger(msg,"debug")},info:function(msg)...{JsDebug.logger(msg,"info")},msg:function(msg) ...{JsDebug.logger(msg,"info")},warn:function(msg)...{JsDebug.logger(msg,"warn")},error:function(msg)...{JsDebug.logger(msg,"error")},timeStart:function(funcName)...{var self=JsDebug;if (typeof(self.timeLog[funcName])) delete self.timeLog[funcName]self.timeLog[funcName]=new Object()self.timeLog[funcName].startTimeObj=new Date()return self.timeLog[funcName].startTimeObj},timeEnd:function(funcName)...{var self=JsDebug;if (typeof(self.timeLog[funcName])=='undefined' || typeof(self.timeLog[funcName].startTimeObj)=='undefined') return falseself.timeLog[funcName].endTimeObj=new Date()self.timeLog[funcName].timeRun=self.timeLog[funcName].endTimeObj-self.timeLog[funcName].startTimeObjreturn self.timeLog[funcName].endTimeObj},logger:function(msg,type)...{var self=JsDebug;self.jsLog.unshift(["<div class="+type+">【"+type+"】<xmp>"+msg+"</xmp><hr></div>",type])if (self.jsLog.length>self.maxJsLogNum) self.jsLog.length=self.maxJsLogNum},output:function(type)...{var self=JsDebugvar s="<tr><td class=f>$1</td><td class=s>$2</td><td class=e>$3</td><td class=t>$4</td></tr>" var arr=[]if (!type) type=""switch(type)...{case "time":case "":var obj=self.timeLogarr.push("<font><a href=javascript:void(0) οnclick=t(this)>显示隐藏性能信息</a><table border width=60%>")arr.push(s.replace("$1","模块名").replace("$2","开始时间").replace("$3","结束时间").replace("$4","时间(ms)"))for(var key in obj)...{var o=obj[key]var d1=o.startTimeObjvar d2=o.endTimeObjvar t1=""+d1.toLocaleTimeString()+"."+d1.getMilliseconds()var t2=""+d2.toLocaleTimeString()+"."+d2.getMilliseconds()arr.push(s.replace("$1",key).replace("$2",t1).replace("$3",t2).replace("$4",formatNum(o.timeRun)))}arr.push("</table></font>")if (type) break;case "js":case "":arr.push("<font><a href=javascript:void(0) οnclick=t(this)>显示隐藏调试信息</a><font>")var jsDebugMsg=self.jsLog.inject([],function(ret,x)...{ret.push(x[0]);return ret}).join("")if (jsDebugMsg)...{ arr.push('<select οnchange="f(this.value)"><option>请选择...</option><option value="debug">调试信息(debug)') arr.push('</option><option value="warn">警告信息(warn)</option><option value="error">错误信息(error)') arr.push('</option><option value="info">一般信息(info)</option></select><p>')} arr.push(jsDebugMsg) arr.push("</font></font>") if (type) break;case "ajax":case "": arr.push("<font><a href=javascript:void(0) οnclick=t(this)>显示隐藏AJAX信息</a><font>")arr.push(self.ajaxLog.join(""))arr.push("</font></font>")if (type) break; default:break;}return arr.join("")}} // 下面几行做一个快速连接,以后调试也不要打那么多字,辛苦啊 $t1 = JsDebug.timeStart$t2 = JsDebug.timeEnd$ajax = JsDebug.ajax$debug = JsDebug.debug$info = JsDebug.msg$msg = JsDebug.msg$warn = JsDebug.warn$error = JsDebug.error // 绑定事件,兼容FF. 唉,又是FF,有Prototype.js的同学可以用 Event.observe(...) function attachDebugEvent(element,name,func) ... { if (element.addEventListener) element.addEventListener(name, func,"false"); if (element.attachEvent) element.attachEvent('on' + name, func)} /**/ /*打开调试窗口,可以按F5查看最新的调试信息。Bug: FF打开新窗口的时候,再次按F5的时候 能取到 opener,但是却取不到opener.JsDebug,*/ function openDebugWin() ... {var html=[]html.push('<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>')html.push('调试窗口</title> <meta name="author" content="Go_Rush(haveatry823@126.com)"> <style>')html.push('*{font-size:14px}p{cursor:pointer}span.url{color:red}xmp{display:inline}hr{height:1px}')html.push('td{text-align:center;font-size:14px}a{display:block;color:blue;margin:10px;width:120px}a.url{margin:0px}')html.push('.debug{color:blue}.error{color:red}.info{color:green}.warn{color:saddlebrown}')html.push('</style><script>function t(o){var e=o.nextSibling;e.style.display=e.style.display=="none"?"":"none"}')html.push('function f(v){var ds=document.getElementsByTagName("div");for(var i=0;i<ds.length;i++){')html.push('if (ds[i].className==v || !v){ds[i].style.display="block"}else{ds[i].style.display="none"}}}')html.push('</'+'script></head><body><script>try{document.write(opener.JsDebug.output())}catch(x){') //html.push('alert(opener);alert(opener.JsDebug);')html.push('alert("程序窗口已经关闭,无法获取调试信息");window.close()}</'+'script></body></html>')var s=html.join("")var w=window.open("about:blank","_debugWin")w.document.open()w.document.write(s)w.document.close()} /**/ /*按一下F12就呼出调试窗口(注意:如果已经呼出过F12,就不会再弹出新窗口,而是更新原窗口内容) Bug:按多几下F12有时候会出错,不知道为什么,其实我想可以用window.open("debug.html","_debugWin")的方式来修复这个Bug,不过这样又新增加了一个debug.html文件,先这样吧,看看还有什么好的解决方法*/ attachDebugEvent(document, " keyup " , function () ... {if (getEvent().keyCode==123) openDebugWin()} ) /**/ /********************debug.js***************************************/ 使用方法举例: < script src = " debug.js " ></ script > < script > var url = location.href$debug(url) </ script > < body onload = " $msg('window onload产生的信息') " > 程序中按下面的方式加入代码,然后按F12键就可以看调试窗口的输出信息javascript调试 在程序中需要输出调试信息的地方,加入代码 $debug( " 一些调试信息 " )$error( " 一些错误信息 " ) // 我最喜欢这样用 try(){...}catch(x){$error(x.message)} $msg( " 信息 " ) // $info和$msg其实是同一个函数 $warn( " 一些警告信息 " )javascript性能查看$t1( " func1 " ) // 开始统计 func1() $t2( " func1 " ) // 结束统计 $t1( " my func " ) // 开始统计 ....... // 这里是一些比较耗时间的代码 $t2( " my func " ) // 结束统计