DIV CSS 佈局教程網

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

XBL特性繼承(XBL Attribute Inheritance)

  在這個小節我們將學習特性的繼承方式。

  繼承的特性(Inherited Attributes)

  XBL可以讓我們把復雜組件的實際實現方法隱藏起來。但是用目前為止介紹的功能,我們只能使用同樣的方法建立匿名內容。如果我們可以通過為綁定元素增加特性,來修改內部的元素,將會非常實用。下面是個例子:

XUL:
<searchbox/>
XBL:
<binding id="searchBinding">
<content>
<xul:textbox/>
<xul:button label="Search"/>
</content>
</binding

  在這個例子中,直接在button元 素上增加了一個label特性。現在的問題是,只要綁定到元素上,這個特性就不會發生變化,每次都是這個值。既然這樣,如果這個特性可以在 searchbox上修改值會更加合適一些。XBL提供一種繼承特性,可以從綁定元素的特性上繼承下來。這種特性應該被定義在要繼承外部元素特性的元素 上,在這個例子中應該定義在按鈕上。特性的值要設置為逗號分隔的列表,列表中的每一項都是要繼承的特性名稱。

<xul:textbox xbl:inherits="flex" />
<xul:button xbl:inherits="label" />

  當內容生成後,textbox元素會從searchbox上提取flex特性,而button元素會從searchbox上提取label特性。通過這種方式,每一個綁定元素內部文本框的自適應性和按鈕的標簽都可以不一樣。另外,如果通過腳本修改searchbox上的特性值,會馬上更新textbox和button繼承的特性。你可以根據自己的需要為每個元素都添加繼承特性。

需要注意的是,inherits特性名稱前面使用了“xbl:”前綴,這是XBL命名空間。這個命名空間應該在使用前聲明,通常在定義bindings元素的時候就聲明。下一個例子將對此進行演示:

<bindings XMLns:xbl="http://www.mozilla.org/xbl"
     XMLns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<xbl:binding id="buttonBinding">
<xbl:content>
<xul:button label="OK" xbl:inherits="label"/>
</xbl:content>
</xbl:binding>

  在這個例子中,button按鈕集成了label特性,但這個特性在XBL中同時也被賦了值。這樣做其實就是為label特性設置默認值,如果在XUL中的為label特性賦了值,就會使用這個值,反之如果沒有,則會使用在XBL中定義的默認值。

  我遇到過很多次,兩個不同的元素需要繼承相同名稱的特性。比如說如果建立一個帶有說明的文本框,就需要一個label 元素和一個textbox元素,label 元素需要繼承value特性來設置顯示的文本,而textbox元素也需要繼承value特性來設置文本框內的默認值。為了解決這個沖突,我們需要增加一個不同的特性並把它映射到沖突的一方,就像下面代碼中所演示的一樣:

XUL:
<box class="labeledtextbox" title="Enter some text:" value="OK"/>
CSS:
box.labeledtextbox {
-moz-binding: url('Chrome://example/skin/example.XML#labeledtextbox');
}
XBL:
<binding id="labeledtextbox">
<content>
<xul:label xbl:inherits="value=title"/>
<xul:textbox xbl:inherits="value"/>
</content>
</binding>

textbox元素直接繼承了value特性。而要為label 設置value特性,我們需要一個不同的特性名字並把它映射到value上。我們可以從labeledtextbox上提取title特性,並把它映射到label 元素的value特性上。[內部特性]=[外部特性]這個語法就是用來映射特性的。下面介紹另外一個例子:

XUL:
<box class="okcancel" oktitle="OK" canceltitle="Cancel" image="happy.png"/>
CSS:
box.okcancel {
-moz-binding: url('Chrome://example/skin/example.XML#okcancel');
}
XBL:
<binding id="okcancel">
<content>
<xul:button xbl:inherits="label=oktitle,image"/>
<xul:button xbl:inherits="label=canceltitle"/>
</content>
</binding>

  oktitle的特性值被映射到第一個按鈕的label特性上,而canceltitle特性被映射到第二個按鈕的label特性上。第一個按鈕同時也繼承了image特性,結果如下面的例子所示:

<box class="okcancel" oktitle="OK" canceltitle="Cancel" image="happy.png">
<button label="OK" image="happy.png"/>
<button label="Cancel"/>
</box>

  需要注意的是,匿名內容中的特性名稱有重復。只要一修改box上的相應特性,由於CSS中okcancel這個class建立起來的聯系,兩個按鈕上相應的特性值也會立刻被修改。你可能也已經注意到特性的名字是我們自定義的,這在XUL中是允許的。

  下一節,我們將探討向綁定項中增加屬性、方法和事件。

  譯者注:

  本文(包括接下來翻譯的內容)都會把attribute翻譯成特性,而把property翻譯成屬性。

  attribute主要指在XUL或者XBL文件中,出現在標記中的,比如下面這個label就是一個特性:

  <button label="Cancel"/>

  property主要出現在JavaScript代碼中,可以由對象直接調用的,比如下面這個label就是一個屬性:

   var btn = document.getElementById("cancelButton");
  alert(btn.label);

  更新 - 2008年10月4日

  實際使用的時候,第一次還是沒有通過,反復測試,發現原來是命名空間的問題。

  content內的元素一定要加xul命名空間。

  inherits特性前面一定要加xbl命名空間。


 

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