先看一段有异常的语句

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. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET (转)

    select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型: #include <sys/time.h>       ...

  2. tomcat源码解读(2)–容器责任链模式的实现

    责任链模式:责任链模式可以用在这样的场景,当一个request过来的时候,需要对这个request做一系列的加工,使用责任链模式可以使每个加工组件化,减少耦合.也可以使用在当一个request过来的时 ...

  3. ajax中的post方法中回调函数不执行的问题

    前一段时间接触了JQuery Ajax中的.post()方法和.get()方法,感觉到ajax的简洁和强大,当用到.post()方法时,去W3上查找相关的使用方法,感觉十分简单,用法很明了,然后,直接 ...

  4. 1011. World Cup Betting (20)(最大值)

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  5. C语言获取网页源代码的学习所得

    研究了一天这个玩意感觉挺有意思的. 刚开始是什么都不懂,现在写出来一段代码感觉略微有点意思了. 下面我分享一下学习过程和自己的理解. 整体过程大概就是如下情况: 先搜了一下别人的写这个东西的代码. 研 ...

  6. 零基础学Python 3之环境准备

    一. 配置python 3 环境 1. Python 3 下载 64位 https://www.python.org/ftp/python/3.4.2/python-3.4.2.amd64.msi 3 ...

  7. WinForm调试输出数据

    在调试Winfrom时想知道其中的数据输出 1.单击运行按钮 2.选择调试->窗口->输出 3.单击Winform中要执行的按钮  在输出栏中显示输出数据 4.Ctrl  K  S  能够 ...

  8. Oracle bug 使用max或min函数into到一个char类型报字符缓冲区太小的错误

    这个BUG出现会报错如下: selectto_char(max(RENEWAL_DATE)) intoM_YEAR_MONTH fromt_renewal_schedule; ORA-06502: P ...

  9. mysql优化之sakila测试数据库

    下载地址,选择相应的版本来进行安装测试 http://dev.mysql.com/doc/index-other.html 相关说明 http://dev.mysql.com/doc/sakila/e ...

  10. NGUI系列教程九(自制ListView)

    在NGUI中可以很方便的实现ListView的控件,ListView就好比IOS或Android平台中使用手势上下拖动的控件.在Unity3D中实现ListView的原理无非就两种,第一种是摄像机不动 ...