Coder at the Doorsill——风中聆听

——走自己的路,让别人打的去吧。
posts - 70, comments - 386, trackbacks - 14, articles - 19
   :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

  有时候会遇到这种情况:在静态的html页面中,安全性要求不是很高,却又需要一个简单的验证。因此只能用javascript实现一个登录验证。用window.prompt来实现却未免太简陋了些,不只密码要写进页面中毫无安全性可言,且不容易修改维护,而prompt的对话框样式各方面都不能定制。因此,想了一个方法来模拟一下:用xml文件来存储用户名密码等信息,用模态窗口来输入密码。ok,立刻开始行动。

一、加载xml文档
  用javascript操作xml文件是这里的关键内容,先看看Javascript怎么加载xml文档吧。
  Internet Explorer 5.0以上的浏览器自带了xml解析器,它支持的常用的节点类型如下:
Node Type Example
Processing instruction <?xml version="1.0"?>
Element <drink type="beer">Carlsberg</drink>
Attribute type="beer"
Text Carlsberg


  下面的代码演示微软的xml解析器中如何加载一个xml文档:
Load XML in IE
  第一行是创建一个Microsoft XML parser的实例,每三行是加载xmlfile的xml文件,第二行是关闭异步传输功能,使解析器在xml文档未被完全加载前不继续执行脚本。
  在Mozilla中加载xml文档:
var xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.load(xmlfile);
  第一个参数定义xml文档的命名空间,第二个参数是文档的根元素,第三个参数总是null,因为还未被应用。

  了解这些,我们就可以写一段兼容主要浏览器的代码来加载xml文档:
loadXML    = function(xmlFile)
{
    
var xmlDoc;
    
if(window.ActiveXObject)
    
{
        xmlDoc    
= new ActiveXObject('Microsoft.XMLDOM');
        xmlDoc.async    
= false;
        xmlDoc.load(xmlFile);
    }

    
else if (document.implementation&&document.implementation.createDocument)
    
{
        xmlDoc    
= document.implementation.createDocument('', '', null);
        xmlDoc.load(xmlFile);
    }

    
else
    
{
        
return null;
    }

    
return xmlDoc;
}

  然后,我们可以对加载进来的xml文档做一些检查:
//do some checking with the loaded xml file.
checkXMLDocObj    = function(xmlFile)
{
    
var xmlDoc    = loadXML(xmlFile);
    
if(xmlDoc==null)
    
{
        alert('Reading XML file is not supported by your browser, please use IE5.
0 or above! ');
        window.location.href
='error.page';
    }

    
    
if (xmlDoc.parseError.errorCode!=0)
    
{
        
var error = xmlDoc.parseError;
        alert(error.reason);
        
return;
    }

    
return xmlDoc;
}

  我将上面两段代码写进一个commonlib.js文件中,方便调用。

二、User类
  在asp.net的应用程序中我们通常设计一个User类来封装用户的各种属性和方法,在这个简单的例子里,不妨在Javascript里也OO一把。
  在JavaScript中可以使用function关键字来定义一个“类”,如何为类添加成员。在函数内通过this指针引用的变量或者方法都会成为类的成员。   如:
function User(name)
{
    
this.name = name;
    
this.methodA(){}
}
  调用时var userA = new User("Tom");通过new User()获得对象userA,对象userA自动获得了属性name和方法methodA。在Javascript中,function本身的定义就是类的构造函数。用new创建对象的过程是这样的:
  (1)当解释器遇到new操作符时便创建一个空对象;
  (2)开始运行User这个函数,并将其中的this指针都指向这个新建的对象;
  (3)因为当给对象不存在的属性赋值时,解释器就会为对象创建该属性,例如在User中,当执行到this.name=name这条语句时,就会添加一个属性name,并把变量name的值赋给它,这样函数执行就是初始化这个对象的过程,即实现构造函数的作用;
  (4)当函数执行完后,new操作符就返回初始化后的对象。
  通过这整个过程,JavaScript中就实现了面向对象的基本机制。由此可见,在JavaScript中,function的定义实际上就是实现一个对象的构造器,是通过函数来完成的。这种方式的缺点是:
  ·将所有的初始化语句、成员定义都放到一起,代码逻辑不够清晰,不易实现复杂的功能。
  ·每创建一个类的实例,都要执行一次构造函数。构造函数中定义的属性和方法总被重复的创建,造成了内存的浪费。

  JavaScript的所有函数都有一个名为prototype的属性,初始化类中的属性时,每个类的成员都会从原型对象中继承相同的属性,也就是说,原型对象提供了类的实例共享的属性和方法,这就节约了内存,而且原型对象还有一个强大的功能,那就是如果通过构造函数实例化一些对象后,再给构造函数的原型对象增加属性和方法,那么它原来实例化的对象实例将会继承这些增加的属性和方法。使用如下:
User.prototype.methodA(){}

  类可以在function定义的函数体中添加成员,又可以用prototype定义类的成员,编程的代码显得混乱。在构造函数中为类添加成员,在增加灵活性的同时,也增加了代码的复杂度。为了提高代码的可读性和开发效率,可以不采用这种定义成员的方式,而使用prototype对象来替代,这样function的定义就是类的构造函数,符合传统意义类的实现:类名和构造函数名是相同的。例如:

function User(name){
    
this.name = name;
}
User.prototype.propertyA 
= ;
User.prototype.methodB 
= function(){}

  进一步改进,可以使用无类型对象的构造方法来指定prototype对象,从而实现类的成员定义:

function User(name){
    
//构造函数;
}
User.prototype 
= {
    propertyA : 
"sample",
    methodB : 
function(){},
    
}

  注意:用这种方式定义时,成员与成员之间用逗号分隔。
  根据一开始提到的情况,我们可以把这个User类的结构简单的定义出来:

function User(name){
    
this.name = name;
}

User.prototype 
= 
{
//check if the name matches the password in the xml file
    checkUser: function(password){},
//get the page which the user would be redirected to, in the xml file too
    getPage: function (){}
}

   
<to be continued...>




 


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-11-09 17:17 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: