JavaScript DOM高级程序设计 2.4-try{}catch{}--我要坚持到底!
先看一段有异常的语句
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,"<").replace(/>/g,">");//这里的/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{}--我要坚持到底!的更多相关文章
- JavaScript DOM高级程序设计 4.2 事件类型--我要坚持到底!
对象事件 load和unload(载入页面的时候调用load,关闭页面的时候调用unload) abort和error 对于载入图像时出现错误的情况,可以使用error事件侦听器来进行说明: ADS. ...
- JavaScript DOM高级程序设计1.3-常见陷阱--我要坚持到底!
区分大小写 单引号双引号 大多数开发人员选择用单引号,因为XTHML要求所有XHTML的属性都必须使用双引号 var html='<h2 class="a">A lis ...
- JavaScript DOM高级程序设计 7.向应用程序加入Ajax--我要坚持到底!
有时候,或许是因为理解能力,也或许是因为浮躁,看东西总是不入心,而且还老是想跳过本节,或者赶紧看完本节,这样的恶性循环,让我在即没有真正的学习到知识,又打击我的学习信心,还浪费了我很多事件,我想,当遇 ...
- JavaScript DOM高级程序设计 4.3控制事件流和注册事件侦听器--我要坚持到底!
一.事件流 我们通过下面一个实例,进行说明. <body> <h1>Event Flow</h1> <ul id="nav"> &l ...
- JavaScript DOM高级程序设计 3.6 实例 将HTML代码转换成DOM代码(附源码)--我要坚持到底!
作为一名Web开发者,最讨厌的事情就是重复性任务,摆脱乏味的日常重复性事物的一种方法,是借助可重用的对象或者说与你现在建立的ADS库类似的库,另外一种让事情变得有意思,且能够加速开发进程的方式是编写能 ...
- JavaScript DOM高级程序设计 3.-DOM2和HTML2--我要坚持到底!
由一个HTML进行说明,我就不敲了,直接copy <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" " ...
- JavaScript DOM 高级程序设计读书笔记二
响应用户操作和事件 事件就是操作检测与脚本执行的组合,或者基于检测到的操作类型在某个对象上调用事件侦听器(事件处理程序). 事件的类型 事件可以分为几种类型:对象事件,鼠标事件,键盘事件(只适用于do ...
- JavaScript DOM 高级程序设计读书笔记一
创建可重用的对象 简而言之,对象就是包含一组变量(称为属性)和函数(称为方法)的集合的实例.对象通常由类派生而来,而类中定义了对象拥有的属性和方法.如果你的脚本中都是对象之间的交互操作,那么就可以称之 ...
- JavaScript DOM高级程序设计 5动态修改样式和层叠样式表2--我要坚持到底!
把样式置于DOM脚本之外 style属性 我们可以这样设置前景色之类的属性: element.style.color='red'; 也可以使用下面的代码设置背景颜色: element.style.ba ...
随机推荐
- PHP 魔术方法 __clone __toString(五)
__clone() - 当对象克隆的时候自动加载此方法 __toString() - 当对象需要echo打印输出的时候自动加载此方法 __clone() <?php class example{ ...
- spring 计划任务:cron表达式
Cron表达式是一个字符串,字符串以5或6个空格隔开,分开工6或7个域,每一个域代表一个含义,Cron有如下两种语法 格式: Seconds Minutes Hours DayofMonth Mont ...
- QMessageBox 弹出框上的按钮设置为中文
Qt 默认的弹出框上的按钮式英文,虽然也知道是什么意思,但终究不如中文看着顺眼. QMessageBox box(QMessageBox::Warning,"标题","弹 ...
- Meta标签中的format-detection属性及含义
format-detection翻译成中文的意思是“格式检测”,顾名思义,它是用来检测html里的一些格式的,那关于meta的format-detection属性主要是有以下几个设置: meta na ...
- eclipse安装ermaster建模插件
下载ermaster.jar 放到plugins重启eclipse即可
- sublime 设置localhost 2
最近sidebar用不了了,提示更新然后就自动卸载了: 研究了下其他方式实现: Sublime Text 2 Sublime Text 3 都可以使用: 菜单 --> Tools --> ...
- php微信支付(仅Jsapi支付)详细步骤.----仅适合第一次做微信开发的程序员
本人最近做了微信支付开发,是第一次接触.其中走了很多弯路,遇到的问题也很多.为了让和我一样的新人不再遇到类似的问题,我把我的开发步骤和问题写出来,以供参考. 开发时间是2016/8/2,所以微信支付的 ...
- C语言-人狼羊菜问题-最容易看懂的解决方法及代码
题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种方法,让农夫能够 ...
- 【Passport】微软过时的技术
虽然已过时,没来得及体验,摘录一段别人的文章,假装对passport的了解 微软在过去的身份验证服务上,一直采用的Passport验证,但已经是N年前推出来的一个软件架构,当然也被软件界很多地方采用到 ...
- 关于MySQL Connector/C++那点事儿
如果从官方直接下载的库使用时遇到类似如下的问题: 原因是官方提供的库文件版本与需要的库版本不匹配,提供的debug版本使用的是MT版本,在debug模式下会出现内存错误,导致crash. TestC. ...