Jump to content

s0rr0w

User
  • Posts

    5,139
  • Joined

  • Last visited

  • Days Won

    32

Posts posted by s0rr0w

  1. Вы вон даже простецкого "спасибо" Zeroglif'у не написали, а он ведь потратил кое-какое время на то, чтобы "привести Вас в чувство"...

    :)

    В какое чувство? Человек указывает на какие-то проблемы, которые проблемами то не могут считаться. Это скорее особенности кода, чем баги.

    Я не же указываю вам на то, что именование JS переменных должно происходить по правилам JS, а именно первая должна быть буква. Переменные типа "_" и "$" хоть и работают, но являются синтаксическими ошибками. Но я понимаю, что это особенности кода.

    Я ведь изначально не собирался преподносить Вам готового решения.

    На это я и указывал во многих своих постах. Что все привыкают делать сферических коней в вакууме. Решать задачу в лоб, не задумываясь про повторное использование кода, про масштабируемость систем, про организацию гибких структур.

  2. неужели без кода вам так сложно осо(при)знать проблему!? Через дефис в именах классов пишут на ура, это валидно, удобно (кому-то) и... просто существует в природе:

    Проблему? Да нет проблемы, проблема снова же сугубо в вашем воображении. Я уже написал, что достаточно кодеру дать пояснения по поводу именования классов и не заморачиваться.

    Да, кстати, а где ваш "супер-беспроблемный" код? Не надо меня отсылать куда-то там... Код, Штирлиц, код!

    Теперь я думаю, вы сможете вс? это переварить, сделаете выводы и перестанете просить от меня решения, оно элементарное, ваша "библиотека" должна к нему прийти. Надеюсь, ответил, поехали дальше...

    Право же, не перестаете меня умилять.

    Да, вызов getElementsByClassName непосредственно в inline-обработчике будет приводить к перекрытию вызова. Но никто не мешает написать window.getElementsByClassName. Да и покажите мне человека, который собирается писать javascript-опусы непосредственно в inline-обработчиках? Вызывая любую кастом-функцию внутри тела можно спокойно обращаться через getElementByClassName без указания window. Так я не понял, в чем проблема то? В перекрытии функций в очень специфических случаях? Так эта проблема есть всегда и с любым кодом.

    Надеюсь и тут я ответил вполне конкретно...

    Да вполне. Так, кажется я пользовался старыми данными по JS-интерпретатору. Цикл в современных браузерах уже работает на уровне do-while и while. Можно смело переписывать код.

    a) не увеличивать своим кодом общий объ?м мирового javascript-трэша;

    б) не считать себя командным результативным космокодером;

    б) не лезть в спор без штанов.

    а) зачем вам вообще познания в JS, если вы все равно пишете трэш-код?

    б) после моего увольнения из одной команды разработчиков, на мое место до сих пор не могут найти человека. :) я не считаю себя космо-кодером, но количество багов в моих кодах до сих пор минимально. В отличие от моих сокоммандников.

    в) это к вам относится в аналогичной мере.

  3. Так вот я выполнял свою задачу - обработал предложенную мной структуру.

    :cool:

    Именно этого ответа я ждал. Итак, была предложена структура, структура обработана. Задача выполнена! А то, что это сферический конь в вакууме, никого не интересует.

    Одно из самых простых требований к нормальному программисту - умение смотреть хотя бы на шаг вперед, а не механически выполнять задачу. Нет простых задач по определению. Вечно кроется какое-то западло в самом тривиальном месте. Именно поэтому для меня скрипт для табов куда сложнее задача, чем многим кажется.

  4. AKS, прокомментируйте следующее, пожалуйста.

    1. DT, DD нельзя использовать без DL. Последствия переноса части кода в другую ветку дерева может привести к потенциальному багу с отображением.

    2. В вашем JS коде жестко закреплена структура. Что будет, если после H будет стоять что-то другое? Например еще один H. Вполне реальная ситуация.

    3. Ссылки создаются скриптом. Что делать, если понадобится уникальные коды для каждой закладки, где не только CSS будет изменен, но и отличаться HTML?

    4. Таблицу нельзя использовать после H, так как присваивается display: block.

    5. Что делать, если надо будет между контентом табов и самим переключателем вставить еще какие-то теги?

    6. Что будет, если контент таба будет удален или перемещен?

    Ответьте на эти вопросы, только спокойно, рассудительно, без эмоций.

  5. Посмотрел. Не сотрясайте воздух, отсылая меня на перечитку плиз. :)

    Тогда мне непонятно, почему вам непонятно. Вот я и сомневался, что вы достаточно хорошо изучили принципы работы моего кода.

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

    Не надо меня отсылать куда-то там. Приведите код. Это добавит вам уважение как к человеку, который умеет доказать свои слова делом.

    Правильный пример определения IE вам не нужен, опирайтесь на соответсвующие проверки нужного по месту свойства. Как минимум.

    Смысла в этом не вижу. Есть IE, который для меня существует всего в 2-х версиях, есть DOM-ориентированные браузеры. Зачем что-то придумывать, если можно спокойно ограничиться такой проверкой? Люди, которые сознательно идут на подмену юзерагента пусть также сознательно и сталкиваются со всеми вытекающими последствиями. Мало того, это редко распространенная практика в корпоративном секторе.

    Скорость do-while разнится у браузеров, говорю ещ? раз, стараясь побороть ваше обобщение. Суть же дела не в скорости, а в бездумном использовании конструкции не к месту, как же вы упрямо не понимаете этого.

    Итак, я задал вопрос, какой самый быстрый цикл. В ответ я получаю про разницу в скорости. Использование конструкции как раз к месту, так как это самая быстрая конструкция. Да, немного неудобная, но зато выполняет возложенную на нее фукнцию.

    Чтобы одновременно рассеять ваши заблуждения по поводу inline-обработчиков и т.н. интерфейса документа тупо приведу пример:

    И какие же заблуждения мои должны были рассеяться? Я скачаль альфу оперы, запустил код. Граблей не нашел вообще. Они находятся сугубо в вашем воображении. Моя функция является методом объекта window, встроенная - document'a. Где грабли? В том, что две фунции имеют одинаковое название? Это смешно. И в чем проблемы с inline-обработчиками, поясните мне темному, может я чего пропустил.

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

    Ах, какие высокопарные слова. Если вы делаете по другому, то это не значит, что мой код не содержит идей.

    Например, я использую обращение к элементам по имени классов. Это куда лучше обращения по ID. Я использую HTML темплейтирование, вместо создания нод при помощи createElement, и не видеть выгоду от этого считаю узостью мышления. Активация по эмуляции клика - тоже не считаю архаикой, а как раз наоборот. Да, я согласен, что на первый взгляд код кажется именно таковым, каким вы описали. Но не видел вашего супер-кода, а поэтому вообще сомневаюсь в ваших способностях. Говорить красивые слова каждый умеет :(

  6. Вс?-таки вы афишируете сво? решение на публичном форуме' date=' нужно предполагать и копипаст, и слабый анализ, а вы могли бы запросто обойтись без вычленения IE таким способом. Запросто. Не подавая другим плохой пример.[/quote']

    Подайте хороший пример, напишите правильный код определения IE.

    IE6 тоже старь?. IE7 в смысле BOM/DOM/Javascript почти такое же старь?. Много чего нового не держит, но нельзя же из принципа отказывать их пользователям в рабочем скрипте.

    Перечитайте то, что было написано мной про искусственное ограничения количества платформ. Речь идет не про сайты, а про бэк-энд системы.

    Кстати, если говорить не о старье, а о потенциальном свежаке, то как насч?т занятого вами идентификатора getElementsByClassName, который в перспективе забивать не хотелось бы...

    Ничего не занято. В DOM будет использован в качестве интерфейса документ или нода. Но никак не window.

    Не проще ли взять другой ограничитель, как это делает подавляющее большинство. Нет? Думаю, вы просто не держали этого в уме.

    Например? Давайте все познавать на примерах. Ваш вариант ограничителя?

    Скорость циклов разнится от браузера к браузеру. Если уж это так важно, то while был бы достаточен, do предполагает разовое действие вне условий, что совершенно тут не к месту пришлось. Я не прав?

    Докажете, что do-while не самый быстрый, перепишу код на самый быстрый.

    Поясните, конечно.

    Текущее положение ноды не является константой. Если привязывать данные к какому-то паренту, то при изменении структуры может быть потеряна связь. Или же наоборот, нужно принудительно терять связь у данной ноды с ее парентом. Как вариант - перемещение таба в другое место, в другой табулятор.

    Тоже поясните, не заметил.

    Внимательно изучите код. Там уж более чем понятно все расписано.

    Дописав класс, мы ж не удаляем прежний. Ищется как всегда, анализируя className, ничего необычного.

    А какой из них был дописан? Вы код смотрели? У меня там как раз для этого случая сделан пример :)

    В рамках этого конкретного мира табов это константа, другое дело, что сам мир не инкапсулирован, все тяготы и лишения несут на своих плечах ноды.

    Это их карма

    Смайлик погрустнел бы, зная вы сколько раз мне пришлось ответить по поводу этого бага.

    Суть изложите. В моей практике пока что не было серьезных проблем.

    Бажность характеризуется наличием багов

    Хоть один пример в студию.

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

    Чтобы вызвать функцию переключения таба, нужно будет передать все необходимые параметры, а эти параметры нужно будет привязать к опшинам. Не проще ли хранить параметры в одном месте? Вы код вообще изучали?

    И я про это. Реальной проверки чего-либо нет, но есть для галочки, чтоб не пугались... :)

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

    Скрипт привязан к точке, а не к событию, модификация HTML может смещать точку, нужно за эти следить и проч. отвлеч?нные предметы.

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

    "Плохость" в том, что это слабо сочетается с такими важными словами, как "компонента", "отделение от содержания", "корректное взаимодействие обработчиков", "современный код" и т.д..

    Напишите метод сильного сочетания. :(

    В любом случае за отдельный кусочек кода будет отвечать какой-то компонент. Чтобы привязаться к обработчику onclick данного компонента все равно придется выполнить передачу параметра. Нет разницы как это будет сделано, или же через идентификацию + листенер, или же прямой записью функции в тело onclick обработчика.

    В общем смысле у inline-обработчиков масса малоизвестных неприятных особенностей, но они вполне себе работоспособны.

    Например?

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

    Давайте ваш пример кода, как модерновый, неархаичный, с чистой и прозрачной логикой и с великолепным результатом в конце. Или все так и будет на уровне светских бесед?

    p.s. в принципе согласен про уровень абстракции, только на мой взгляд вы слишком расслабляете табы, им незачем так расслабляться, их роль и взаимодействие должны быть заранее определены и в какой-то степени зафиксированы...

    На практике все куда хуже. Табы требуют очень сильной абстракции, куда более высокой, чем в моем примере. Потому как вариантов реализации масса.

  7. А писал я о том, что люди, отвергающие теорию в пользу своих "шишек", превратили веб в помойку.

    Смелое заявление. Теория тем и хороша, что только теория. Практика требует куда больших уровней абстракций при работе с кодом. Что есть HTML? Всего лишь контейнер. Контейнер для данных. Количество тегов строго ограничено. А вот названия классов - нет. Именно поэтому абстракция кода на уровне классов - более масштабируемое решение по причинам отсутствия ограничивающих факторов. Это не помойка, это просто альтернативный вариант.

  8. Мой оппонент изначально отверг вариант с использованием стандартной разметки и логики.

    Ваш код как раз показывает, почему я ее отверг. Итак, стоит задача сделать табы разноцветными. Что нужно сделать в вашем коде? Написать новый обработчик. Нужно сделать табы в табах. Что надо сделать? Написать новый обработчик? Переписать код? Нужно усложнить HTML структуру закладки, как того требует дизайн. Что надо сделать в вашем коде? Снова написать новый обработчик. Через пару месяцев интеграции вашего кода в какой-либо интерфейс у вас будет десятка два абсолютно бесполезных обработчиков, разобраться в логике работы которых будет ой как сложно. Вот и получился выигрыш в одном месте, но это пиррова победа.

    И не спешите, также как и s0rr0w, подчеркнуть свой статус. Я ни в его команду, ни в вашу не прошусь, следовательно не нужно писать, кого Вы выбираете, а кого нет. Еще раз говорю - здесь речь не об этом.

    Задели личное самолюбие? Ну извини тогда. На личности я переходить не люблю, поэтому пропускаю мимо ушей попытки втянуть в дискуссии такого характера.

  9. Что мне не сильно нравится в коде -- отсутствие идеологии, я предпочитаю красивые решения.

    Я сильно упростил решение в JS части, но в HTML - вполне себе нормальная идеология, построенная на идентификации функциональной принадлежности по классам. HTML продиктован сугубо минимизацией затрат на темплейтирование и создание более сложных вариаций и комбинаций.

  10. Кроссбраузерность играет роль сугубо только для сайтов. Для корпоративных интранет и интернет систем - кроссбраузерность почти не играет роль. Попробуйте в государственный сектор продвинуть как стандарт FF. :)

    Монополия приносит MS огромный успех. :( И даже если есть хитрые, быстрые, умные, то это им мало помогает. FF как платформа в десятки раз лучше IE, но, увы, монополия делает "успех" IE.

    А это вообще зачем?

    Показать разницу мышления при работе над конечной задачей. И, как результат, абсолютно разный код.

    Основная задача, которая преследовалась, показать, что ради лучшей масштабируемости и простоты в работе над кодом можно пренебрегать логической разметкой HTML, перенеся логику на CSS-классы. Кстати, с удивлением обнаружил в коде MS POPFLY аналогичный моему подход.

  11. sensor, а если прочитать задание, которое изначально ставилось, то о навигации сайтов никто и речи не вел. Речь веласть про навигацию в админке.

    Наша дуэль служит хорошим примером. Авось из нее кто-нибудь вынесет чего интересного. Я в том числе.

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

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

  12. Господа!!! У вас все в порядке? Вы вообще тут о чем?

    Чего-то в обоих скриптах навигацией для сайта даже не пахнет. Вы сообсна какую именно задачу решали в вашем состязании?

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

    Любой из предложенных кодов можно спокойно применить в навигации по сайту. Или я не понимаю сути понятия "навигация по сайту"? :)

  13. Прокомментирую-ка я некоторые грабли в вашем скрипте:

    С удовольствием дам пояснения по каждому пункту.

    > для отсечения IE используется банальный navigator.userAgent.indexOf("MSIE"), то есть любители по-spoof-ить свои юзерагенты заранее идут лесом;

    Обычно для интерфейсов поддерживать не более 2-х браузеров. Это существенно удешевляет разработку. В требованиях к клиентам фронта серьезных продуктов всегда указывается, какими именно версиями каких именно продуктов нужно пользоваться.

    > метод getElementsByTagName('*') предполагает, что IE ниже шестой версии отдыхает;

    И отлично. Сама MS не поддерживает данные версии продуктов. Зачем поддерживать старье?

    >метасимвол b в регулярном предполагает, что имена классов с дефисами внутри прид?тся выбирать более внимательно;

    Решается на уровне проектной документации для разработчиков.

    > do-while предполагает, что при начальном индексе (i), равном нулю, мы можем уплыть в светлую даль вечного loop-a, и почему именно do, и почему снизу;

    Верно. Запишем как багу. Do-while самый быстрый цикл в JS.

    > ноды засоряются ненужными данными, которые легко можно держать снаружи

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

    > там прилинкован зачем-то свой же родитель,

    Потому что прописка ноды меняется. А значит и меняется родитель. :)

    > имя собственного же класса

    Потому что никому не запрещено дописать еще классы. И как потом искать?

    > да болтающийся текст activeTab

    Не константа. Разные компоненты могут использовать разные классы.

    > и т.д.) что чревато конфликтами в IE (возможное совпадение им?н в глобальном констексте)

    Очень серьезная проблема :( Никто не мешает стоить именование объектов так, как кому нравится. В больших проектах замечательно работает правило именования функций префиксами и наиболее полным отражением сути функций в ее названии.

    > очень сомнительна необходимость в нетривиальных и бажных dispatchEvent/fireEvent для такой примитивной задачи, как клик по табу;

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

    > повсюду натыканы try-catch, но реальная проверка чего-либо вообще не производится;

    Нужно сугубо для успокоения клиентов, дабы не раздражать их JS-error'ами, а свести все к банальному "не работает". Инценденты были. А проверку производить собственно не требуется, так как пользователю незачем видеть сообщения об ошибках.

    >один кусок скрипта во внешнем файле, другой в html

    Если внимательно посмотреть, то внешний файл - универсальная библиотека.

    > первоначальная инициализация не по загрузке, а по месту скрипта в потоке,

    Раздробите файл на куски, как это сделано во всех крупных проектах, и вы поймете, что ничего плохого в этом нет.

    > обработчики заведены архаично в тегах...

    И в чем плохость данного метода? :( А, наверное лучше городить сверху систему идентификаторов для всех тегов, чтобы присваивать нужным тегам банальные обработчики.

    > общую логику даже не беру в расч?т...

    Предложите ваш, самый лучший, самый идеальный вариант. А мы посидим и подумаем, чем он хорош, а чем - нет.

    Если стояла задача написать качественный/reuse-ный/командный/кроссбраузерный/масштабируемый код, то вряд ли. А если ещ? и предположить, что это код коммерческий, то тут пахнет выговором от босса, как минимум... :)

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

  14. 1. Привязка к количеству элементов. Что нужно сделать чтобы было не 3 а 4 вкладки? А если надо будет одну убрать?

    2. Код закладок и контента находятся в разных местах. Если нужно будет, чтобы разные компоненты наполняли вкладки, то придется городить дополнительные параметры, чтобы все реализовать красиво. Весь HTML код для вкладки лучше все же хранить в одном месте.

    3. Управление через параметр display. Не для всех элементов можно сделать display: block. Это существенно ограничивает гибкость кода.

    Советую все же разобраться, как работает вариант AKS и как работает мой. Много хороших идей можно вынести.

  15. Dimitry Wolotko, у меня нет холи-вора :) Я давно уже ни с кем не воюю. Ветряные мельницы давно уже ушли в прошлое.

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

    А теперь посмотрите на свой код? Оцените его гибкость и масштабируемость?

    А где реализация второй части задания? Я ведь в задании присал "Задача: Сделать табулятор, который помимо обычных табов может переключаться селектом" Именно поэтому я задачу выполнил на 100%, сделав и табулятор, и селект. Кстати, одно из ценных свойств истинно командного разработчика - внимательно и до конца читать задачу. И на 100% ее реализовывать. :(

  16. Я тебе не затыкал рот.

    С какой же тогда целью Вы, уходя от темы, акцентируете внимание на фактах моей творческой биографии? Да они ведь Вам не были известны, не известны до сих пор, и станут известными никогда!

    Так что нечего упоминать свои "заслуги перед отечеством", противопостовляя их отсутствию таковых у меня. Пишите по существу!

    Я не акцентировал внимание, я констатировал факт. Можно хоть всю жизнь проработать в команде, но не быть командным работником. Можно всю жизнь наступать на одни и те же грабли, но так и не понять, почему так происходит. Чем больше опыта - тем больше приоритеты смещаются в совершенно другое русло. Это я и указал. Все остальные домыслы - плод воображения.

    А теперь вернемся к нашим "баранам"

    main.css

    body
    {
    font-size: 8pt;
    font-family: tahoma;
    }

    .hiddenBlock { display: none; }


    .tabContent
    {
    background: #f5f5f5;
    border: 1px solid #ccc;
    padding: 10px;
    }

    .tabSwitch
    {
    text-decoration: none;
    border: 1px solid #ccc;
    border-bottom-width: 0px;
    background: #e5e5e5;
    padding: 0px 5px;
    margin-right: 3px;
    }

    .superTab
    {
    background: #f5f5cc;
    }

    .activeTab
    {
    font-weight: bold;
    background: #ccc;
    }

    lib.js

    IE = (navigator.userAgent.indexOf("MSIE") != -1);

    matchClassName = function (node, className){
    try {
    var re = new RegExp ("b" + className + "b", "gi");
    return ( node.className.match(re));
    } catch ( e ) { return }
    }


    applyClassName = function (node, className, state ){
    try {

    var re = new RegExp ("b" + className + "b", "gi");
    if ( state ) {
    if ( !node.className.match(re) ) node.className += (" " + className);
    }else{
    node.className = node.className.replace(re, "");
    node.className = node.className.replace(/s+/gi, " ");
    }
    } catch ( e ) {}
    }

    dispatchEventForElement = function ( node, eventType ) {
    try {

    if(!IE){
    var evt = document.createEvent("MouseEvents");
    evt.initMouseEvent(eventType, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    node.dispatchEvent(evt)
    }else{
    node.fireEvent("on"+eventType);
    }
    } catch ( e ) {}
    }


    getElementsByClassName = function ( container, className ) {

    var tmpArr = [];
    try {
    var nodeList = container.getElementsByTagName( "*" );
    var i = nodeList.length;
    do {
    if ( matchClassName( nodeList.item( i-1 ), className ) ) tmpArr.push( nodeList.item( i-1 ) );
    } while ( --i );
    } catch ( e ) {};
    return tmpArr;
    }


    getInnerText = function ( node ) {
    try {
    if ( IE ) return node.innerText;
    else
    {
    var range = document.createRange( );
    range.selectNodeContents ( node );
    return range.toString();;
    }

    } catch ( e ) { }
    }

    И сам код

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <html>
    <head>
    <title>Demo</title>

    <script type="text/javascript" src="lib.js"></script>

    <link rel="stylesheet" type="text/css" href="main.css">

    </head>
    <body>
    <div id="tabBox">

    <div id="tabSwitchContainer"></div>

    <div class="tabContent">
    <a href="#" onclick="switchTab( this ); return false;" class="tabSwitch superTab"><i>Tab</i> 1</a>
    Tab 1 Content
    </div>

    <div class="tabContent">
    <a href="#" onclick="switchTab( this ); return false;" class="tabSwitch activeTab">Tab 2</a>
    Tab 2 Content
    </div>

    </div>


    <p><select id="linkedSelect" onchange="dispatchEventForElement( this.options[ this.value ].linkedNode, 'click')"><option> </option></select></p>

    <script type="text/javascript">

    <script type="text/javascript">


    tabInit = function ( tabBoxID, tabSwitchContainerID, switchID, activityID, initHandler ) {
    try {
    var tabBoxNode = document.getElementById( tabBoxID );
    var tabSwitchContainer = document.getElementById( tabSwitchContainerID );
    var switchNodesList = getElementsByClassName ( tabBoxNode, switchID );

    var activeTab = switchNodesList[ 0 ];

    for ( var i = switchNodesList.length; i--; ) {


    switchNodesList[ i ].options = {
    linkedNode: switchNodesList[ i ].parentNode,
    tabSwitchContainer: tabSwitchContainer,
    switchID: switchID,
    activityID: activityID
    }

    tabSwitchContainer.appendChild ( switchNodesList[ i ] );
    if ( matchClassName ( switchNodesList[ i ], activityID ) ) activeTab = switchNodesList[ i ];
    }


    dispatchEventForElement ( activeTab, "click" );

    if ( initHandler ) initHandler ( switchNodesList )

    } catch ( e ) { alert( "Sorry, an error occured." ) }
    }

    switchTab = function ( node ) {
    try {

    if ( !node.options ) {
    do{
    node = node.parentNode;
    } while ( !node.options )
    }

    var opts = node.options;
    var tabSwitchList = getElementsByClassName( opts.tabSwitchContainer, opts.switchID );

    for ( var i=tabSwitchList.length; i--; ) {
    applyClassName ( tabSwitchList[ i ], opts.activityID, tabSwitchList[ i ] == node );
    applyClassName ( tabSwitchList[ i ].options.linkedNode, "hiddenBlock", tabSwitchList[ i ] != node );
    }


    } catch ( e ) { alert( "Sorry, an error occured." ) };
    }

    fillInLinkedSelect = function ( nodeList ) {

    var selNode = document.getElementById ( "linkedSelect" );

    selNode.options.length = 0;

    for ( var i = nodeList.length; i--; ) {


    var tmpOption = new Option( getInnerText ( nodeList[ i ] ) , nodeList.length - i - 1 )
    tmpOption.linkedNode = nodeList[ i ];

    selNode.options [ selNode.options.length ] = tmpOption;
    }


    }

    tabInit ( "tabBox", "tabSwitchContainer", "tabSwitch", "activeTab", fillInLinkedSelect );
    </script>

    </body>
    </html>

    P.S. Я реализовал задачу на 100%. Мало того, в моем варианте абсолютно все равно, какие теги будут использоваться.

  17. Для интерфейсов важно не well-formated, а дешевизна в разработке. Иногда приходится использовать свои атрибуты, которые не проходят валидацию, но с ними проще работать.

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

    Что есть правильное структурирование данных? Логичесткое представление в HTML? У меня логическое представление перенесено на классы. Смотришь на классы и видишь истинное предназначение данного блока. Чем не правильное структурирование? :) Ах да, я забыл, правильно списки делать только при помощи UL, OL, DL, и ни-ни использовать что-то другое.

    другой затыкает собеседнику рот безотносительными фразами, типа: "ты явно не работал над реально сложными проектами" (кстати, это обязательно писать, без этого не хватает аргументов?).

    1. Я тебе не затыкал рот.

    2. Аргументов у меня хватит, но вот будут ли мои аргументы для тебя значимы? Или будем и дальше повторять стандартные фразы из стандартных книжек?

    Как в такой ситуации докопаться до истины?

    Очень просто. Сделать два варианта - один ортодоксальный, при помощи DL, а второй - с полным нарушением принципов HTML. Потом сравнить оба варианта. Я свой выложу последним, чтобы не было копирования идей.

  18. А Вам придет в голову попытаться сложную структуру преподнести в виде табов?

    Не понял вопроса.

    Зачем же удалять? Для того, чтобы что-то скрыть, достаточно использовать css.

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

    Да нет, зачем? dl.parentNode.insertBefore(tabs, dl) - возможо как-нибудь так.

    А в моем случае используется почти любой контейнер и самая примитивная функция appendChild.

    Об этом я и пишу - выигрыш логической разметки относительно каких-то "костылей".

    Выигрыш как раз нулевой. :( И чем больше проект, тем минимальнее становится эффект логической разметки.

    Выглядит вызывающе. :)

    Хочешь проверить?

    На счет усложнения js-кода - это вряд ли. А разбираться должны знающие люди.

    Уже на одной задаче будет усложнение. А если задач несколько, и все они работают с данным кодом, то усложнение будет расти в неприличной прогрессии. Чем проще код - тем дешевле. Про разбирательство знающими людьми: ты явно не работал над реально сложными проектами. Особенно над теми, где работало несколько человек.

    И именно поэтому количество well-formed документов, имеющихся в сети, ничтожно мало.

    Для интерфейсов важно не well-formated, а дешевизна в разработке. Иногда приходится использовать свои атрибуты, которые не проходят валидацию, но с ними проще работать.

    Дабы не быть голословным и дальше, предлагаю провести мааленькое соревнование.

    Задача: Сделать табулятор, который помимо обычных табов может переключаться селектом. Красивости не нужны. Сугубо функционал.

    Принимаешь участие в соревновании?

  19. > Наличие портфолио.

    Не факт, что человек его сделал сам.

    > Умение принимать решение.

    Я принял решение не связываться с вами.

    > Умение делать не только сайт, но и часть.

    Что существенно удорожает разработку.

    > Умение писать не только в Web 2.0, но и в предыдущей версии.

    Да кому нужны такие продукты?

    > Умение сочетать версии на одном сайте (чувство стиля).

    Странное требование.

    > Желание заработать, а не хапнуть.

    Мое желание заработать вам будет очень дорого стоить. Ведь я не как новичек оцениваю стоимость работы.

    > Понимание обязательности соблюдения сроков сдачи работы.

    Но куда лучше просто умение соблюдать сроки. А то, что человек это просто понимает не улучшает качество и количество.

    Итак, самый главный вопрос, а чем же собственно должен заниматься тот, кому интересна разовая удаленная работа?

  20. Через много лет программирования под HTML я пришел к одной очень простой истине. Все то многообразие тегов практически невостребовано в интерфейсах. Поясню почему. Порой сложность конструкции требует многократного вложения элементов. Порой требуется перенос содержимого с одной части дерева в другую. Все это нивелирует важность логического оформления кода, и банально начинает сводиться к нескольким тегам: DIV, SPAN, A, TABLE (и все запчасти), IMG. Логическая же часть перекладывается на классы.

    AKS, в твоем варианте потребуется удалять лишние DT, а вместо них создавать A. Перенести же куском можно только в аналогичный DL. В моем варианте ничего удалять не требуется. Ты выиграешь на логике кода, зато проиграешь в скриптовой части, что создаст усложнение кода. А разбираться в нем через определенное время становится все сложнее и сложнее.

    Так что готов поспорить, что предложенные варианты - лучше, удобнее для разработчика.

  21. Как бы это делал я.

    Самое первое правило - код одного таба должен быть описан в одном месте. Это улучшает восприятие и уменьшает количество будущих багов. Что это значит? Рассмотрим пример

    <div id="tabBox">

    <div id="tabSwitchContainer"></div> <!-- <= в этот контейнере будут закладки -->

    <div class="tabContent">
    <a href="#" onclick="switchTab(); return false;" class="tabSwitch">Tab 1</a>
    Tab 1 Content
    </div>

    <div class="tabContent">
    <a href="#" onclick="switchTab(); return false;" class="tabSwitch">Tab 2</a>
    Tab 2 Content
    </div>

    </div>

    Потом создаем простую функцию инициализации нашего таба.

    1. Найти контейнер с id="tabBox"

    2. Найти контейнер для закладок ( id="tabSwitchContainer");

    3. Найти все элементы, у которых среди имени класса встречается tabSwitch (/btabSwitchb/gi)

    4. Каждой найденной ссылке присвоить параметр linkedNode, который равен parentNode ссылки. Это нужно для того, чтобы установить связь переключателя с блоком с контентом.

    5. Перенести ссылку в контейнер для закладок (appendChild)

    6. Функция switchTab находит все элементы, которые имеют в имени класса строку tabContent и присваивают класс hiddenBlock ( display: none ) Для элемента, который равен linkedNode, класс hiddenBlock удаляется.

    В чем преимущества данного варианта

    - блок монолитный, спокойно навешивается дополнительная логика в одном месте, а не в нескольких.

    - не требуется сложные схемы идентификации разлычных блоков. Переключатель работает через присвоенный параметр linkedNode.

    Код не привожу специально.

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

    Да, студия Лебедева создала вокруг себя много ажиотажа. А внутри все гнило. Там работает много талантливых людей, а КПД - стремится к нулю.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy