在ASP.NET Atlas中建立自訂的Behavior

來源:互聯網
上載者:User
English Version: http://dflying.dflying.net/1/archive/120_build_your_own_behaviors_in_aspnet_atlas.html

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。

Sys.UI.ExtendedClickBehavior = function() {
    Sys.UI.ExtendedClickBehavior.initializeBase(this);
    
    var _clickHandler;
    
    // step 2
    this.click = this.createEvent();
    this.leftClick = this.createEvent();
    this.rightClick = this.createEvent();
    
    this.dispose = function() {
        // step 3
        this.control.element.detachEvent('onmousedown', _clickHandler);
        Sys.UI.ExtendedClickBehavior.callBaseMethod(this, 'dispose');
    }

    this.initialize = function() {
        Sys.UI.ExtendedClickBehavior.callBaseMethod(this, 'initialize');

        // step 3
        _clickHandler = Function.createDelegate(this, clickHandler);
        this.control.element.attachEvent('onmousedown', _clickHandler);
    }
    
    this.getDescriptor = function() {
        var td = Sys.UI.ExtendedClickBehavior.callBaseMethod(this, 'getDescriptor');
        
        // step 5
        td.addEvent('click', true);
        td.addEvent('leftClick', true);
        td.addEvent('rightClick', true);
        return td;
    }
    
    // step 4
    function clickHandler() {
        this.click.invoke(this, Sys.EventArgs.Empty);
        if (window.event.button == 1)
        {
            this.leftClick.invoke(this, Sys.EventArgs.Empty);
        }
        else if (window.event.button == 2)
        {
            this.rightClick.invoke(this, Sys.EventArgs.Empty);
        }
    }
}
// step 1
Sys.UI.ExtendedClickBehavior.registerSealedClass('Sys.UI.ExtendedClickBehavior', Sys.UI.Behavior);
Sys.TypeDescriptor.addType('script', 'extendedClickBehavior', Sys.UI.ExtendedClickBehavior);

讓我們在頁面中測試一下這個ExtendedClickBehavior。在頁面上添加一個<div>用來點擊,一個label用來顯示點擊的資訊。下面是ASPX檔案中的HTML定義。不要忘記在ScriptManager中添加對ExtendedClickBehavior.js檔案的引用。

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

下面是Atlas指令碼定義。注意到我們使用了Atlas的setProperty Action(有關Atlas Action,請見後續文章)用來在每次點擊後設定label的text。

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

 

瀏覽器中的運行結果:

沒有點擊:

左鍵點擊:

右鍵點擊:

上述樣本程式可以在此下載:http://files.cnblogs.com/dflying/ExtendedClickBehaviorDemo.zip

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.