zoukankan      html  css  js  c++  java
  • 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,"&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);
            }
    };

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

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

  • 相关阅读:
    SpringCloud系列——TX-LCN分布式事务管理
    SpringCloud系列——限流、熔断、降级
    SpringBoot系列——Logback日志,输出到文件以及实时输出到web页面
    常用的js、java编码解码方法
    WebSocket数据加密——AES与RSA混合加密
    使用Fiddler重定向App的网络请求
    C# 调用 taskkill命令结束服务进程
    Install .Net Core For CentOS
    cron表达式详解[转]
    WinServer远程部署系统打包批处理文件
  • 原文地址:https://www.cnblogs.com/sunhan/p/3542373.html
Copyright © 2011-2022 走看看