转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 站长学院 >> Web开发 >> 正文
事件驱动的JScript面对象编程         ★★★★

事件驱动的JScript面对象编程

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2123 更新时间:2009/4/23 11:25:54

  在这里分享一下我对JScript的面对象编程的一些认识和一点解决方案。JScript和JavaScript差不多(当然有所不同),但本文中讲到的内容也可用于JavaScript

  JScript支持面对象的一些属性,但他的this指针很奇怪,当有一个对象obj1中的一个成员函数用到this,如果有别一个对象obj2引用该函数,那这个this指向的不是obj1,而是obj2。

下面我们来看一个例子:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>无标题文档</title></head>
<body
>
<p id="text">this is the element "p"</p
>
<script language="jscript"
>
function obj1(){
//类obj1
     this.innerText = "this is obj1"
;
}
function obj1.prototype.fun
(){
     alert(this.innerText
);
}
var o1 = new obj1;
//对象o1
o1.fun();
//显示“this is obj1”
text.onclick = o1.fun; 
//把对象o1的成员函数绑定到HTML元素text中,这是再点击“this is the element “p”。你会发现显示的是this is the element “p”,而不是this is obj1。
</script>
</body></html>

  从上面的例子中我们可以知道JScrpt中函数引用只是引用了函数的入口,并没有保存对象的引用。而this只是简单的指向调用函数的对象而已。JScript并无对象指针这种东西(可能我不知道,如果看文章的您知道的话,请告诉我(QQ:123737))。

  在我们通常写一些要处理HTML元素的onclick事件的时候,我们会这样写

方法一:

<script language="jscript"
>

function fun(obj
){

     alert(obj.innerText
);

}

</script>

<p id="text" onclick="fun(this) ">element</p>



方法二:

<p id="text">element</p
>

<script language="jscript"
>

function fun
(){

     alert(this.innerText
);

}

text.onclick = fun
;

</script>

  上面两个方法的动行结果是一样的,可能你会发现方法一的onclick="fun(this) "直现一些。方法二的fun更理性些。但方法一的fun(this)的this太麻烦了,把代码改成:

<script language="jscript"
>

function fun
(){

     alert(this.innerText
);

}

</script>

<p id="text" onclick="fun()">element</p>

  你会发现这个脚本是不能工作的。为什么??当你用方法一书写时,实际上这时onclick的处理事件是这样的:

function anonymous() { fun(this
) }

  也就是说IE为onclick事件创造了一个匿名函数,并在函数中调用了fun函数。由于调用anonymous的是对象text,所以this就把text的引用传给了fun函数。这时fun中的形参obj就指向text。如果您把事件绑定写成:

<p id="text" onclick="fun()">element</p
>

  则由于调用fun()的是函数anonymous而不是对象text,所以如果您在fun中使用this的话,这里this是不指向任何地方的。如果您alter(this)
的话,您会发现他的值是undefined。

  在方法二中,onclick的处理事件就是fun,所以this是可用的,它指向text。但您千万不要把方法二中fun的定义写成:

function fun(obj
){

     alert(obj.innerText
);

}

  当text响应onclick事件调用onclick时是不传递任何参数给fun的,这时obj就是undefined了。

  问题已经明确,但当我们要响应HTML的事件,而处理的信息又是存在于对象中时又该怎么办呢?(当然处理方法是基于纯事件驱动的)

  我们可以这样:

<p id="text">click this</p
>

<script language="jscript"
>

function obj
(){

     this.innerText = "this is obj"
;

}

function obj.prototype.fun
(){

     var self = this.obj;
//得到obj1的引用。学过Delphi的都知道self是什么意思

//JScript中this是不能重新赋值的,所以用self。学过Delphi的人都知道self是什么意思

     alert(self.innerText
);

}

var obj1 = new obj
;

text.obj = obj1;  
//给text添加一个新的属性obj,并赋于obj1的引用。

text.onclick = obj1.fun
;

</script>

  点击click this结果显示"this is obj"。使用该方法就可以用JScript纯事件驱动的程序了。

  说完了事件驱动的JScript面对象编程。我们来看看一个具体的例子:

  假如我们要在网页上做一种可编辑的Label。正常情怳下它像一般的文本一样。当用鼠标点击它时就变成输入框并可编辑文本的内容。然后当它失去焦点时又恢复成正常文本的样子。

  程序运行的例子如下:

EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText

  程序的源代码如下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
</head>
<body>
<script language="jscript">
function EditableText(_owner){
this.owner = _owner;

this.edit = document.createElement("input");
this.edit.type = "text";
this.edit.onblur = this.onEditBlur;
this.edit.onclick = this.onEditClick;
this.edit.obj = this;

this.span = document.createElement("span");
this.span.innerText = "EditableText";
this.span.obj = this;
this.span.onclick = this.onSpanClick;

this.owner.appendChild(this.span);
}
function EditableText.prototype.onEditClick(){
event.cancelBubble = true;
}
function EditableText.prototype.onEditBlur(){
event.cancelBubble = true;
var self = this.obj;
self.span.innerHTML = "";
self.span.innerText = self.edit.value;
}
function EditableText.prototype.onSpanClick(){
event.cancelBubble = true;
var self = this.obj;
self.edit.value = this.innerText;
this.innerHTML = "";
this.appendChild(self.edit);
self.edit.focus();
}
////////////////////////////////////////////////////////////
function init(){
for(var i=0;i<20;i++){
new EditableText(document.body);
var br = document.createElement("br");
document.body.appendChild(br);
}
}
init();
</script>

</body>
</html>

  注意程序后面的init函数。里面的new EditableText(document.body)只是建立了对象。但是我并无保存建立的对象的引用。而是让对象自己去管理自己。对象的行为都是由事件来驱动的(onclick和onblur),而无须别外的辅助代码。

  程序运行的例子如下:

EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText
EditableText

  程序的源代码如下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
</head>
<body>
<script language="jscript">
function EditableText(_owner){
this.owner = _owner;

this.edit = document.createElement("input");
this.edit.type = "text";
this.edit.onblur = this.onEditBlur;
this.edit.onclick = this.onEditClick;
this.edit.obj = this;

this.span = document.createElement("span");
this.span.innerText = "EditableText";
this.span.obj = this;
this.span.onclick = this.onSpanClick;

this.owner.appendChild(this.span);
}
function EditableText.prototype.onEditClick(){
event.cancelBubble = true;
}
function EditableText.prototype.onEditBlur(){
event.cancelBubble = true;
var self = this.obj;
self.span.innerHTML = "";
self.span.innerText = self.edit.value;
}
function EditableText.prototype.onSpanClick(){
event.cancelBubble = true;
var self = this.obj;
self.edit.value = this.innerText;
this.innerHTML = "";
this.appendChild(self.edit);
self.edit.focus();
}
////////////////////////////////////////////////////////////
function init(){
for(var i=0;i<20;i++){
new EditableText(document.body);
var br = document.createElement("br");
document.body.appendChild(br);
}
}
init();
</script>

&

[1] [2]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Web开发  · 网页制作
    · 平面设计  · 网站运营
    · 网站推广  · 搜索优化
    · 建站心得  · 站长故事
    · 互联动态
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台