README.md 4.0 KB
Newer Older
R
RubaXa 已提交
1 2 3 4
# Sortable


## Features
L
Lebedev Konstantin 已提交
5
* Support touch devices and [modern](http://caniuse.com/#search=drag) browsers
R
RubaXa 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
* Built using native HTML5 drag and drop API
* Simple API
* Lightweight, 2KB gzipped
* No jQuery


### Usage
```html
<ul id="items">
	<li>item 1</li>
	<li>item 2</li>
	<li>item 3</li>
</ul>
```

```js
R
* upd  
RubaXa 已提交
22 23
var el = document.getElementById('items');
new Sortable(el);
R
RubaXa 已提交
24 25 26
```


R
* upd  
RubaXa 已提交
27 28 29
---


R
RubaXa 已提交
30 31
### Options
```js
R
* upd  
RubaXa 已提交
32
new Sortable(el, {
R
RubaXa 已提交
33
	group: "name",
34
	store: null, // @see Store
R
RubaXa 已提交
35
	handle: ".my-handle", // Restricts sort start click/touch to the specified element
36
	filter: ".ignor-elements", // Selectors that do not lead to dragging (String or Function)
R
RubaXa 已提交
37 38
	draggable: ".item",   // Specifies which items inside the element should be sortable
	ghostClass: "sortable-ghost",
L
Lebedev Konstantin 已提交
39
	
40 41
	onStart: function (/**Event*/evt) { /* dragging */ },
	onEnd: function (/**Event*/evt) { /* dragging */ },
R
RubaXa 已提交
42

L
Lebedev Konstantin 已提交
43
	onAdd: function (/**Event*/evt){
44
		var itemEl = evt.item; // dragged HTMLElement
R
RubaXa 已提交
45 46
	},

L
Lebedev Konstantin 已提交
47
	onUpdate: function (/**Event*/evt){
48
		var itemEl = evt.item; // dragged HTMLElement
R
RubaXa 已提交
49 50
	},

L
Lebedev Konstantin 已提交
51
	onRemove: function (/**Event*/evt){
52 53 54 55
		var itemEl = evt.item; // dragged HTMLElement
	},

	onFilter: function (/**Event*/evt){
P
Po-Ying Chen 已提交
56
		var itemEl = evt.item; // HTMLElement on which was `mousedown|tapstart` event.
R
RubaXa 已提交
57 58 59
	}
});
```
R
RubaXa 已提交
60

R
* upd  
RubaXa 已提交
61 62
---

R
RubaXa 已提交
63

64 65
### Method

66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
##### closest(el:`String`[, selector:`HTMLElement`]):`HTMLElement|null`
For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.

```js
var editableList = new Sortable(list, {
	filter: ".js-remove, .js-edit",
	onFilter: function (evt) {
		var el = editableList.closest(evt.item); // list item

		if (editableList.closest(evt.item, ".js-remove")) { // Click on remove button
			el.parentNode.removeChild(el); // remove sortable item
		}
		else if (editableList.closest(evt.item, ".js-edit")) { // Click on edit link
			// ...
		}
	}
})
```


86
##### toArray():`String[]`
87
Serializes the sortable's item `data-id`'s into an array of string.
88 89


R
* jsdoc  
RubaXa 已提交
90
##### sort(order:`String[]`)
91 92
Sorts the elements according to the array.
```js
R
* upd  
RubaXa 已提交
93 94
var order = sortable.toArray();
sortable.sort(order.reverse()); // apply
95 96 97 98 99 100 101 102 103 104 105 106
```


##### destroy()


---


### Store
Saving and restoring of the sort.

107 108 109 110 111 112 113 114
```html
<ul>
	<li data-id="1">order</li>
	<li data-id="2">save</li>
	<li data-id="3">restore</li>
</ul>
```

115 116 117 118
```js
new Sortable(el, {
	group: "localStorage-example",
	store: {
R
* JSDoc  
RubaXa 已提交
119 120 121 122 123
		/**
		 * Get the order of elements. Called once during initialization.
		 * @param   {Sortable}  sortable
		 * @retruns {Array}
		 */
124 125 126 127 128
		get: function (sortable) {
			var order = localStorage.getItem(sortable.options.group);
			return order ? order.split('|') : [];
		},

R
* JSDoc  
RubaXa 已提交
129 130 131 132
		/**
		 * Save the order of elements. Called every time at the drag end.
		 * @param {Sortable}  sortable
		 */
133 134 135 136 137 138 139 140 141 142
		set: function (sortable) {
			var order = sortable.toArray();
			localStorage.setItem(sortable.options.group, order.join('|'));
		}
	}
})
```



R
RubaXa 已提交
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
---



### Sortable.utils
* on(el`:HTMLElement`, event`:String`, fn`:Function`) — attach an event handler function
* off(el`:HTMLElement`, event`:String`, fn`:Function`) — remove an event handler
* css(el`:HTMLElement`)`:Object` — get the values of all the CSS properties
* css(el`:HTMLElement`, prop`:String`)`:Mixed` — get the value of style properties
* css(el`:HTMLElement`, prop`:String`, value`:String`) — set one CSS properties
* css(el`:HTMLElement`, props`:Object`) — set more CSS properties
* find(ctx`:HTMLElement`, tagName`:String`[, iterator`:Function`])`:Array` — get elements by tag name
* bind(ctx`:Mixed`, fn`:Function`)`:Function` — Takes a function and returns a new one that will always have a particular context
* closest(el`:HTMLElement`, selector`:String`[, ctx`:HTMLElement`])`:HTMLElement|Null` — for each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree
* toggleClass(el`:HTMLElement`, name`:String`, state`:Boolean`) — add or remove one classes from each element
B
Bitdeli Chef 已提交
158