30.10.2010, 09:22
|
Аспирант
|
|
Регистрация: 12.12.2009
Сообщений: 54
|
|
Сообщение от Kolyaj
|
А зачем тут try-catch вообще? Операции сравнения ошибку не бросят.
|
Это остаточное явление. Когда-то в одном из вариантов функции (может быть, при return (a-b)?) ошибки в ИЕ были. Сейчас try-catch уже нету (в последней версии: tabsort3a.js, рабочий пример в 14000 строк: latrus.htm).
Последний раз редактировалось stopkran, 30.10.2010 в 09:42.
|
|
30.10.2010, 09:34
|
Аспирант
|
|
Регистрация: 12.12.2009
Сообщений: 54
|
|
Сообщение от vflash
|
а это просто шедевр. извините
|
Извинить не могу:-). Ирония была бы более-менее оправданна, если бы вы хотя бы про addClass() писали. Это же тайное оружие пролетариата: hasClass() ведь вызывается из addClass(), зачем же два раза ДОМ дёргать, если можно передать для анализа строку? Вы говорите, try-catch (которого, кстати, в последней версии уже нет) замедляет работу. Лишний раз извлекать className элемента - тоже замедляет (особенно с учётом того, что это делается в цикле раз 500 или даже 14000, как в примере latrus.htm).
Последний раз редактировалось stopkran, 30.10.2010 в 09:40.
|
|
30.10.2010, 10:03
|
|
Профессор
|
|
Регистрация: 09.07.2007
Сообщений: 304
|
|
function hasClass(obj, c) {
//http://ir2.ru/javascript-if.aspx
if (!c || !obj) return false // можно просто return
var re = new RegExp('(\\s+|^)' + c + '(\\s+|$)', 'ig') // каждый рас создается новый обьект регулярного выражения. а если с=".*" или пуста "" ? имя класса регистрозависимо.
if (typeof obj == "string") obj = {className: obj} // зачем создаете еше один обьект. это дешево конечно но зачем.
return (re.test(obj.className)) ? re : false // зачем возвращать регулярное выражение ?
}
вот еше, найдите сами.
function getCookie(name) {
var value=new RegExp("(^|;)\\s*"+name+"\\s*\\=\\s*([^;]+)($|;)","i").exec(unescape(document.cookie));
return value && value[2];
}
|
|
30.10.2010, 11:18
|
Аспирант
|
|
Регистрация: 12.12.2009
Сообщений: 54
|
|
Сообщение от vflash
|
return false // можно просто return
|
Можно. Это, наверное, больше вопрос стиля.
Сообщение от vflash
|
// каждый рас создается новый обьект регулярного выражения
|
Думал уже об этом. Но как вынести регэксп из функции, если там используется переменная (c)? Если подскажете решение, буду благодарен.
Сообщение от vflash
|
а если с=".*" или пуста "" ?
|
Если с=".*", не знаю (это в каком месте HTML или CSS кода такое возможно?). Ну, наверное, будет сообщение отладчика "Правило проигнорировано из-за плохого селектора". Если с="" (пуста) будет "return false" (строка 3).
Сообщение от vflash
|
имя класса регистрозависимо.
|
.ть, просмотрел! Не вы первый носом тычете. В "библиотеке" http://ir2.ru/ir2.js исправил, а саму библиотеку из экономии решил к сортировщику не подключать (скопировал туда нужные функции).
Сообщение от vflash
|
if (typeof obj == "string") obj = {className: obj} // зачем создаете еше один обьект. это дешево конечно но зачем.
|
А как? Я допускаю на входе и строку, и объект. Дальше надо проверять
re.test(obj.className)
. Если там всё-таки строка (у obj нету className), условия что ли использовать? Так:
if (typeof obj == "string") re.test(obj.className) else re.test(obj)
? Ну, вероятно, можно как-нибудь в "новом стиле":
re.test(obj && obj.className)
, но это проверять нужно... Руки дойдут - подумаю.
Сообщение от vflash
|
return (re.test(obj.className)) ? re : false // зачем возвращать регулярное выражение ?
|
Всё из той же экономии. В других библиотеках то, что вам не понравилось ("Каждый раз создаётся новый регэксп"), происходит дважды: в hasClass и в addClass (или delClass).
Не знаю, что вам не нравится в getCookie(). Не могу догадаться. Пока они нормально соотносятся с моими же setCookie() и это работает во всех браузерах...
Последний раз редактировалось stopkran, 30.10.2010 в 11:36.
|
|
30.10.2010, 18:31
|
|
Профессор
|
|
Регистрация: 09.07.2007
Сообщений: 304
|
|
эт конечно с потолка взял пример, чтобы указать на ошибку. вообше тут правильно разбивать в массив и потом искать obj.className.split(/\s+/).indexOf(c) . а на практике в начале и конец добавляют пробелы и ишут уже используя (" "+obj.className+" ").indexOf(" "+c+" ") !== -1 , это правда не по стандарту но зато быстро.
в getCookie unescape делать нужно для значения а не для всей куки
|
|
02.11.2010, 04:37
|
Аспирант
|
|
Регистрация: 12.12.2009
Сообщений: 54
|
|
Сообщение от vflash
|
и ишут уже используя (" "+obj.className+" ").indexOf(" "+c+" ") !== -1 , это правда не по стандарту
|
Отчего же это "не по стандарту"? Мне понравилось. Сам давно делаю так на PHP, а тут, видимо, инерция помешала (образцы из чужих библиотек). Теперь сделал hasClass именно так; но для остальных функций (удаление, замена класса) регэксп всё-таки нужен: tabsort3b.js
|
|
02.11.2010, 04:53
|
Аспирант
|
|
Регистрация: 12.12.2009
Сообщений: 54
|
|
Сообщение от vflash
|
в getCookie unescape делать нужно для значения а не для всей куки
|
Я бы с удовольствием, но только не знаю, как получить значение куки без регэкспа, в котором допускаются русские буквы. Что ли сначала делать escape(регэксп), потом получить значение, а потом unescape? Или тоже всё через indexOf, как в jQuery?
Последний раз редактировалось stopkran, 02.11.2010 в 04:59.
|
|
03.12.2010, 07:09
|
Аспирант
|
|
Регистрация: 12.12.2009
Сообщений: 54
|
|
обновление скрипта
Появилась новая версия Сортировщика HTML таблиц - http://ir2.ru/tabsort3.js
Там можно работать "в режиме словаря" (отметить в секции настройки is_dict = true), при этом скрипт будет создавать нечто вроде индексов, позволяющих находить (по целому слову) строку в таблице с очень высокой скоростью.
Пример - http://ir2.ru/latrus.htm (Латинско-русский словарь, 14000 слов).
Ну, и всякие paginate улучшены.
|
|
09.12.2010, 09:03
|
Аспирант
|
|
Регистрация: 12.12.2009
Сообщений: 54
|
|
Simple Table Sorter
Готова версия 0 скрипта Simple Table Sorter. Пример: http://ir2.ru/SimpleTableSorter.zip (13 KB). В нём всего 57 строк:
(function(){
var a_re = /[cdu]\_\d+\_[cdu]/, a_color = 1
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, cs, c, cell, axis, 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
}
}
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
while (!t.tagName.match(/^table$/i)) t = t.parentNode
var cn = obj.className, verse = /d\_\d+\_d/.test(cn),
dir = (verse) ? "u" : "d", new_cls = dir + "_" + a_color + "_" + dir
if (a_color < 8) a_color++
if (a_re.test(cn)) obj.className = cn.replace(a_re, new_cls)
else obj.className = new_cls
var j = 0, tb = t.tBodies[0], rows = tb.rows, l = rows.length, c, v, vi
if (i !== t.sorted) {
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 (!isNaN(vi)) while (vi.length < 10) vi = "0" + vi
else vi = v
t.sarr[j] = [vi, rows[j]]
}
}
t.sarr = (verse) ? t.sarr.reverse() : t.sarr.sort()
t.sorted = i
for (j = 0; j < l; j++) tb.appendChild(t.sarr[j][1])
obj.title = "Отсортировано по " + ((verse) ? "убыванию" : "возрастанию")
}
window.onload = prepTabs
})()
Последний раз редактировалось stopkran, 11.12.2010 в 12:54.
|
|
09.12.2010, 10:35
|
|
|
|
Регистрация: 27.12.2008
Сообщений: 4,201
|
|
Сообщение от stopkran
|
Делать ли таблицу полосатой («зебра»)?
|
Сообщение от Kolyaj
|
Не надо.
|
Kolyaj, а почему?
Последний раз редактировалось x-yuri, 09.12.2010 в 11:42.
|
|
|
|