DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 為XBL元素定義方法
為XBL元素定義方法
編輯:XML詳解     

接下來我們學習如何向XBL中定義的元素添加方法。

  方法(Methods)

  既然可以向XBL定義的元素添加屬性,自然就可以添加方法,這些方法可以在腳本中調用。方法表現為對象的函數,比如“window.open()”。你可以通過method元素為你自己的元素添加自定義方法。下面介紹添加方法的語法:

<implementation>
<method name="method-name">
<parameter name="parameter-name1"/>
<parameter name="parameter-name2"/>
.
.
.
<body>
-- 在這裡編寫方法的腳本代碼 --
</body>
</method>
</implementation>

  方法也是在implementation元素內部定義的,就像字段和屬性的定義方式一樣。method元素包含兩種類型的子元素:parameter元素用來描述方法的參數,body元素用來包含腳本的代碼。

  name特性的值對應於方法的名稱。同樣的,parameter元素上的name特性對應於每個參數的名稱。每個parameter元素對應於一個方法的參數。具體來說,如果方法有3個參數,那麼就會有3個parameter元素相對應。如果方法本身沒有參數,那就不用定義任何parameter元素。

  body元素包含方法調用時要執行的腳本。參數的名稱對應於腳本中的變量,就像真的是從參數傳遞過來一樣。比如把下面這個JavaScript函數放在XBL中可能就是接下來的樣子:

function getMaximum(num1,num2)
{
if (num1<=num2) return num2;
else return num1;
}
XBL:
<method name="getMaximum">
<parameter name="num1"/>
<parameter name="num2"/>
<body>
if (num1<=num2) return num2;
else return num1;
</body>
<method>

這個叫做getMaximum的函數,可以用來比較兩個數的大小,要比較的數會通過參數傳遞給方法。注意那個小於符號被替換成,要不然會和標簽的起 始符號發生混淆。同樣可以把整段代碼包含在CDATA塊中。你可以通過使用類似“element.getMaximum(5,10)”這樣的的代碼來調用 這個方法,element就是包含getMaximum方法的XBL元素的一個引用。

  可以使用parameter標簽為方法定義參數。因為Mozilla使用Javascript作為自己的腳本語言,而且JavaScript是一種弱類型語言,所以不用為參數定義類型。當然在以後,其他語言可能也會和XBL聯合使用。

  訪問匿名內容(Accessing the Anonymous Content)

  你一定遇到過要修改匿名內容裡某些元素的情況,可是這些元素既然是匿名建立的,用常規訪問DOM的方法是不可以的。因為開發者不需要知道他們是怎麼 實現的,只要知道他們是做什麼的就可以,所以他們對於開發者來說是隱藏的。但實際上確實有特殊俄方法可以操作匿名內容裡的元素。

  使用XBL描述行為的元素有一個特別的數組屬性,保存了所有的匿名子元素。數組中的每一項對應於XBL元素下的一個子元素。這個屬性不可以直接訪問,必須使用document的getAnonymousNodes方法來間接訪問:

var value=document.getAnonymousNodes(element);

  在這裡,element;必須設置為包含你要訪問的匿名內容的元素的引用,這個函數返回一個元素數組,對應的就是匿名內容裡的yu俺素。這時如果 要使用哪個元素,直接使用DOM的方法就可以啦,因為對於開發者這些元素現在已經是可見的了。需要注意的是,存在XBL元素嵌套的情況,這時候你可能需要 使用兩次getAnonymousNodes函數。

  

  下面的例子建立一行的按鈕:

<binding id="buttonrow">
<content>
<button label="Yes"/>
<button label="No"/>
<button label="Sort Of"/>
</content>
</binding>

  為了操作這幾個按鈕,你需要使用getAnonymousNodes函數,並把綁定項關聯的元素的引用當作參數傳遞進去,在返回的數組中,第一個按 鈕對應於數組中的第一個元素(getAnonymousNodes(element)[0]),第二個按鈕對應於數組中的第二個元素,第三個按鈕對應於數 組中的第三個元素。如果實在binding的方法中操作,你可以直接傳遞this作為getAnonymousNodes的參數。

  下一個例子建立了一個帶標簽的文本框,而showTitle方法用於切換標簽的顯示狀態,具體做法先要通過匿名元素數組獲取title元素的引用,然後修改該元素的visibility樣式。

XUL:
<box id="num" class="labeledbutton" title="Number of Things:" value="52"/>
<button label="Show" oncommand="document.getElementById('num').showTitle(true)"/>
<button label="Hide" oncommand="document.getElementById('num').showTitle(false)"/>
XBL:
<binding id="labeledbutton">
<content>
<xul:label xbl:inherits="value=title"/>
<xul:label xbl:inherits="value"/>
</content>
<implementation>
<method name="showTitle">
<parameter name="state"/>
<body>
if (state) document.getAnonymousNodes(this)[0].
  setAttribute("style","visibility: visible");
else document.getAnonymousNodes(this)[0].
  setAttribute("style","visibility: collapse");
</body>
</method>
</implementation>
</binding>

在XUL中增加了兩個按鈕,按鈕的oncommand處理程序用來修改標簽的顯示狀態,使用的方法是showTitle,這個方法首先通過傳遞過來 的state參數判斷要執行的操作,是要顯示還是要隱藏,無論哪種情況,都會從匿名數組中提取第一個元素。然後對數組中的第一個元素,也就是第一個標簽進 行操作,通過修改style特性中的visibility部分,達到顯示或者隱藏的目的。

  另一種方式,可以直接從匿名內容中直接通過“parentNode”屬性獲取綁定元素。“parentNode”的作用就是獲取父元素。這樣我們就可以像下面的例子一樣,把顯示和隱藏按鈕轉移到XBL文件中來。

  示例5.1: 源代碼

<binding id="labeledbutton">
<content>
<xul:label xbl:inherits="value=title"/>
<xul:label xbl:inherits="value"/>
<xul:button label="Show" oncommand="parentNode.showTitle(true);"/>
<xul:button label="Hide" oncommand="parentNode.showTitle(false);"/>
</content>
<implementation>
<method name="showTitle">
<parameter name="state"/>
<body>
if (state) document.getAnonymousNodes(this)[0].setAttribute("style","visibility: visible");
else document.getAnonymousNodes(this)[0].setAttribute("style","visibility: collapse");
</body>
</method>
</implementation>
</binding>

oncommand中的處理程序首先獲取父元素的引用,這個父元素可不是指content元素,而是XBL綁定到XUL元素(在這個例子中,是class屬性定義為labeledbutton的box元素)。接下來調用了showTitle方法,這個方法和上個例子是一樣的,就不多說了。

  自定義的屬性和方法是被添加到XBL綁定到的元素下面,而不是定義在content元素下面。這也是我們為什麼要先獲取父元素的原因。

  XUL下的子元素可以通過正常方式獲取,不受children的限制:

XUL:
<box id="outer" class="container">
<button label="One"/>
<button label="Two"/>
<button label="Three"/>
<button label="Four"/>
</box>
XBL:
<binding id="labeledbutton">
<content>
<description value="A stack:"/>
<stack>
<children/>
</stack>
</content>
</binding>

  如果你使用DOM函數“childNodes”獲取全部子元素,可以得到一個id為outer的box元素,而且在box下面還包含四個子元素,這四個元素對應於四個按鈕,哪怕這四個按鈕在界面中是置於stack下的。而stack下面只有一個子元素,就是children元素。對應於outer的匿名元素數組的長度是二,也就是說只有兩個元素,一個是description元素,一個是stack元素。

  構造函數和析構函數(Constructors and Destructors)

  XBL支持兩種特殊的方法,分別對應兩個單獨的標記:constructor和destructor。構造函數在元素綁定時觸發,用於對內容初始化,比如讀取配置文件或者為字段設置默認值之類的操作都放在這裡。析構函數在撤銷綁定的時候調用,通常用於保存信息。

  綁定元素的時候有兩個關鍵點。第一點關於window的顯示過程。所有綁定XBL內容的元素都會調用構造函數,由於是從很多文件中讀取,所以調用的 順序是不確定的。當所有的元素都和綁定項關聯並調用完構造函數以後,window的onload處理程序才會被調用。第二點,當你修改-moz-binding樣式屬性後,會進行重新綁定,原來的綁定將被撤除,這時候會調用原來綁定的析構函數。而新綁定生效後馬上會調用新的構造函數。

  構造函數和析構函數的腳本應該直接寫在相應的標記內,而且每個綁定最多只能有一個構造函數和一個析構函數,而且這兩個函數都不可以帶參數,下面是一個例子:

<constructor>
if (this.childNodes[0].getAttribute("open") == "true"){
this.loadChildren();
}
</constructor>
<destructor action="saveMyself(this);"/>





XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved