博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在ASP.NET Atlas中创建自定义的Behavior
阅读量:5160 次
发布时间:2019-06-13

本文共 3804 字,大约阅读时间需要 12 分钟。

English Version:

Atlas中的Behavior定义了当控件的某个事件被触发时的行为。Behavior可以看作是一种封装了的DHTML的事件,例如click和hover等。Behavior同样可以是一个组件,可被attach到某个Atlas客户端控件上,以提供这个Atlas客户端控件更高级,更丰富的功能,例如一些复杂的拖放(drag & drop),自动完成,浮动等功能。Behavior将被定义在某个Atlas控件的behaviors集合中。

从Atlas文档以及源文件中,我们可以知道Atlas有如下一些内建的Behavior:

  1. Click Behavior:提供对鼠标点击的处理。
  2. Floating Behavior:提供拖放(drag & drop)的效果。
  3. Hover Behavior:提供对DHTML的事件onmouseover,onmouseout,onfocus以及onblur的处理。
  4. Pop-up Component:提供pop-up的功能,可以用来实现高级的tooltip。
  5. Auto-complete Behavior:提供自动完成的功能。这也是Atlas演示中常用的功能之一。这个Behavior还需要服务器端的处理程序。

Click Behavior用来处理DHTML的onclick事件,非常有用但是它提供的功能有些简单。在一些比较复杂的程序中,我们可能需要将左右键的功能分开,例如,左键用来选择,右键用来弹出快捷菜单。虽然我们可以把这个if-else放在Click Behavior的处理函数中,但这并不是好的Atlas的方法。因此,今天我们来编写一个更加强大的Click Behavior,叫做ExtendedClickBehavior,它可以在Behavior的内部就把左右键分开,并且引发出两个不同的事件。通过编写这个ExtendedClickBehavior,您也可以了解在Atlas中创建自定义的Behavior的一般过程。

通常的,创建自定义的Behavior有如下5个步骤:

  1. 继承于Sys.UI.Behavior基类。
  2. 定义您自己的事件以封装DHTML中的事件。这些事件将被用来暴露给其他的Atlas控件以代替原有的,未经修饰的DHTML事件。
  3. 在Behavior的构造函数中为您的事件指定处理函数,并在析构函数中detach事件的处理函数。
  4. 在处理函数中发出相应的事件。在ExtendedClickBehavior的例子中,我们根据鼠标按键的不同来发出不同的事件。
  5. 在getDescriptor()方法中加上对您定义的事件的描述。

下面是ExtendedClickBehavior的JavaScript代码。上述五个步骤在代码内以注释的形式标出。将下面的代码保存为ExtendedClickBehavior.js。

ExpandedBlockStart.gif
ContractedBlock.gif
Sys.UI.ExtendedClickBehavior 
=
 
function
() 
dot.gif
{
InBlock.gif    Sys.UI.ExtendedClickBehavior.initializeBase(
this);
InBlock.gif    
InBlock.gif    
var _clickHandler;
InBlock.gif    
InBlock.gif    
// step 2
InBlock.gif
    this.click = this.createEvent();
InBlock.gif    
this.leftClick = this.createEvent();
InBlock.gif    
this.rightClick = this.createEvent();
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.dispose = function() dot.gif{
InBlock.gif        
// step 3
InBlock.gif
        this.control.element.detachEvent('onmousedown', _clickHandler);
InBlock.gif        Sys.UI.ExtendedClickBehavior.callBaseMethod(
this, 'dispose');
ExpandedSubBlockEnd.gif    }
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.initialize = function() dot.gif{
InBlock.gif        Sys.UI.ExtendedClickBehavior.callBaseMethod(
this, 'initialize');
InBlock.gif
InBlock.gif        
// step 3
InBlock.gif
        _clickHandler = Function.createDelegate(this, clickHandler);
InBlock.gif        
this.control.element.attachEvent('onmousedown', _clickHandler);
ExpandedSubBlockEnd.gif    }
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
this.getDescriptor = function() dot.gif{
InBlock.gif        
var td = Sys.UI.ExtendedClickBehavior.callBaseMethod(this, 'getDescriptor');
InBlock.gif        
InBlock.gif        
// step 5
InBlock.gif
        td.addEvent('click', true);
InBlock.gif        td.addEvent('leftClick', 
true);
InBlock.gif        td.addEvent('rightClick', 
true);
InBlock.gif        
return td;
ExpandedSubBlockEnd.gif    }
InBlock.gif    
InBlock.gif    
// step 4
ExpandedSubBlockStart.gifContractedSubBlock.gif
    function clickHandler() dot.gif{
InBlock.gif        
this.click.invoke(this, Sys.EventArgs.Empty);
InBlock.gif        
if (window.event.button == 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
this.leftClick.invoke(this, Sys.EventArgs.Empty);
ExpandedSubBlockEnd.gif        }
InBlock.gif        
else if (window.event.button == 2)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
this.rightClick.invoke(this, Sys.EventArgs.Empty);
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif}
None.gif
//
 step 1
None.gif
Sys.UI.ExtendedClickBehavior.registerSealedClass('Sys.UI.ExtendedClickBehavior', Sys.UI.Behavior);
None.gifSys.TypeDescriptor.addType('script', 'extendedClickBehavior', Sys.UI.ExtendedClickBehavior);

让我们在页面中测试一下这个ExtendedClickBehavior。在页面上添加一个<div>用来点击,一个label用来显示点击的信息。下面是ASPX文件中的HTML定义。不要忘记在ScriptManager中添加对ExtendedClickBehavior.js文件的引用。

None.gif
<
atlas:ScriptManager 
EnablePartialRendering
="true"
 ID
="ScriptManager1"
 runat
="server"
>
ExpandedBlockStart.gifContractedBlock.gif    
<
Scripts
>
dot.gif
InBlock.gif        
<atlas:ScriptReference Path="ExtendedClickBehavior.js" />
ExpandedBlockEnd.gif    
</
Scripts
>
None.gif
</
atlas:ScriptManager
>
None.gif
<
div
>
None.gif    
<
div 
id
="myButton"
 style
="border: 1px solid black; width: 20em; white-space:normal"
>
Click On Me (Left and Right)!
</
div
>
 
<
br 
/>
None.gif    
<
span 
id
="myLabel"
>
not clicked
</
span
>
None.gif
</
div
>

下面是Atlas脚本定义。注意到我们使用了Atlas的setProperty Action(有关Atlas Action,请见后续文章)用来在每次点击后设置label的text。

None.gif
<
page 
xmlns:script
="http://schemas.microsoft.com/xml-script/2005"
>
None.gif    
<
components
>
None.gif        
<
label 
id
="myButton"
>
None.gif            
<
behaviors
>
None.gif                
<
extendedClickBehavior
>
None.gif                    
<
click
>
None.gif                        
<
setProperty 
target
="myLabel"
 property
="text"
 value
="clicked"
 
/>
None.gif                    
</
click
>
None.gif                    
<
leftClick
>
None.gif                        
<
setProperty 
target
="myLabel"
 property
="text"
 value
="left clicked"
 
/>
None.gif                    
</
leftClick
>
None.gif                    
<
rightClick
>
None.gif                        
<
setProperty 
target
="myLabel"
 property
="text"
 value
="right clicked"
 
/>
None.gif                    
</
rightClick
>
   
None.gif                
</
extendedClickBehavior
>
 
None.gif            
</
behaviors
>
None.gif        
</
label
>
None.gif        
<
label 
id
="myLabel"
 
/>
None.gif    
</
components
>
None.gif
</
page
>

 

浏览器中的运行结果:

没有点击:

atlasbehavior1.JPG

左键点击:

atlasbehavior2.JPG

右键点击:

atlasbehavior3.JPG

上述示例程序可以在此下载:

转载于:https://www.cnblogs.com/dflying/archive/2006/04/12/373419.html

你可能感兴趣的文章
poi的cellstyle陷阱,样式覆盖
查看>>
常用模块一
查看>>
反射基本内容
查看>>
c# 合并两个有序数组
查看>>
MyEclipse性能大提速 终极优化四要点
查看>>
PHP中使用CURL请求页面,使用fiddler进行抓包
查看>>
232. Implement Queue using Stacks Java Solutions
查看>>
16. 3Sum Closest java solutions
查看>>
translation和animation
查看>>
Java Queue-数组队列和循环队列-学习记录
查看>>
jquey ui 实现注册,邮箱自动补全
查看>>
移植u-boot-2010.03 --- 使用tftp下载并运行内核
查看>>
js/jq 选项卡开发js代码
查看>>
算法导论
查看>>
488 - Triangle Wave
查看>>
NSCache使用
查看>>
线程上下文类加载器
查看>>
HttpClient——连接关闭
查看>>
BZOJ2437 NOI2011兔兔与蛋蛋(二分图匹配+博弈)
查看>>
数据库误删了数据再也不用跑路了,
查看>>