Номенклатура гидротурбин

Для удобства подбора гидротурбин при проектировании ГЭС необходимо иметь их стандартизированную классификацию. В настоящее время наиболее распространенные поворотно-лопастные и радиально-осевые турбины стандартизованы. Разработана номенклатура турбин, охватывающая диапазон напоров от 5 до 500 м при мощности турбины до 800 МВт. Номенклатура содержит по восемь типов турбин систем ПЛ и РО:

ПЛ15, ПЛ20, ПЛ30, ПЛ40, ПЛ50, ПЛ60, ПЛ70,ПЛ80;

РО45, РО75, РО115, РО170, РО230, РО310, РО400, РО500.

Тип турбины объединяет семейство различных по размерам и мощности, но геометрически подобных турбин. Цифра в написании типа турбины означает максимальный напор в метрах, при котором турбина может работать. Так, тип турбины ПЛ15 означает: поворотно-лопастная турбина, рассчитанная на работу при напоре до 15 м. Для каждого типа турбины в справочных материалах номенклатуры приводятся главные универсальные характеристики.

Пропеллерные, двухперовые, диагональные турбины и горизонтальные поворотно-лопастные турбины для капсульных гидроагрегатов (ПЛК) не стандартизованы. В обозначении типа диагональной турбины дополнительно в знаменателе указывается угол наклона оси поворота лопастей в градусах. Например, тип турбины Д70/60 означает: диагональная турбина, рассчитанная на работу при напоре до 70 м, угол наклона оси поворота лопастей составляет 60 0 .

Для всех типов турбин при их маркировке в знаменателе дополнительной цифрой указывается номер лопастной системы, а через тире указываются также: буквой - вид расположения турбины и цифрой - диаметр рабочего колеса в сантиметрах. Например, маркировка ПЛ20/811 - В - 800 означает, что турбина является поворотно-лопастной, рассчитана на работу при напоре до 20 м, имеет лопастную систему с номером 811, рабочее положение турбины - вертикальное, диаметр рабочего колеса - 800 см.

Сети Х.25 являются самыми первыми сетями с коммутацией пакетов, использованными для объединения корпоративных сетей. Первоначально сети разрабатывались для низкоскоростной передачи данных по линиям связи с большим уровнем помех, и использовались для подключения банкоматов, кассовых терминалов, принимающих кредитные карточки, и для соединения сетей предприятий между собой. Долгое время сеть Х.25 была единственной широко распространенной коммерческой сетью (сеть Internet, как коммерческая стала эксплуатироваться совсем недавно), поэтому для корпоративных пользователей выбора не было. В настоящее время сеть X.25 продолжает успешно эксплуатироваться, используя высоко-скоростные цифровые линии связи для соединения своих коммутаторов. Так, в частности, большинство банков и промышленных предприятий запада используют сеть X.25 для организации удаленного доступа к своим сетям.



Сеть Х.25 состоит из коммутаторов, соединенных между собой по схеме "точка-точка", и работаю-щих с установлением виртуального канала. Для связи коммутаторов могут использоваться цифровые линии PDH / SDH или аналоговые модемы, работающие по выделенной линии. Компьютеры (маршрутизаторы), поддерживающие интерфейс X.25, могут подключаться к коммутатору непосредственно, а менее интеллек-туальные терминалы (банкоматы, кассовые аппараты) – при помощи специального устройства PAD (Packet Assembler Disassembler). PAD может быть встроенным в коммутатор или удаленным. Терминалы получают доступ ко встроенному PAD по телефонной сети с помощью модемов (встроенный PAD также подключает-ся к телефонной сети с помощью нескольких модемов). Удаленный PAD представляет собой небольшое автономное устройство, находящееся в помещении клиента и подключенное к коммутатору через выделен-ную линию. К удаленному PAD терминалы подключаются через COM-порт (интерфейс RS-232C). Один PAD обычно обеспечивает доступ для 8, 16 или 24 терминалов. Терминалы не имеют конечных адресов в сети Х.25 - адрес присваивается только порту PAD.

Адресация в сетях Х.25 строится по следующему принципу: в адресе используются десятичные цифры, длина адреса не может превышать 16 цифр. Если сеть Х.25 не связана с внешним миром, то она может использовать любой адрес. Если же сеть X.25 планирует связываться с другими сетями, то необходимо придерживаться международного стандарта адресации (стандарт Х.121 - International Data Numbers, IDN).

рис. 7.5. Формат адреса в сети X.25

Из приведенного на рис. 7.5 формата адреса видно, что в одной стране может быть только 10 сетей Х.25. Если же требуется пронумеровать больше, чем 10 сетей, то одной стране дается несколько кодов. Например, Россия имела до 1995 года один код - 250, а в 1995 году ей был выделен еще один код - 251.

В адресе могут использоваться не только цифры, но и произвольные символы (для этого к адресу надо добавить специальный префикс), что позволяет универсальным коммутаторам, например коммутато-рам сети ISDN, работать с пакетами сети Х.25.

Основным недостатком сети X.25 является то, что она не дает гарантий пропускной способности сети. Максимум на что она способна – это устанавливать приоритеты для отдельных виртуальных каналов. Поэтому сеть X.25 используется только для передачи компьютерных данных с небольшой пульсацией трафика, и не пригодна для передачи трафика, чувствительного к задержкам (например, голоса). Решением этой проблемы занимаются сети Frame Relay и ATM.

Глобальные сети характеризуются двумя типами технологий соединений:

  • сеть "точка - точка" (point-to-point);
  • сеть "облако" (cloud).

В сети с технологий "точка - точка" каждым двум узлам выделяется отдельная линия, а для объединения N узлов требуется N(N - 1)/2 линий связи. В этом случае получаем высокую пропускную способность и большие расходы на линии связи и интерфейсное оборудование.

Более экономичной технологией сетей WAN являются сети типа "облако". В этом случае для подключения одного узла требуется только одна линия.

По принципу коммутации технология "облако" разделяется на:

  • коммутацию каналов (в телефонных линиях связи);
  • коммутацию сообщений (в E-mail);
  • коммутацию пакетов (в сетях IP, X.25), кадров (в сетях Frame Relay), ячеек (в сетях ATM).

В сетях с коммутацией каналов обеспечивается прямое физическое соединение между двумя узлами только в течение сеанса связи. Достоинством сетей коммутации каналов является возможность передачи аудиоинформации и видеоинформации без задержек.

Кроме того, преимуществом этой технологии является простота ее реализации (образование непрерывного составного физического канала), а недостатком - низкий коэффициент использования каналов, высокая стоимость передачи данных, повышенное время ожидания других пользователей (в узлах коммутации образуются очереди).

В сетях с пакетной коммутацией (PSN - Packet-Switched Network) осуществляется обмен небольшими пакетами фиксированной структуры, поэтому в узлах коммутации не создаются очереди. К достоинствам сетей с коммутацией каналов относятся: эффективность использования сети, надежность, быстрое соединение.

Основным недостатком сетей с пакетной коммутацией является временные задержки пакетов в узлах сети (промежуточном коммуникационном оборудовании), что затрудняет передачу аудиоинформации и видеоинформации, которые чувствительные к задержкам. Технология коммутации кадров (ретрансляция кадров), а особенно коммутация ячеек устраняют эти недостатки сетей с коммутацией пакетов и обеспечивают качественную передачу данных, аудио - и видеоинформации.

Сети с коммутацией каналов представляют для сетей с коммутацией пакетов услуги физического уровня. Аналоговые и цифровые линии применяются в качестве магистралей сетей с коммутацией пакетов, сообщений и кадров.

К глобальным сетям с коммутацией пакетов относятся: сети IP; X.25; Frame Relay; ATM.

Коммутация пакетов в сетях PSN осуществляется двумя способами:

  • Первый способ ориентирован на предварительное образование виртуальных каналов. Существуют два типа виртуальных каналов: коммутируемые и постоянные. Виртуальным каналом называется логическое соединение, осуществляемое по различным существующим физическим каналам, которое обеспечивает надежный двухсторонний обмен данными между двумя узлами. Коммутируемый виртуальный канал обмена данными требует установления (устанавливается динамически), поддержания и завершения сеанса связи каждый раз при обмене данными между узлами. Постоянный виртуальный канал устанавливается вручную и не требует сеанса связи, узлы могут обмениваться данными в любой момент, так как постоянное виртуальное соединение всегда активно.
  • Второй способ основан на технологии дейтаграмм, т.е. на самостоятельном продвижении пакетов в пакетных сетях без установления логических каналов. В сетях с передачей дейтаграмм маршрутизация пакетов осуществляется на пакетной основе. Пакеты снабжены адресом назначения, и они независимо друг от друга движутся в узлы назначения. Таким образом, множество пакетов, которые принадлежат одному сообщению, могут перемещаться к узлу назначения различными маршрутами.
  • Маршрутизация в глобальных сетях TCP/IP осуществляется на основе IP-протокола, т.е. основана на самостоятельном продвижении пакетов. Принцип маршрутизации в глобальных сетях: X.25, Frame Relay, ATM основан на предварительном образовании виртуального канала и передаче в пункт назначения пакетов, кадров или ячеек по этому каналу, т.е. по одному маршруту.

    2.2.1. Сети X.25

    Сети Х.25 являются первой сетью с коммутацией пакетов и на сегодняшний день самыми распространенными сетями с коммутацией пакетов, используемыми для построения корпоративных сетей. Сетевой протокол X.25 предназначен для передачи данных между компьютерами по телефонным сетям. Сети Х.25 разработаны для линий низкого качества с высоким уровнем помех (для аналоговых телефонных линий) и обеспечивают передачу данных со скоростью до 64 Кбит/с. Х.25 хорошо работает на линиях связи низкого качества благодаря применению протоколов подтверждения установления соединений и коррекции ошибок на канальном и сетевом уровнях.

    Стандарт Х.25 определяет интерфейс "пользователь - сеть" в сетях передачи данных общего пользования или “интерфейс между оконечным оборудованием данных и аппаратурой передачи данных для терминалов, работающих в пакетном режиме в сетях передачи данных общего пользования”. Другими словами Х.25 определяет двухточечный интерфейс (выделенную линию) между пакетным терминальным оборудованием DTE и оконечным оборудованием передачи данных DCE.

    На рисунке представлена структурная схема сети X.25, где изображены основные элементы:

  • DTE (data terminal equipment) – аппаратура передачи данных (кассовые аппараты, банкоматов, терминалы бронирования билетов, ПК, т.е. конечное оборудование пользователей).
  • DCE (data circuit-terminating equipment) – оконечное оборудование канала передачи данных (телекоммуникационное оборудование, обеспечивающее доступ к сети).
  • PSE (packet switching exchange) – коммутаторы пакетов.

  • Рис. 1.

    Интерфейс Х.25 обеспечивает:

    Интерфейс Х.25 содержит три нижних уровня модели OSI: физический, канальный и сетевой.

    Особенностью этой сети является использование коммутируемых виртуальных каналов для осуществления передачи данных между компонентами сети. Установление коммутируемого виртуального канала выполняется служебными протоколами, выполняющими роль протокола сигнализации.

    Физический уровень

    На физическом уровне Х.25 используются аналоговые выделенные линии, которые обеспечивают двухточечное соединение. Могут использоваться аналоговые телефонные линии, а также цифровые выделенные линии. На сетевом уровне нет контроля достоверности и управления потоком. На физическом уровне Х.25 реализуется один из протоколов X.21 или X.21bis.

    Канальный уровень

    На канальном уровне сеть Х.25 обеспечивает гарантированную доставку, целостность данных и контроль потока. На канальном уровне поток данных структурируется на кадры. Контроль ошибок производится во всех узлах сети. При обнаружении ошибки выполняется повторная передача данных. Канальный уровень реализуется протоколом LAP-B, который работает только с двухточечными каналами связи, поэтому адресация не требуется.

    Сетевой уровень

    Сетевой уровень Х.25 реализуется протоколом PLP (Packet-Layer Protocol - протокол уровня пакета). На сетевом уровне кадры объединяются в один поток, а общий поток разбивается на пакеты. Протокол PLP управляет обменом пакетов через виртуальные цепи. Сеанс связи устанавливается между двумя устройствами DTE по запросу от одного из них. Максимальная длина поля адреса устройства DTE в пакете Х.25 составляет 16 байт. После установления коммутируемой виртуальной цепи эти устройства могут вести полнодуплексный обмен информации. Сеанс может быть завершен по инициативе любого DTE, после чего для последующего обмена снова потребуется установление соединения.

    Протокол PLP определяет следующие режимы:

  • Установление соединения используется для организации коммутируемой виртуальной цепи между DTE. Соединение устанавливается следующим образом. DTE вызывающей стороны посылает запрос своему локальному устройству DCE, которое включает в запрос адрес вызывающей стороны и неиспользованный адрес логического канала для использования его соединением. DCE определяет PSE, который может быть использован для данной передачи. Пакет, передаваемый по цепочке PSE, достигает конечного удаленного DCE, где определяется DTE узла назначения, к которому пакет и доставляется. Вызывающий DTE дает ответ своему DCE, а тот передает ответ удаленному DCE для удаленного DTE. Таким образом, создается коммутируемый виртуальный канал.
  • Режим передачи данных, который используется при обмене данными через виртуальные цепи. В этом режиме выполняется контроль ошибок и управление потоком.
  • Режим ожидания используется, когда коммутируемая виртуальная цепь установлена, но обмен данными не происходит.
  • Сброс соединения используется для завершения сеанса, осуществляется разрыв конкретного виртуального соединения.
  • Достоинства сети Х.25:

    • высокая надежность, сеть с гарантированной доставкой информации;
    • могут быть использованы как аналоговые, так и цифровые каналы передачи данных (выделенные и коммутируемые линии связи).

    Недостатки сети: значительные задержки передачи пакетов, поэтому ее невозможно использовать для передачи голоса и видеоинформации.

    Зачем перегружать страницу при сортировке HTML-таблицы? Нельзя ли перегруппировать HTML элементы таблицы прямо в браузере, с помощью Javascript?.js (55 строк).

    Сортировка таблицы средствами JavaScript - DOM

    Вопрос когда-то с неизбежностью возникает перед любым добросовестным веб-мастером: зачем перегружать HTML страницу при сортировке таблицы? Нельзя ли перегруппировать HTML элементы таблицы прямо в браузере, без серверных скриптов, с помощью одного только Javascript? Решение задачи и описание решения являются в данном случае одинаково интересными. К моменту, когда вопрос привлёк наше внимание, мы исходили из следующих посылок:

  • HTML элементы таблицы априори можно менять друг с другом местами (в т.ч. сортировать) средствами DOM-Javascript;
  • подобные манипуляции с DOM Node можно (и, в идеале, нужно!) производить с помощью кода Javascript очень небольшого размера, понятного и «прозрачного»;
  • на каком-то популярном ресурсе нам уже встречалась довольно большая таблица, сортируемая без перезагрузки;
  • невероятно, чтобы по такому очевидному вопросу никто ничего не написал в Интернете.
  • Приступив к детальному исследованию, мы, в первую очередь, нашли подозреваемый ресурс; это оказался форум torrents.ru. Ничего утешительного, однако, он нам не принёс: там для сортировки таблицы используется колоссальный плагин с сайта tablesorter.com к чудовищному 200-килобайтному супер-кроссбраузерному «фреймворку» jQuery (который веб-мастера уже довольно привычно пихают куда попало, к месту и не к месту).

    Нет, это не наш путь, это противоречит второй посылке. Нормальный код должен быть коротким и понятным, доступным для объяснения. К тому же, отсутствует «расширяемость» (кому надо копаться в этих монстрах?). Например, довольно быстро натыкаешься на следующее неудобство при сортировке таблиц в torrents.ru: при возвращении на страницу с отсортированной ранее javascript"ом таблицей, таблица открывается в первозданном виде. Как «закрепить» статус сортировки на странице? Это можно было бы сделать с помощью cookie (о чём мы недавно писали в статье о сохранении настроек пользователя), но куда потом в этом jQuery-сортере пихать сохранённые параметры?

    Полезли в Яндугль – проверять 4-ю посылку; там тоже ничего утешительного. На первых местах не очень корректные решения, а два более-менее заинтересовавших нас – на сайтах usa.org.ua и HTMLcoder.visions.ru – оказались «позаимствованными» у буржуев – с сайтов www.leigeber.com/2009/03/table-sorter/ и idontsmoke.co.uk соответственно. Решения при беглом знакомстве показались неплохими, но всё-таки чрезмерно сложными; да и за державу немного обидно.

    Надеемся, что наш скрипт сортировки HTML таблиц будет короче и лучше, а его описание – понятнее. Вот, кстати, он сам – tabsort.js , а вот результат его работы:

    Общая постановка задачи (приблизительный алгоритм)
  • Заголовочная строка. Сортировать надо не все строки таблицы, первая строка должна быть с заголовками, которые остаются на месте. Сортировка должна производиться при щелчке по заголовку столбца; значит, курсор в строке заголовков должен быть «Указатель». При повторном щелчке по тому же заголовку сортировать в обратном порядке.
  • Что именно сортировать? Средствами DOM-Javascript легко получить HTML-коллекцию элементов, в том числе, строк таблицы. Но как сортировать эти элементы (которые в представлении Javascript являются объектами и в примитивном своём значении выглядят все одинаково – как HTMLRowElement)?
  • Очевидно, что сортировать можно только текст , к которому можно получить доступ двумя (примерно) путями: через свойство innerHTML и через nodeValue текстовых узлов.
  • В первом приближении: получаем строки таблицы, innerHTML для каждой – и сортируем. Так возможна сортировка по первому столбцу. Как сортировать по другим?
  • Мы увидели два варианта: 1) насортировать элементы выбранного столбца и потом привести порядок строк в соответствие с полученными новыми индексами; 2) сортировать сразу строки – с помощью пользовательской функции, которая будет сравнивать тексты элементов «щёлкнутого» столбца.
  • Возникла дополнительная задача – сравнить скорость вариантов и выбрать лучший.
  • Заголовки. «Полосатая» таблица.

    Следуя хорошей практике ненавязчивого javascript , мы привязываем какие-то события к объектам не внутри HTML кода, а в скрипте, расположенном в конце страницы. В данном случае объект – таблица. Может быть, не одна таблица на странице. И, может быть, не все таблицы, а избранные. Мы решили избирать их по одному атрибуту: class="sortable". Если у элемента table есть такой атрибут, таблица будет привязана к нужному событию для сортировки.

    Var tex=document.getElementsByTagName("TABLE"); for (var el in tex) { var elem=tex; if (1==elem.nodeType && "TABLE"==elem.tagName && "sortable"==elem.className) { elem.onclick=clicktab; elem.rows.style.cursor="pointer"; //полосатая таблица for (var j = 1; j < elem.rows.length; j++) { if (0==j%2) elem.rows[j].style.backgroundColor="f0f0f0"; elem.rows[j].onmouseover=overtab; elem.rows[j].onmouseout=outtab; } } }

    Попытка получить свойства какого-то объекта (или элементы HTML-коллекции) способом for (var el in obj) не в теории, а в конкретном браузере (не будем показывать пальцем), иногда даёт странные результаты. Именно этим объясняются наши перестраховочные проверки: является ли узел элементом (nodeType 1) и даже имеет ли он tagName "TABLE" (не затесалось ли при выборке getElementsByTagName("TABLE") туда нечто иное!). Нам трудно привести рациональные причины своего поведения в этом случае, но «это работает», а без «этого» у нас когда-то где-то возникали проблемы.

    Назначение избранным таблицам события onclick=clicktab занимает первые 6 строк «инициирующего» кода. Следующие 6 строк посвящены боевой раскраске таблиц в чередующиеся чёрно-белые полосы. Всё равно мы планировали её когда-то описывать, почему бы не сэкономить место и не сделать это заодно. Н-да. И почему бы заодно («Остапа несло») не запрограммировать «подсвечивание» строк таблицы при движении над ними мыши? Это займёт ещё 12 строк:

    Var trcolor; function overtab(e) { e = e || window.event; var obj=e.target || e.srcElement; var tr=obj.parentNode; trcolor=tr.style.backgroundColor; tr.style.backgroundColor="#ccf"; }

    Код функции outtab , возвращающей первоначальный цвет покинутым строкам, как две капли воды похож на overtab (что, конечно, является недостатком и поводом для оптимизации в ближайшем будущем) и находится в файле tabsort.js . Впрочем, оптимизация будет не очень: в коде останутся те же 12 строк; зато логика лучше.

    Подводные камни: как получить строки таблицы?

    Кто знаком с DOM, сразу может подумать о такой конструкции: находим элемент «таблица», получаем список его «детей» – вот тебе и массив строк для сортировки! Вроде document.getElementById("mytable").childNodes . И это будет ошибкой. Таблица – сложный элемент; в каждой таблице обязательно есть (пишем мы его в HTML коде явно или нет) вложенный элемент tbody , и только в нём уже могут находится строки (row ). А ещё в таблице может быть элемент thead , и в нём тоже могут быть строки. А ещё в таблице может быть несколько элементов tbody ! Поэтому получение строк таблицы через интерфейс DOM Node может оказаться довольно сложным. Или надо будет обязать пользователей нашего DOM-сортировщика чётко выдерживать структуру HTML кода таблицы – с обязательным thead и (единственным) tbody .

    К счастью, у DOM интерфейса HTML таблицы HTMLTableElement , в отличие от других HTML элементов, есть особое свойство rows , которое и даёт сквозной список всех строк таблицы, независимо от их положения в thead и разных tbody . С учётом этого код получения всех строк таблицы будет примерно таким: document.getElementById("mytable").rows . Далее, у HTMLTableRowElement , конечно же, есть свойство cells , а у HTMLTableCellElement есть очень важное для нас свойство cellIndex , указывающее порядковое место ячейки в строке, т.е., фактически, номер колонки (которую мы планируем сортировать!).

    Следующая сложность. Ну, получили мы, допустим, список строк. Как его теперь сортировать? То, что мы получили через интерфейсы DOM, называется HTML коллекция ; у этого объекта (или набора объектов) нет метода сортировки (как, впрочем, нет его и ни у одного другого объекта DOM в HTML). Ясно, придётся переводить всё в массив Javascript. Массив сортировать можно. Как потом помещать элементы обратно в дерево DOM в правильном порядке? Как потом (или сначала?) удалять старые элементы, стоящие в неправильных местах?

    Функция сортировки таблицы clicktab

    Код всей системы (с функцией сортировки и привязкой к избранным таблицам) находится в файле tabsort.js и занимает сто с небольшим строк (треть которых – комментарии!:-).В начале и в конце функции стоят строки для учёта времени работы. Основная строка учёта – с alert – закомментирована, если её раскомментировать, будет выскакивать сообщение с числом миллисекунд, затраченных на сортировку таблицы.

    Работа функции начинается при щелчке по любой ячейке «избранной» таблицы (не только по заголовку). В первую очередь, из события «щелчок» (click) мы извлекаем именно тот элемент, по которому был клик. Это, в общем случае, ячейка (элемент td или th ). Мы исходим из того, что это верно. Мы вообще декларируем работу скрипта только при щелчке по заголовкам столбцом. Если в ячейке заголовка планируются вложенные элементы (например, ради особого оформления), в начало функции следует добавить поиск основного элемента th , по аналогии с поиском «родительской» таблицы (этот фрагмент сейчас в функции clicktab закомментирован):

    If ("TD"!=obj.tagName && "TH"!=obj.tagName) { while (("TD"!=obj.tagName && "TH"!=obj.tagName) && null!=obj.parentNode) { obj=obj.parentNode; //ячейка } }

    По причине структурной сложности самой таблицы, примерно так же находится сам элемент table (и записывается в переменную tab). Впрочем, пока вы это читали, данный фрагмент кода устарел и удалён из рабочей версии (до нас вдруг дошло, что именно на таблицу навешено событие click , и значит она доступна внутри функции по слову this ).

    На первый взгляд, несколько спорная строка var tbody=tab.lastChild; – вдруг в таблице будет несколько вложенных tbody? Но, поскольку мы получаем строки таблицы через сквозное свойство rows , для извлечения всех строк нам неважно количество tbody; мы выбираем последний из всех, чтобы поместить туда новый , отсортированный массив со строками.

    Для функции cmprow (a, b), которая непосредственно сортирует массив, нужен тип сортируемых строк. А то для чисел сортировка может получиться в виде «1, 10, 2, 20». Принимаем тип по умолчанию числовой (sorttype="num"); затем, при прохождении в цикле всего сортируемого столбца, проверяем тип каждого текста; и если тип хоть одной ячейки будет не числовым (isNaN), тип всей сортировки назначается строковым (sorttype="str").

    Ещё один спорный момент – innerHTML. У одного из буржуйских предшественников нашего скрипта используется кропотливое циклическое извлечение всех текстов (nodeValue узла textNode) из элементов, вложенных в ячейку. Результат, однако, напоминает нечто вроде strip_tags в PHP. Мы упрощаем этот момент, что, по сути, приводит к группировке однородных по структуре ячеек (например, со ссылками) и к сортировке уже внутри этих групп. Ну, это уже больше вопрос идеологии – как именно надо сортировать. Можно и по извлечённым текстам, игнорируя структуру тэгов – это, скорее всего, не должно сильно замедлить всю процедуру. Да. Поэтому мы таки тоже будем извлекать тексты, но менее изощрённо (точнее, извращённо) - именно по кальке метода strip_tags ; а в резерве останется возможность сортировки с тэгами при удержании клавиши Shift (например). Вот оно, создание массива rarr для последующей сортировки:

    For (var j=1; j 1.

    Сокращать записи вида 1,-1,3,1 нельзя. Это связано с одной особенностью, которая может работать на благо пользователя: последовательные сортировки обрабатывают не начальные данные, а результат последней сортировки. Т.е. последовательные сортировки разных столбцов работают a la Excel, а не как в базе данных (каждый раз с исходной таблицей). Это значит, для сортировки по двум и более столбцам не нужно никаких ухищрений с удержанием клавиши Shift (как предлагает tablesorter.com) и соответствующих усложнений кода - у нас всё и так при последовательных щелчках по разным столбцам работает, как интуитивно ожидает пользователь.

    И это работает быстро, быстрее, чем у плагина tablesorter! Таблица в 400 строк (800К) сортируется за 1.5 секунды (Athlon 999МГц, 512 МБ ОЗУ, Windows XP). А клавишу Shift мы резервируем для обработки разных типов данных: 1) при удержании этой клавиши (в следующей версии программы) будем сортировать HTML код, а не ободранный strip-тэгами текст; 2) добавим сортировку даты, по умолчанию дата будет считаться русской (dd.mm.yy), а при удержании Shift - импортной (mm.dd.yy).

    © 2010, «Деловая неделя», Михаил Гутентог

    Комментарии

    Дилетант 10.02.2013 17:47:04

    Nik_neman 17.02.2012 01:37:17

    День добрый. Использую Big Table Sorter v2.1 (+ JS Data Filter). Данные перед этим вывожу из БД с помощью PHP+MySql... через каждые 10 строк необходимо выводить баннер, названия которого совпадает с текстом предшествующей строчки... решил начать делать постепено и, вывести 10 строчку и 3 столбец... с помощью данного кода: var l = document.getElementById("banners").rows.cells.innerHTML; document.write(l); но мне выводит название, которое хранится в БД. СОРТИРОВКА не учитывается. В javascript не силён. Помогите, пожалуйста, советом. Заранее спасибо.

    Лесник 10.05.2011 16:31:55

    Чайник , можно, если у вас есть доступ к изменению HTML-кода страницы: вы можете добавить свою HTML-таблицу (с атрибутом class="sortable") на любую страницу, сохранить файл и радоваться.

    Чайник 10.05.2011 02:06:57

    Очень нужная задача! А нельзя ли взять работающий сайт с сортировкой таблицы и подсунуть в него свою таблицу (если я владею только HTML)?

    Лесник 08.12.2010 05:19:15

    Iris_din , нет: функция подготовки таблиц к сортировке запускается один раз, по событию "загрузка страницы" (window.onload); если после этого создать (динамически) новую таблицу, она не будет подключена к системе сортировки.

    Впрочем, в текущей версии (файл tabsort.js) я сделал для вас такую возможность: после создания вашей динамической таблицы следует запустить функцию prepTab(t), принимающую теперь в качестве параметра "t" HTML-элемент - таблицу, которую нужно сортировать.

    Лесник 11.12.2010 23:30:41

    Всё, сделал возможность подключать Сортировщики к динамически созданной таблице в обеих версиях: и . Как подключать, написано (с примером) в статье tabsort0.aspx).

    Да, и тут с добавлением комментариев какой-то бардак был - вроде, теперь исправил.

    Iris_din 08.12.2010 01:19:15

    Скажите, работает ли сортировка для динамически созданных таблиц? У меня почему-то не получается.

    Лесник 30.09.2010 18:07:00

    О, да, получить «реальный» индекс ячейки можно. С помощью функции realCellIndex() . Которую специально для этого мне пришлось написать:-). Наверное, можно считать, что готов «релиз» Сортировщика v1.3 – tabsort1.3.js (не забывайте обновлять также ir2.js).

    Краткое описание алгоритмов и трудностей – в статье tabsort1-3.aspx . Примеры работы: thead2.htm , limit1001.htm (большая таблица).

    MrTopa 30.09.2010 02:17:46

    Рано обрадовался. В таком варианте таблицы неправильно определяется реальный индекс колонки второй строки шапки.

    id0TickerPrice Open id1NameName1
    Company
    53ABD126.1
    72AAC512.59
    61ADB47.45
    84DCA19.82
    Можно ли как-то уникально идентифицировать ячейку кроме cell.cellIndex?

    Лесник 29.09.2010 16:06:56

    Да, с innerHTML в ИЕ оказалась полная задница. Работаю сейчас над этим. Потому что всё равно надо – большие таблицы (1000 строк) с использованием innerHTML отрисовываются в ИЕ в десять раз быстрее, чем с помощью appendChild . В других браузерах в 5-7 раз быстрее. Для маленьких таблиц (100-200 строк) это не принципиально.

    Ну, заодно и раскраску проверю.

    MrTopa 29.09.2010 02:59:37

    Спасибо, заработало. Только IE8 (в более ранних не проверял) не захотел принимать строку tbody.innerHTML = newtbody в функции draw(table). Потому закомментировал newtbody и раскомментировал старый вариант, добавив delclass(table.rarr[l].val, "even"); delclass(table.rarr[l].val, "odd"); перед var classN = (l%2) ? "odd" : "even", иначе строки подкрашивались неправильно, а через несколько сортировок подкраска вообще исчезала

    Лесник 24.09.2010 03:57:42

    MrTopa , спасибо за интересную задачу. Заставили меня попотеть. Скачайте скрипт tabsort1.3a.js – с ним указанная вами таблица с заголовком из двух строк (thead.htm) должна сортироваться нормально. Пока не проверял новый скрипт на сохранение параметров сортировки (в тестовом стоит use_cookie = false), остальное, вроде, работает.

    MrTopa 23.09.2010 00:29:38

    Пробую использовать ваш скрипт, все отлично работает если гапка таблицы состоит из одной строки. Мне же нужно сделать сортировку по сложной шапке. Проще объяснить на примере. Есть таблица:

    TickerPrice Open idNameName1

    Мы можем оповещать вас о новых статьях,
    чтобы вы всегда были в курсе самого интересного.

     
    Company
    3ABD126.1
    2BAC512.59
    1CDB47.45
    4DCA19.82