11 апреля 2009 в 04:53

Интересная задачка для знатоков

В процессе написания плагинов для jQuery столкнулся с необходимостью добавлять расширенные атрибуты к некоторым известным тэгам для облегчения передачи параметров плагинам (получается красиво и просто), но так же хочется без проблем проходить валидацию страницы. Небольшой эксперимент поставил перед выбором: или валидный html или расширенные атрибуты…

Для нормальной валидации html было решено описать расширенные атрибуты в описании документа:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
[
  <!ATTLIST input
    lookup:url CDATA #IMPLIED
    lookup:targets CDATA #IMPLIED
  >
]>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>test</title>
  </head>
  <body>
    <input type="text" maxlength="50" size="20" class="lookup" name="l1"
      lookup:url="/find.aspx?q="
      lookup:targets="id:MyHidden1, id:MySpan1.text, text:MySpan2.text"/>
  </body>
</html>



Этот html прекрасно проходит валидацию, идеально подходит для плагина, но! в браузерах (Chrome, IE8, FF3) в начале документа отображаются два символа "]>" и это все портит.

Варианты с внешним файлом dtd и т.п. пробовал — валидация не проходит.

Стоит ли копать дальше или бросить идею с расширенными атрибутами и валидным html? Или может у кого-нибудь появится идея как это можно обойти?

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

Итак результат получается такой: пишем свой файл DTD, в нем импортируем нужный DTD
<!-- include XHTML1.1 -->
<!ENTITY % xhtml1t.dtd PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
%xhtml1t.dtd;
<!-- Наши определения -->
<!ATTLIST input
  lookup:url CDATA #IMPLIED
  lookup:targets CDATA #IMPLIED
>

Потом прописываем Doctype на странице
<!DOCTYPE html PUBLIC "-//My//DTD XHTML MyExt//RU" "http://my.site.ru/_static/test.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
...

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

Кстати, насчет постоянных споров должен быть документ валиден или нет — лично для меня валидация полезна: использую валидацию для проверки кода страницы и поиска косяков в генерируемом html, а продираться между «лишними» ошибками валидатора сильно не хочется. У многих есть свое устоявшиеся мнение и переубеждать, вступать в полемику по этому вопросу, излишне.
ETC.Dema @ETCDema
карма
39,6
рейтинг 0,0
Похожие публикации
Самое читаемое Разработка

Комментарии (60)

  • –3
    Посмотрите тут.
  • 0
    Используйте
    • +2
      … сорри хабра парсер съел теги. В общем так:

      • +2
        Хех. Только что вгляделся и увидел что у автора аттлист в доктайпе.
      • –1
        и что это даст? с тем же успехом можно ничего не писать.
        • 0
          Вам, конечно, незнакомы скрипты в комментариях и условные комментарии IE? Будет это работать — другой вопрос, но прием известный.
          • –3
            и какое они имеют отношение к обсуждаемому вопросу?
            • –1
              Видимо, вы потеряли нить обсуждения даже не начав разговор.
              • 0
                ага, видимо я — единственный, кто понял суть проблемы и дал исчерпывающий ответ, а не стал обсуждать какие-то левые нити…
                • 0
                  Да, признаю, я зря начал наезжать :) Извините.
      • –1
        А какой это текстовый редактор на скрине?
        • 0
          В любом редакторе можно настроить данную стилизацию.
          Но по дефолту такая тема есть в редакторе gEdit, тема называется Oblivion.
        • 0
          Похоже на textmate с темой Twilight.
          Там еще и рельсы кусочек торчит ;)
  • НЛО прилетело и опубликовало эту надпись здесь
  • +5
    d-o-b.ru/?article:kill.html
  • 0
    В Dojo Toolkit над этим многие долго бились в итоге так и не решили — говорят, что это невозможно. Или свои атрибуты в HTML, или чистая валидность по w3c — выбирай.
    • –4
      ггг, я совершил невозможное :-D теперь я бох!
    • НЛО прилетело и опубликовало эту надпись здесь
  • НЛО прилетело и опубликовало эту надпись здесь
    • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        Отличный способ
    • +1
      Полностью согласен. class для этих вещей подходит идеально.
  • +10
    Используйте расширенные аттрибуты и тэги. Для проверки на well-formed установите tidy, а адрес валидатора выкиньте из головы. За 15 лет не было ни одного сайта который что-либо получал от своей валидности (кроме девелоперского микро-геморроя, выходящего далеко за рамки рациональности 20/80).
    • –2
      >За 15 лет не было ни одного сайта который что-либо получал от своей валидности кроме…
      Со времен Моисея никто еще ничего не получил от мытья рук кроме расхода мыла и воды. А шею моют только лентяи, которым лень свежий подворотничек подшить.
      • –1
        Валидность в данном случае (см. топик) — не мытьё рук, а удаление заусенцев на ногтях.
        • –1
          Топик как раз провалидацию.
          Кстати tidy может вывалить незакрытый тег не в виде error а в виде warning. Поэтому держать в верстке 300 идиотских warnings стремно. Можно пропустить реальную ошибку.
    • –1
      Полностью поддерживаю, часто вижу заметки, касающиеся валидации кода. Зачем это нужно? Что это даст конкретному ресурсу? Если все работает корректно во всех браузерах, что даст валидация разработчику? Ну если только чувство самоудовлетворения и и немного геморроя.
      • 0
        Проверка верстки на валидность — это элементарная культура производства. В принципе можно не соблюдать, так же как не мыть руки после туалета. Но некультурно.
        .
        Пример с броузером оч. показателен. Невалидная верстка может спокойно отображаться в текущих версиях броузеров, но разваливаться в следующих. Собственно прямая параллель с мытьем рук. Обычно обходится, но можно подцепить какую-нибудь болячку типа дизентерии.
        .
        Другой пример — XSLT технологии. В них требование если не валидности, так хотя бы well-formed кода условие необходимое.
        • 0
          Вы наверное не поняли мой ответ выше и упорно сравниваете валидность с мытьем рук. Мне вот кажется что мыть руки — это писать well-formed код! А удовлетворение же валидатора (ради идеи светлого будущего всех браузеров) сродни наведению маникюра. Глупое неэффективное времяпровождение мизофоба.
          • +2
            >Мне вот кажется что мыть руки — это писать well-formed код!
            Два примера:
            1. well-formed XML код допускает дубликат id. Но js скрипты после этого ведут себя странно.
            2. FF3 (не будущий, а текущий броузер) не отрабатывает well-formed конструкцию [a href="#"][div]blah-blah-blah[/div][/a] так как это делают другие броузеры. habrahabr.ru/blogs/webdev/38829/

            И самое главное, о чем я постоянно талдычу, — если игнорировать предупреждения валидатора, рано или поздно это приведет к появлению критической ошибки. Поэтому код должен быть чистым и валидным. Впрочем я это отношу только к своему коду и коду тех с кем работаю.
            • НЛО прилетело и опубликовало эту надпись здесь
              • +1
                Мне кажется что я начинаю производить впечатление фетишиста. Это не так. Валидатор — не фетиш, а инструмент, позволяющий «избежать тупых ошибок» (с) SelenIT
        • НЛО прилетело и опубликовало эту надпись здесь
          • 0
            >Валидация по DTD, безусловно полезна для разработчика как страховка
            > от невнимательности и источник предупреждений о потенциально багоопасных местах.
            А я ни о чем больше и не говорю. Только об этом.

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

            Так вот и в этой дискуссии в валидизации видят почему-то только религиозную норму.
            • НЛО прилетело и опубликовало эту надпись здесь
              • 0
                >Она помогает избежать тупых ошибок
                Мне кажется это достаточно для того, чтобы пользоваться валидатором в процессе работы.
                Остается больше времени на поиск ошибок в валидном коде.
                • НЛО прилетело и опубликовало эту надпись здесь
                  • 0
                    Простите, я где-то написал что валидность — самоцель?
                    Честное слово, я был сегодня до изумления трезв.

                    • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        И после этого мы еще удивляемся, почему отечественный автопром гордо именуют «тазиками» и по уровню он до сих пор глубоко в 80-х…
  • +2
    А как на счет того, чтобы указывать новый неймспейс и схему? Например, как-нибудь так (сорри, если в синтаксисе ошибки, плохо помню уже):

    xmlns:lookup="http://schema.ru/..."


    Ведь вроде бы XHTML задумывался именно как eXtensible.
    • +1
      дтд не знает ничего о хмл-неймспейсах. да и вообще, он слабо подходит для описания структуры хмл. но его, тем не менее, приходится использовать для перевода браузера в стандартный режим =(
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          ты знаешь другие способы перевода?
          • НЛО прилетело и опубликовало эту надпись здесь
  • –1
    Кстати не понимаю, почему w3c не хочет валидировать такой код? Главное же валидный XML, а это значит нет проблем для парсинга. Какая им разница сколько и каких атрибутов вы используете? Помоему w3c должны пересмотреть свое отношение к кастомным атрибутам.
    • НЛО прилетело и опубликовало эту надпись здесь
    • +4
      Вы путаете понятия well-formed и valid. w3c не будет пересматривать правила проверки валидного HTML, поскольку они сами эти правила и разработали. Просто не надо рассматривать результаты валидации как инструкцию к действию.
      • 0
        Да, действительно, путал. Теперь я могу сказать, что я за строгий well-formed и не строгий valid :)
  • +5
    Кстати, погоню за супервалидным кодом, всегда считал каким-то комплексом у веб-разработчиков :) По-моему, проще писать правильный код, но не обязательно 100% валидный. Даже Яндекс, к примеру, не стесняется такого «некошерного» тега, как
    noindex
    .

    Ох, нападут сейчас на меня…
    • 0
      а почему он должен его стесняться? =) он же не декларирует стремление сделать вэб лучше…
    • 0
      >Ох, нападут сейчас на меня…
      Ой нападу. Noindex плох не столько тем, что создает проблемы с валидацией, сколько тем что кроме самого Яндекса его никто не поддерживает. А Яндексу в свою очередь западло использовать кошерны атрибут rel=nofollow, который поддерживают западные поисковики.
      • 0
        Речь как раз и идет о тегах и атрибутах, которые никто кроме моего кода (кода Яндекса/кода автора статьи) не поддерживает. Ну невалидный он, этот код, ну черт с ним. Свет ведь не сошелся клином на этом валидаторе.

        К тому же я уже предлагал выше легитимный способ расширения стандарта XHTML. Это стандартом самого языка XHTML предусмотрено. И любой XML-валидатор должен отпарсить этот код без ошибок.
        • +1
          Про легитимный вариант — да. Я его знаю давно. Хотя не использую. Не было необходимости.

          А по поводу наплеватьельства на валидность имхо вы неправы. Привычка к игнорированию сообщений валидатора — стремная. Рано или поздно среди 300 warnings которые в принципе не по делу проскакивает один, который разваливает верстку или приводит к глюкам которые сложно выловить.
          Хорошо если все в одних руках. А если версткой и скриптами занимается несколько человек, подгадить можно не себе а коллеге.
          • +1
            Я и не говорю что нужно плевать и писать кривой код :) Я ни в коем случае не оправдываю нарушения структуры языка, его синтаксиса. Просто в данном случае, когда нужно всего лишь расширить язык можно и не обращать внимания на гневные сообщения валидатора. Вот и всё.
  • +2
    используйте jquery.metadata, атрибуты class и rel.
  • +2
    имхо, тут стоит идти по WAI-ARIA-пути, т.е. расширенные атрибуты + свой dtd
    www.w3.org/TR/wai-aria/

    Стандарты тем хороши, что описаны как «стандарты» (тавтология получается). Т.е. разработчик любого браузера (кто сказал, что новых браузеров больше не будет? Chrome — сентября 2008) будет полагаться именно на стандарты, а не на свой взгляд — ведь стандарты поддерживают все браузеры, а его взгляд — никто. Это только MS позволено выпендриваться как угодно. Да и то со временем это проходит (IE8 поддерживает блочную модель!).
  • 0
    есть такой плагин, с ним возможно использовать три разных метода для интеграции метаданных, первый и третий вполне валидные
  • 0
    А мне вот интересно, что за задачка такая, где ну никак без кастомных атрибутов? если это для сохранения состояния каких то элементов или объектов, то попробуйте посмотреть сюда docs.jquery.com/Core/data
    • 0
      Можно было бы и просто setAttribute (или банальный яваскриптовый массив). Неудобство, как минимум в том, что придется делать два одинаковых цикла — один для вывода валидного HTML, а второй для яваскрипта, назначающего нужные аттрибуты. И куча других дурацких последствий, тяжело влияющих на неокрепшую психику.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.