Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.09.2011, 10:16
Аспирант
Отправить личное сообщение для stopkran Посмотреть профиль Найти все сообщения от stopkran
 
Регистрация: 12.12.2009
Сообщений: 54

Простой сортировщик HTML таблиц
Simple Table Sorter v 0.01

Подключение:

1) в head HTML-документа добавить две строчки:

<link rel='stylesheet' href='tabsort0.css' type='text/css'>
<script type='text/javascript' src='tabsort0.js'>


2) Добавить сортируемым таблицам атрибут class='sortable'.

3) Распаковать архив SimpleTableSorter.zip в папку с HTML документами.

Функциональность: 1) щелчок по заголовку таблицы сортирует строки; 2) Ctrl + Click по заголовку таблицы приводит таблицу в первоначальное состояние (reset).

Рабочий пример: http://ir2.ru/sorters/table400.htm

Два года писал этот код, и всё никак не могу закончить, всё время кажется, что чего-то в нём не хватает. Он небольшой, можно привести целиком:

-function(){
	
	var hc = function (s, c) {return (" " + s + " ").indexOf(" " + c + " ") !== -1},
	 ac = function (e, c) {var s = e.className; if (!hc(s, c)) e.className += " " + c};
	
	prepTabs = function (t){
		var el, th, ts = (t && t.className) ? [t] : document.getElementsByTagName("table")
		for (var e in ts) {
			el = ts[e]
			if (!hc(el.className, "sortable")) continue
			if (!el.tHead) {
				th = document.createElement("thead")
				th.appendChild(el.rows[0])
				el.appendChild(th)
			}
			th = el.tHead
			ac(th, "c_0_c")
			th.title = "Сортировать"
			th.onclick = clicktab
			el.sorted = NaN
			//reset
			el.tb = el.tBodies[0]
			el.tb_res = el.tb.cloneNode(true) 
			el.th_res = th.cloneNode(true) 
			el.a_color = 0 
		}
	}
	
	var clicktab = function (e) {
		e = e || window.event
		var obj = e.target || e.srcElement;
		while (!obj.tagName.match(/^(th|td)$/i)) obj = obj.parentNode
		var i = obj.cellIndex, t = obj.parentNode, cn = obj.className, verse = /d\_\d+\_d/.test(cn);
		while (!t.tagName.match(/^table$/i)) t = t.parentNode
		var j = 0, rows = t.tb.rows, l = rows.length, c, v, vi;
		
		if (e.ctrlKey) { /* reset */
			t.replaceChild(t.tb_res, t.tb); 
			t.replaceChild(t.th_res, t.tHead); 
			prepTabs(t); 
			return;
		}
		 
		if (i !== t.sorted) {
			if (t.a_color < 9) t.a_color++ 
			else t.a_color = 1
			t.sarr = []
			for (j; j < l; j++) {
				c = rows[j].cells[i]
				v = (c) ? (c.innerHTML.replace(/\<[^<>]+?\>/g, '')) : ''
				vi = Math.round(100 * parseFloat(v)).toString()
				if (isFinite(vi)) while (vi.length < 10) vi = '0' + vi
				else vi = v
				t.sarr[j] = [vi + (j/1000000000).toFixed(10), rows[j]]
				//c.innerHTML = t.sarr[j][0]
			}
		}
		t.sarr = (verse) ? t.sarr.reverse() : t.sarr.sort()
		t.sorted = i
		
		var dir = (verse) ? "u" : "d", new_cls = dir + "_" + t.a_color + "_" + dir,
		 a_re = /[cdu]\_\d+\_[cdu]/;
		if (a_re.test(cn)) obj.className = cn.replace(a_re, new_cls)
		else obj.className = new_cls
		for (j = 0; j < l; j++) t.tb.appendChild(t.sarr[j][1])
		obj.title = "Отсортировано по " + ((verse) ? "убыванию" : "возрастанию")
	}
	window.onload = prepTabs
}()

Последний раз редактировалось stopkran, 10.09.2011 в 10:54.
Ответить с цитированием
  #2 (permalink)  
Старый 10.09.2011, 10:41
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

несколько советов

а так.. код ужат уже. переменные с именами в одну букву.. зачем это делать самому, если GCC сделает это сам?

var hc = function (s, c) {return (" " + s + " ").indexOf(" " + c + " ") !== -1},

var hc = function (s, c) {return !!~(" " + s + " ").indexOf(" " + c + " ") },


..
window.onload = prepTabs

document.addEventListener("DOMContentLoaded", prepTabs, false );
Ответить с цитированием
  #3 (permalink)  
Старый 10.09.2011, 10:59
Профессор
Отправить личное сообщение для with-love-from-siberia Посмотреть профиль Найти все сообщения от with-love-from-siberia
 
Регистрация: 14.12.2009
Сообщений: 155

Вопрос. Как справляется сортировщик с большими таблицами (например, несколько тысяч строк)?
Ответить с цитированием
  #4 (permalink)  
Старый 10.09.2011, 12:14
Аспирант
Отправить личное сообщение для stopkran Посмотреть профиль Найти все сообщения от stopkran
 
Регистрация: 12.12.2009
Сообщений: 54

Сообщение от with-love-from-siberia Посмотреть сообщение
Вопрос. Как справляется сортировщик с большими таблицами (например, несколько тысяч строк)?
Плохо справляется! :-) Посмотрите: http://ir2.ru/sorters/table2000_1.htm. Хотя на самом деле javascript тут ни при чём, просто браузер долго отрисовывает длинную таблицу. Её надо искусственно сокращать, разбивать на страницы, тогда будет хорошо:

http://ir2.ru/sort1/table2000_1.htm
Ответить с цитированием
  #5 (permalink)  
Старый 10.09.2011, 16:11
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от stopkran Посмотреть сообщение
Плохо справляется!
У меня нормуль.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #6 (permalink)  
Старый 11.09.2011, 13:27
Аспирант
Отправить личное сообщение для stopkran Посмотреть профиль Найти все сообщения от stopkran
 
Регистрация: 12.12.2009
Сообщений: 54

Сообщение от melky
!!~(" " + s + " ").indexOf(" " + c + " ")
Идея интересная, но без восклицательных знаков было бы ещё круче.
Ответить с цитированием
  #7 (permalink)  
Старый 11.09.2011, 13:29
Аспирант
Отправить личное сообщение для stopkran Посмотреть профиль Найти все сообщения от stopkran
 
Регистрация: 12.12.2009
Сообщений: 54

Сообщение от Gozar Посмотреть сообщение
У меня нормуль.
Скорость движения роты равна скорости самого плохого солдата. Проверьте на msie.
Ответить с цитированием
  #8 (permalink)  
Старый 11.09.2011, 15:15
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от stopkran Посмотреть сообщение
Идея интересная, но без восклицательных знаков было бы ещё круче.
да ты что. без восклицательных знаков будет тип другой.

хотя можно и без них. все равно дальше будет преобразовываться в буль
Ответить с цитированием
  #9 (permalink)  
Старый 12.09.2011, 15:39
Аватар для NoResponse
Профессор
Отправить личное сообщение для NoResponse Посмотреть профиль Найти все сообщения от NoResponse
 
Регистрация: 17.06.2010
Сообщений: 152

если цель сократить код, то я бы "избавился" от всех... или почти всех var
например вот этот кусочек
...
	    prepTabs = function (t){
	        var el, th, ts = (t && t.className) ? [t] : document.getElementsByTagName("table")
	        for (var e in ts) {
...

можно заменить на
...
	    prepTabs = function (t,   el,th,ts,e){
	        ts = (t && t.className) ? [t] : document.getElementsByTagName("table")
	        for (e in ts) {
...
Ответить с цитированием
  #10 (permalink)  
Старый 13.09.2011, 04:19
Аспирант
Отправить личное сообщение для stopkran Посмотреть профиль Найти все сообщения от stopkran
 
Регистрация: 12.12.2009
Сообщений: 54

Сообщение от NoResponse Посмотреть сообщение
если цель сократить код...
Интересное решение насчёт var. Занятно. Сократить код - одна из целей, но не главная. Важнее всё-таки оставить код логичным, понятным. Например, если переменные из одной буквы, то достаточно очевидные: r - row, c - cell, t - table...

...ну, и сокращение тут происходит не всегда: вариант "function(a, b, c){a = 1; b = 2; c = 3;}" на три буквы длиннее традиционного "function(){var a = 1, b = 2, c = 3;}"
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание HTML страниц Sportlife89 (X)HTML/CSS 7 03.06.2011 15:04
Передача кода HTML Владимир Седов Общие вопросы Javascript 2 12.04.2011 16:48
кеширование HTML переданого через ajax BorisBritva jQuery 6 02.04.2011 01:23
Как с помощью PHP сохранить какие-либо изменения в HTML документе? FirstFrost Работа 6 06.09.2010 16:16
Динамические html элементы sky Элементы интерфейса 2 07.03.2010 11:58