
- script.aculo.us 教程
- script.aculo.us - 首頁
- script.aculo.us - 概述
- script.aculo.us - 模組
- script.aculo.us - 視覺效果
- script.aculo.us - 拖放
- script.aculo.us - 元素排序
- script.aculo.us - 建立滑塊
- script.aculo.us - 自動完成
- script.aculo.us - 原地編輯
- script.aculo.us 資源
- script.aculo.us - 快速指南
- script.aculo.us - 資源
- script.aculo.us - 討論
script.aculo.us - 元素排序
很多時候,您需要為使用者提供透過拖動來重新排序元素(例如列表中的專案)的功能。
如果沒有拖放功能,重新排序將是一場噩夢,但是script.aculo.us透過Sortable類開箱即用地提供了擴充套件的重新排序支援。要成為Sortable的元素將傳遞給Sortable名稱空間中的create()方法。
Sortable由容器元素中的專案元素組成。當您建立新的Sortable時,它會負責建立相應的Draggables和Droppables。
要使用script.aculo.us的Sortable功能,您需要載入dragdrop模組,該模組還需要effects模組。因此,您script.aculo.us的最小載入如下所示:
<script type = "text/javascript" src = "/javascript/prototype.js"></script> <script type = "text/javascript" src = "/javascript/scriptaculous.js?load = effects,dragdrop"></script>
Sortable語法
這是建立可排序專案的create()方法的語法。create()方法接受容器元素的id,並根據傳遞的選項對其進行排序。
Sortable.create('id_of_container',[options]);
使用Sortable.destroy完全刪除由Sortable.create建立的Sortable的所有事件處理程式和引用。
注意 - 如果引用的元素已經是Sortable,則呼叫Sortable.create會隱式呼叫Sortable.destroy。以下是呼叫destroy函式的簡單語法。
Sortable.destroy( element );
Sortable選項
建立Sortable物件時,您可以使用以下一個或多個選項。
序號 | 選項及說明 |
---|---|
1 |
tag 指定可排序容器內可透過拖放排序的元素的型別。預設為'li'。 |
2 |
only 指定一個CSS類名或類名陣列,可拖動專案必須擁有該類名才能被放置目標接受。這類似於Draggable的accept選項。預設情況下,不應用任何類名約束。 |
3 |
overlap false、horizontal或vertical之一。控制觸發重新排序的點。預設為vertical。 |
4 |
constraint false、horizontal或vertical之一。約束拖動可排序元素的移動。預設為vertical。 |
5 |
containment 啟用在Sortables之間拖放。接受元素或元素ID陣列。重要說明:為了確保兩個容器之間可以進行雙向拖動,請在容器元素之後放置所有Sortable.create呼叫。 |
6 |
handle 與同名的Draggable選項相同,指定用於啟動拖動操作的元素。預設情況下,每個元素都是它自己的控制代碼。 |
7 |
hoverclass 指定一個CSS類名,當拖動元素經過時將其應用於未拖動的可排序元素。預設情況下,不應用任何CSS類名。 |
8 |
ghosting 類似於同名的Draggable選項,如果為true,此選項會導致拖動操作的原始元素保持原位,而元素的半透明副本將隨滑鼠指標一起移動。預設為false。此選項不適用於IE。 |
9 | dropOnEmpty 如果為true,則允許將可排序元素放到空列表中。預設為false。 |
10 |
scroll 如果由於設定CSS overflow屬性而可排序容器擁有捲軸,則此選項啟用超出可見元素的列表自動滾動。預設為false。 |
12 |
scrollSensitivity 啟用滾動時,它會調整觸發滾動的點。預設為20。 |
13 |
scrollSpeed 啟用滾動時,它會調整滾動速度。預設為15。 |
14 |
tree 如果為true,則啟用對可排序元素內的子元素進行排序。預設為false。 |
15 |
treeTag 如果啟用tree選項,則指定子元素的容器元素型別,其子元素參與可排序行為。預設為'ul'。 |
您可以在options引數中提供以下回調函式
序號 | 選項及說明 |
---|---|
1 |
onChange 拖動過程中排序順序發生變化時將呼叫的函式。從一個Sortable拖動到另一個Sortable時,回撥函式將在每個Sortable上呼叫一次。獲取受影響的元素作為其引數。 |
2 |
onUpdate 在導致元素順序發生變化的拖動操作終止時將呼叫的函式。 |
排序示例
此演示已驗證可在IE 6.0中執行。它也適用於最新版本的Firefox。
<html> <head> <title>Sorting Example</title> <script type = "text/javascript" src = "/javascript/prototype.js"></script> <script type = "text/javascript" src = "/javascript/scriptaculous.js"></script> <script type = "text/javascript"> window.onload = function() { Sortable.create('namelist',{tag:'li'}); } </script> <style type = "text/css"> li { cursor: move; } </style> </head> <body> <p>Drag and drop list items to sort them out</p> <ul id = "namelist"> <li>Physics</li> <li>Chemistry</li> <li>Maths</li> <li>Botany</li> <li>Sociology</li> <li>English</li> <li>Hindi</li> <li>Sanskrit</li> </ul> </body> </html>
使用我們的線上編譯器,結合上表中討論的不同選項,更好地理解程式碼。
這將產生以下結果:
請注意tag:'li'的使用。同樣,您可以對`
<html> <head> <title>Sorting Example</title> <script type = "text/javascript" src = "/javascript/prototype.js"></script> <script type = "text/javascript" src = "/javascript/scriptaculous.js"></script> <script type = "text/javascript"> window.onload = function() { Sortable.create('imagelist',{tag:'div'}); } </script> <style type = "text/css"> div { cursor: move; } img { border: 1px solid red; margin:5px; } </style> </head> <body> <p>Drag and drop list images to re-arrange them</p> <div id = "imagelist"> <div><img src = "/images/wml_logo.gif" alt="WML Logo" /></div> <div><img src = "/images/javascript.gif" alt="JS" /></div> <div><img src = "/images/html.gif" alt="HTML" /></div> <div><img src = "/images/css.gif" alt="CSS" /></div> </div> </body> </html>
這將產生以下結果:
序列化可排序元素
Sortable物件還提供一個函式Sortable.serialize(),用於以適合HTTP GET或POST請求的格式序列化Sortable。這可以用於透過Ajax呼叫提交Sortable的順序。
語法
Sortable.serialize(element, options);
選項
建立Sortable物件時,您可以使用以下一個或多個選項。
序號 | 選項及說明 |
---|---|
1 | tag 設定將被序列化的標籤型別。這將類似於Sortable.create中使用的型別。 |
2 |
name 設定將用於建立鍵/值對以進行HTTP GET/POST格式序列化的鍵的名稱。因此,如果name為xyz,則查詢字串將如下所示: xyz[]=value1 & xyz[]=value2 & xyz[]=value3 其中值來自子元素,其順序與它們在容器中出現的順序相同。 |
序列化示例
在此示例中,序列化的輸出將僅提供列表項ID中下劃線後的數字。
要嘗試,請將列表保持其原始順序,按按鈕檢視列表的序列化。現在,重新排序一些元素,然後再次單擊按鈕。
<html> <head> <title>Sorting Example</title> <script type = "text/javascript" src = "/javascript/prototype.js"></script> <script type = "text/javascript" src = "/javascript/scriptaculous.js"></script> <script type = "text/javascript"> window.onload = function() { Sortable.create('namelist',{tag:'li'}); } function serialize(container, name){ $('display').innerHTML = 'Serialization of ' + $(container).id + ' is: <br/><pre>' + Sortable.serialize( container,{ name:name} ) + '</pre>'; } </script> <style type = "text/css"> li { cursor: move; } </style> </head> <body> <p>Drag and drop list items to sort them out properly</p> <ul id = "namelist"> <li id = "list1_1">Physics</li> <li id = "list1_2">Chemistry</li> <li id = "list1_3">Maths</li> <li id = "list1_4">Botany</li> <li id = "list1_5">Sociology</li> <li id = "list1_6">English</li> </ul> <p>Click following button to see serialized list which can be passed to backend script, like PHP, AJAX or CGI</p> <button type = "button" value = "Click Me" onclick = "serialize('namelist', 'list')"> Serialize </button> <div id = "display" style = "clear:both;padding-top:32px"></div> </body> </html>
這將產生以下結果:
在Sortables之間移動專案
以下示例顯示如何將專案從一個列表移動到另一個列表。
<html> <head> <title>Sorting Example</title> <script type = "text/javascript" src = "/javascript/prototype.js"></script> <script type = "text/javascript" src = "/javascript/scriptaculous.js"></script> <script type = "text/javascript"> window.onload = function() { Sortable.create('List1', {containment: ['List1','List2'], dropOnEmpty: true}); Sortable.create('List2', {containment: ['List1','List2'], dropOnEmpty: true}); } </script> <style type = "text/css"> li { cursor: move; } ul { width: 88px; border: 1px solid blue; padding: 3px 3px 3px 20px; } </style> </head> <body> <p>Drag and drop list items from one list to another list</p> <div style = "float:left"> <ul id = "List1"> <li>Physics</li> <li>Chemistry</li> <li>Botany</li> </ul> </div> <div style = "float:left;margin-left:32px"> <ul id = "List2"> <li>Arts</li> <li>Politics</li> <li>Economics</li> <li>History</li> <li>Sociology</li> </ul> </div> </body> </html>
請注意,每個容器的containment選項都將兩個容器列為包含元素。透過這樣做,我們使子元素能夠在其父級上下文中進行排序;它還使它們能夠在兩個容器之間移動。
我們將兩個列表的dropOnEmpty設定為true。要檢視此選項對該列表的影響,請將所有元素從一個列表移動到另一個列表,以便一個列表為空。您會發現它允許將元素放到空列表中。
這將產生以下結果:
繫結到Ajax
當然,onUpdate是觸發對伺服器的Ajax通知的主要候選者,例如,當用戶重新排序待辦事項列表或其他一些資料集時。結合Ajax.Request和Sortable.serialize使即時持久化足夠簡單:
<html> <head> <title>Sorting Example</title> <script type = "text/javascript" src = "/javascript/prototype.js"></script> <script type = "text/javascript" src = "/javascript/scriptaculous.js"></script> <script type = "text/javascript"> window.onload = function() { Sortable.create('List' , { onUpdate: function() { new Ajax.Request('file.php', { method: "post", parameters: {data:Sortable.serialize('List')} } ); } } ); } </script> <style type = "text/css"> li { cursor: move; } ul { width: 88px; border: 1px solid blue; padding: 3px 3px 3px 20px; } </style> </head> <body> <p>When you will change the order, AJAX Request will be made automatically.</p> <div style = "float:left"> <ul id = "List"> <li id = "List_1">Physics</li> <li id = "List_2">Chemistry</li> <li id = "List_3">Maths</li> <li id = "List_4">Botany</li> </ul> </div> </body> </html>
Sortable.serialize建立類似這樣的字串:List[] = 1 & List[] = 2 & List[] = 3 &List[] = 4,其中數字是列表元素ID在下劃線之後的部分識別符號。
現在我們需要編寫file.php程式碼,它將解析作為parse_str($_POST['data']);釋出的資料,您可以對這個排序後的資料執行任何操作。
要了解有關AJAX的更多資訊,請閱讀我們簡單的Ajax教程。