先看一段有异常的语句

var sound = 'Roar!';
function myOrneryBeast() {
this.style.color='green';//window没有style属性
alert(sound);
}
myOrneryBeast();

加入try{}catch{}

var sound='Roar';
function myOrneryBeast()
{
this.style.color='green';
alert(sound);
}
try
{
myOrneryBeast();
}
catch (theException)
{
alert('Oops,we caught an exception Name:'
+'theException.name'
+',message:'
+'theException.message'
);
}

应用实例:你自己的调试日志

平时,我们调试js的时候一般都是用alert但是,当例如遇到for(i in document){alert(i);}这样的情况的时候,确实比较头痛,用过Quarzts.net都知道。我呢,也和他类似,在我们的ADS库中添加类似的功能,类似于for(i in document){ADS.log.write(i);},下面呢,我们就开始着手完成这样的功能。

myLogger对象

function myLogger(id)
{
id=id||'ADSLogWindow';
var logWindow=null;//将在内部被对象用来引用日志窗口的DOM节点
var createWindow=function(){};//可以用这个方法在DOM树中创建logWindow节点
this.writeRaw=function(message){};//特权方法用于向日志窗口添加一天记录
} myLogger.prototype=
{
//前面讲的,用字面量语法定义
write:function(message){};//在记录日志使用最频繁的共有方法。
//他会在message中的尖括号进行编码一边在日志窗口中显示HTML源代码,该方法最终会将编码后的消息字符串传递给writeRaw()方法
header.function(message){};//向日志窗口中添加加粗、红色的条目来充当标题 //但是使用字面量不会冗余:比如又增加一个link方法
link:function(link){}; }
//上面代码也可以如下定义
//myLoger.prototype.write=function(message){};
//header.prototype.write=function(message){};//这地方菜鸟有一点不明白,为嘛不是使用//myLoger.prototype.header=function(message){};
//..
//myLogger.prototype.link=function(link){};//好吧,上面可能是因为印刷错误
if (!window.ADS){window['ADS']={};}
window['ADS']['log']=new myLogger();

下面具体分析每个方法

myLogger.createWindow()

//创建受保护的方法创建日志窗口
createWindow=function()
{
//取得新窗口在浏览器中
//居中放置时的左上角位置
var browserWindowSize=ADS.getBrowserWindowSize();//ADS库中的方法。可以看源码,待会贴出来
var top=((browserWindowSize.height-200)/2)||0;
var left=((browserWindowSize.width-200)/2)||0;
//创建作为日志窗口的Dom节点
//使用受保护的logWindow属性维护引用
logWindow=document.createElement('UL'); //指定ID值,以便必要时在DOM树中能够识别他
logWindow.setAttribute('id',id); //在屏幕中居中定位日志窗口
logWindow.style.position='absolute';
logWindow.style.top=top+'px';
logWindow.style.overflow='scroll'; //添加一些样式,以梅花外观
logWindow.style.padding='0';
logWindow.style.margin='0';
logWindow.style.border='1px solid black';
logWindow.style.backgroundColor='white';
logWindow.style.listStyle='none';
logWindow.style.font='10px/10px Verdana , Tahoma,Sans'; //将其添加到文档主体中去
document.body.appendChild(logWindow);
}

getBrowserWindowSize()方法

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)
}
};
window['ADS']['getBrowserWindowSize']=getBrowserWindowSize;

myLogger.writeRaw()方法

this.writeRaw=function(message)
{
//如果初始的窗口不存在。则创建它
if (!logWindow)
{
createWindow();
}
//创建列表想兵适当的添加样式
var li = document.createElement('LI');
li.style.padding='2px';
li.style.border='0';
li.style.borderBottom='1 px dotted black';
li.style.magin='0';
li.style.color='#000';
li.style.font='9px/9px Verdana ,Tahoma,Sans';//其实菜鸟并不知道这样写法是什么意思
//文章后来提到,这样嵌入样式不是个好的方式。
//为日志节点添加信息
if (typeof message='undefined')
{
li.appendchild(document.createTextNode('Message was undefined'))
}else if (typeof li.innerHTML!=undefined)
{
li.innerHTML=message;
}else
{
li.appendchild(document.createTextNode(message));
} //将这个条目添加到日志窗口
logWindow.appendChild(li);
return true; };

当我们运行ADS.log.writeRaw('This is raw.');和 ADS.log.writeRaw('<strong>This is bold!</strong>');浏览器中间会显示:

最后,为创建共有的write()和head()方法,要把下列代码添加到myLogger对象原型中去

myLogger.prototype={
write:function(message)
{
//警告message为空值
if (typeof message=='string' && message.length==0)
{
return this.writeRaw('ADS.log:null message');
}
//如果message不是字符串,则尝试调用toString()方法,如果不存在该访问则记录对象类型
if ( typeof message!='string')
{
if (message.toString)
{
return this.writeRaw(message.toString());
}
else
{
return this.writeRaw(typeof message);
}
} //转换<和>以便innerHTML不会将message作为THML进行解析
message=message.replace(/</g,"&lt;").replace(/>/g,"&gt;");//这里的/g是什么意思。。。
return this.writeRaw(message); //向日志窗口中写入一个标题
header:function(message)
{
message='<span style="color:white;background-color:black;font-weight:bold;padding:0px 5px;">'
+message+'</span>';
return this.writeRaw(message);
}
};

好,整个实例就这么完成了

还有个疑问,这个源码是怎么上传的,菜鸟没用过,找了半天没找到。。。。。待会去问问去。。。

JavaScript DOM高级程序设计 2.4-try{}catch{}--我要坚持到底!的更多相关文章

  1. JavaScript DOM高级程序设计 4.2 事件类型--我要坚持到底!

    对象事件 load和unload(载入页面的时候调用load,关闭页面的时候调用unload) abort和error 对于载入图像时出现错误的情况,可以使用error事件侦听器来进行说明: ADS. ...

  2. JavaScript DOM高级程序设计1.3-常见陷阱--我要坚持到底!

    区分大小写 单引号双引号 大多数开发人员选择用单引号,因为XTHML要求所有XHTML的属性都必须使用双引号 var html='<h2 class="a">A lis ...

  3. JavaScript DOM高级程序设计 7.向应用程序加入Ajax--我要坚持到底!

    有时候,或许是因为理解能力,也或许是因为浮躁,看东西总是不入心,而且还老是想跳过本节,或者赶紧看完本节,这样的恶性循环,让我在即没有真正的学习到知识,又打击我的学习信心,还浪费了我很多事件,我想,当遇 ...

  4. JavaScript DOM高级程序设计 4.3控制事件流和注册事件侦听器--我要坚持到底!

    一.事件流 我们通过下面一个实例,进行说明. <body> <h1>Event Flow</h1> <ul id="nav"> &l ...

  5. JavaScript DOM高级程序设计 3.6 实例 将HTML代码转换成DOM代码(附源码)--我要坚持到底!

    作为一名Web开发者,最讨厌的事情就是重复性任务,摆脱乏味的日常重复性事物的一种方法,是借助可重用的对象或者说与你现在建立的ADS库类似的库,另外一种让事情变得有意思,且能够加速开发进程的方式是编写能 ...

  6. JavaScript DOM高级程序设计 3.-DOM2和HTML2--我要坚持到底!

    由一个HTML进行说明,我就不敲了,直接copy <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" " ...

  7. JavaScript DOM 高级程序设计读书笔记二

    响应用户操作和事件 事件就是操作检测与脚本执行的组合,或者基于检测到的操作类型在某个对象上调用事件侦听器(事件处理程序). 事件的类型 事件可以分为几种类型:对象事件,鼠标事件,键盘事件(只适用于do ...

  8. JavaScript DOM 高级程序设计读书笔记一

    创建可重用的对象 简而言之,对象就是包含一组变量(称为属性)和函数(称为方法)的集合的实例.对象通常由类派生而来,而类中定义了对象拥有的属性和方法.如果你的脚本中都是对象之间的交互操作,那么就可以称之 ...

  9. JavaScript DOM高级程序设计 5动态修改样式和层叠样式表2--我要坚持到底!

    把样式置于DOM脚本之外 style属性 我们可以这样设置前景色之类的属性: element.style.color='red'; 也可以使用下面的代码设置背景颜色: element.style.ba ...

随机推荐

  1. thinkphp 前后版本ajaxReturn方法的分别

    之前用的是thinkphp2的版本现在改到thinkphp3.2已上的版本,发现ajaxReturn这个方法返回的数据不一样了,现在做下记录 thinkphp2的ajaxReturn的实现原码 pro ...

  2. 使用rapid-framework自动生成struct2

    在JavaWeb的开发中,对数据对象的操作不外乎增删改查,不同的数据对象,其action.service.model.jsp等都比较类似,如果手动去写这些代码,工作量大且非常繁琐.一个心高气傲的程序员 ...

  3. DWZ 刷新 dialog

    DWZ刷新dialog: 1,在删除按钮上添加callback属性;如:(callback="dialogAjax") <a class="delImg" ...

  4. 关于Socket编写简单聊天工具的总结(原创)

    这段时间再看socket编程,虽然现在是刚刚接触,但是还是忍不住想写一篇总结,来激励自己努力学习,写的不好的地方,还请大家指教啊! 下面针对一个简单的发送消息和文件的程序说说吧.   首先是服务器需要 ...

  5. laravel方法汇总详解

    1.whereRaw() 用原生的SQL语句来查询,whereRaw('select * from user') 就和 User::all()方法是一样的效果 2.whereBetween() 查询时 ...

  6. 这个SpringMVC的一直刷屏的问题你见过吗?无解

    严重: Servlet.service() for servlet DispatcherServlet threw exceptionjava.lang.StackOverflowError at o ...

  7. java 中的this关键字的几种用法

    转自:http://blog.csdn.net/anmei2010/article/details/4091227 1.     当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在 ...

  8. Linux下crontab详解

    1.crond介绍 crond是Linux下的任务调度命令,让系统定期执行指定程序.crond命令每分钟都会检查是否有要执行的工作,若有要执行的程序便会自动执行. linux下任务调度工作主要分两类: ...

  9. MongoDB 日期 插入时少8小时

    存储在mongodb中的时间是标准时间UTC +0:00  而咱们中国的失去是+8.00 . C#的驱动支持一个特性,将实体的时间属性上添加上这个特性并指时区就可以了.例如:[BsonDateTime ...

  10. SRM 616 ColorfulCoins

    题意:给定一个从小到大的货币面值,每一个面额都是其前面面额的倍数(倍数大于等于2),每一种货币面值对应一种颜色,目前不清楚面值与颜色的对应关系.要求用最少的查询次数来确定面额与颜色的对应关系.(一次查 ...