还是本着学习的目的,实现一个自己的调试日志,界面很简单,就是将调试信息显示在页面的正中央,用一个ul包裹,每条信息就是一个li。

1.新建一个myLogger.js文件,将需要的方法声明一下。其中var声明的是私有成员,可见范围只在构造函数中,每个实例都会保存一套他们的副本。this声明的是特权方法,new的时候会把它绑定到实例上,实例可以直接调用它。在prototype上声明的就是公有方法了,每个实例都可以访问它。最后将一个实例赋值给Lily这个库,Lily就有自己的日志插件了。

function myLogger(id){
id = id || 'LilyLogWindow';
var logWindow = null;
var createWindow = function (){};
this.writeRaw = function (){};
} myLogger.prototype = {
write : function (message){},
header: function (message){}
}; if(!window.Lily) { window.Lily = {}; }
window['Lily']['log'] = new myLogger();

2.先给Lily补充一个方法,因为要显示在页面的中央,所以要获得浏览器窗口的高度和宽度,所以加个getBrowserWindowSize。window.innerWidth和window.innerHeight IE8及之前的版本不支持,document.documentElement在IE6的怪异模式下获取的值不正确。

function getBrowserWindowSize(){
var de = document.documentElement;
return {
width : window.innerWidth || (de && de.clientWidth) || (document.body.clientWidth),
height: window.innerHeight || (de && de.clientHeight) || (document.body.clientHeight)
};
}
Lily['getBrowserWindowSize'] = getBrowserWindowSize;

3.createWindow。这里就设置ul是固定的宽高,这里没用外链css,是因为如果想调试还要加个css,比较麻烦,所以就都在js里写好了。

var createWindow = function (){
var windowSize = Lily.getBrowserWindowSize();
var top = (windowSize.width - 200)/2 || 0;
var left = (windowSize.height - 200)/2 || 0; logWindow = document.createElement("ul");
logWindow.setAttribute("id", id); logWindow.style.position = "absolute";
logWindow.style.left = left + "px";
logWindow.style.top = top + "px"; logWindow.style.width = "200px";
logWindow.style.height = "200px";
logWindow.style.overflow = "scroll"; logWindow.style.border = "1px solid #f1f1f1";
logWindow.style.padding = "0";
logWindow.style.margin = "0";
logWindow.style.listStyle = "none"; document.body.appendChild(logWindow);
};

4.writeRaw,当调用这个方法时,才检查logWindow是否创建,如果没创建,就调用createWindow,注意不要加this,因为createWindow是私有变量,myLogger的实例没有这个方法,而根据闭包,writeRaw可以访问到createWindow。虽然各浏览器都支持innerHTML,但是它不属于w3c规范,所以在用之前要进行一下能力检测,以防以后的浏览器不支持。

this.writeRaw = function (message){
if(!logWindow) createWindow();
var li = document.createElement("li"); li.style.padding = "2px";
li.style.margin = "0";
li.style.borderBottom = "1px dotted #f0f0f0"; if(typeof message == "undefined"){
li.appendChild(document.createTextNode("message is undefined"));
}else if(typeof li.innerHTML != "undefined"){
li.innerHTML = message;
}else{
li.appendChild(document.createTextNode(message));
} logWindow.appendChild(li);
return true;
};

5.write和header。这里write要处理一下信息,去掉html格式,不是string类型的调用toString或者显示它的类型。header就是将message包裹一下。

myLogger.prototype = {
write : function (message){
if(typeof message != 'string'){
if(message.toString){
return this.writeRaw(message.toString());
}else{
return this.writeRaw(typeof message);
}
} if(typeof message == 'string' && message.length == 0){
return this.writeRaw("Lily log : message is null");
} message = message.replace(/</g, '&lt;').replace(/>/g, "&gt;");
return this.writeRaw(message); },
header: function (message){
message = '<span style="color:#fff;background-color:#000;font-weight:bold;padding:0 5px">' + message + '</span>';
return this.writeRaw(message);
}
};

6.测试一下,在一个空白html引入Lily.js, myLogger.js, 写入一些信息。

【写一个自己的js库】 2.实现自己的调试日志的更多相关文章

  1. 【写一个自己的js库】 1.搭个架子先

    最近在看<javascript dom 高级程序设计>,想着跟着里面的代码敲一遍吧,也算是做一下学习笔记吧,所以这不是重新发明轮子,只是个学习的过程. 1.先确定自己的命名空间,并且加入几 ...

  2. 【写一个自己的js库】 5.添加修改样式的方法

    1.根据id或class或tag修改样式,样式名是-连接格式的. function setStyleById(elem, styles){ if(!(elem = $(elem)) return fa ...

  3. 【写一个自己的js库】 3.添加几个处理字符串的方法

    1.生成重复的字符串 if(!String.repeat){ String.prototype.repeat = function (count){ return new Array(count + ...

  4. 【写一个自己的js库】 4.完善跨浏览器事件操作

    1.阻止冒泡. function stopPropagation(event){ event = event || getEvent(event); if(event.stopPropagation) ...

  5. 仿照jquery封装一个自己的js库(二)

    本篇为完结篇.主要讲述如何造出轮子的高级特性. 一. css方法的高级操作 先看本文第一部分所讲的dQuery css方法 //css方法 dQuery.prototype.css=function( ...

  6. 仿照jquery封装一个自己的js库(一)

    所谓造轮子的好处就是复习知识点,加深对原版jquery的理解. 本文系笔者学习jquery的笔记,记述一个名为"dQuery"的初级版和缩水版jquery库的实现.主要涉及知识点包 ...

  7. 仿照jquery封装一个自己的js库

    所谓造轮子的好处就是复习知识点,加深对原版jquery的理解.本文系笔者学习jquery的笔记,记述一个名为"dQuery"的初级版和缩水版jquery库的实现.主要涉及知识点包括 ...

  8. 自己动手写一个iOS 网络请求库的三部曲[转]

    代码示例:https://github.com/johnlui/Swift-On-iOS/blob/master/BuildYourHTTPRequestLibrary 开源项目:Pitaya,适合大 ...

  9. 如何写一个自定义的js文件

    自定义一个Utils.js文件,在其中写js代码即可.如: (function(w){ function Utils(){} Utils.prototype.getChilds = function( ...

随机推荐

  1. bug的处理流程

    又属于一篇普及文,希望自己在被各种技术吸引的同时,能时常来整理和总结软件测试最基本的知识. 从刚工作时接触的第一个缺陷管理工具禅道,到redmine.JIRA.bugzilla ,再到现在的QC,当然 ...

  2. freebsd安装和图形界面安装

    通过上述的安装以后只有命令行界面,没有图形界面,如果想使用X Window就需要安装X 11和GNOME(或KDE). 1. 安装X 11(用root账户) 在确保虚拟机的CD-ROM加载了FreeB ...

  3. ubuntu14.04 安装搜狗输入法

    (1)下载链接 http://pinyin.sogou.com/linux/ (2)清除fcitx $sudo apt-get purge fcitx* (3)使用deb安装工具gdebi,这个工具能 ...

  4. linux source命令学习

    1. linux source命令的作用? 我们可能经常需要修改到诸如/etc/profile,~/.bash_profile等这样的配置文件, 一方面我们希望所作的修改在当前的环境中立即生效: 另一 ...

  5. 2015第10周四-CSS小结

    这两天做前台页面发现个人在CSS前端方法很多基础知识都忘了,晚上又搜索学习了下,把相关内容摘录总结. CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. selector {declara ...

  6. UESTC_秋实大哥与妹纸 2015 UESTC Training for Data Structures<Problem F>

    F - 秋实大哥与妹纸 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 1500/1500KB (Java/Others) Submit ...

  7. linux下java调用.so文件的方法1: JNI

    摘自http://blog.163.com/squall_smile/blog/static/6034984020129296931793/ https://my.oschina.net/simabe ...

  8. 第一个MyBatis程序

    最近研究了一些MyBatis技术,虽然工作中还未用到,但是觉得了解一下也是不错的.这里记录了第一个简单的Demo程序,防止自己忘记. 第一步需要配置Mybatis-config.xml文件.注意:这里 ...

  9. Android应用程序与SurfaceFlinger服务的关系概述和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/7846923 SurfaceFlinger服务负 ...

  10. SQL SERVER 2005 错误:18456

    安装好SQL SERVER 2005之后,Windows身份验证无法登陆,出现18456错误.而sql server 身份验证可以用sa用户登陆. 解决办法: 用sa用户登陆,执行SQL 语句: CR ...