Расширение XHTML - PullRequest
       18

Расширение XHTML

8 голосов
/ 12 января 2009

Я пытаюсь написать плагин jQuery, который использует атрибут для определения поведения проверки формы (да, я знаю, что плагин проверки уже есть; это такое же учебное упражнение, как и то, что я буду использовать) , В идеале я хотел бы иметь что-то вроде этого:

Пример 1 - ввод:

<input id="name" type="text" v:onvalidate="return this.value.length > 0;" />

Пример 2 - обертка:

<div v:onvalidate="return $(this).find('[value]').length > 0;">
   <input id="field1" type="text" />
   <input id="field2" type="text" />
   <input id="field3" type="text" />
</div>

Пример 3 - предопределено:

<input id="name" type="text" v:validation="not empty" />

Цель здесь - позволить моему коду jQuery выяснить, какие элементы должны быть проверены (это уже сделано), и все еще иметь допустимую разметку XHTML, с чем у меня проблема. Я вполне уверен, что для этого потребуется сочетание DTD и XML-схемы, но я не совсем уверен, как именно выполнить.

На основании этой статьи я создал следующее DTD:

<!ENTITY % XHTML1-formvalidation1
    PUBLIC  "-//W3C//DTD XHTML 1.1 +FormValidation 1.0//EN"
            "http://new.dandoes.net/DTD/FormValidation1.dtd" >
%XHTML1-formvalidation1;

<!ENTITY % Inlspecial.extra 
  "%div.qname; " >

<!ENTITY % xhmtl-model.mod
    SYSTEM "formvalidation-model-1.mod" >  
<!ENTITY % xhtml11.dtd
    PUBLIC  "-//W3C//DTD XHTML 1.1//EN"
            "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" >
%xhtml11.dtd;

А вот "formvalidation-model-1":

<!ATTLIST %div.qname;
    %onvalidation   CDATA   #IMPLIED
    %XHTML1-formvalidation1.xmlns.extra.attrib;
>

Я никогда не делал DTD раньше, поэтому я даже не совсем уверен, что делаю. Когда я запускаю свою страницу через валидатор W3 XHTML, я получаю более 80 ошибок, потому что она получает повторяющиеся определения всех элементов XHTML. Я хотя бы на правильном пути? Есть предложения?


EDIT: Я удалил этот раздел из своего пользовательского DTD, потому что оказалось, что он на самом деле ссылается на себя, и код, из которого я получил шаблон, на самом деле предназначен для объединения двух DTD в одно, а не для добавления определенных элементов к одному:

<!ENTITY % XHTML1-formvalidation1
    PUBLIC  "-//W3C//DTD XHTML 1.1 +FormValidation 1.0//EN"
            "http://new.dandoes.net/DTD/FormValidation1.dtd" >
%XHTML1-formvalidation1;

Я также удалил это, потому что это не проверяло и, похоже, ничего не делало:

<!ENTITY % Inlspecial.extra 
  "%div.qname; " >

Кроме того, я решил, что, поскольку я добавляю лишь несколько дополнительных элементов, модель отдельных файлов, рекомендованная W3, на самом деле не кажется такой полезной, поэтому я поместил все в файл dtd, содержимое которого теперь это:

<!ATTLIST div onvalidate CDATA  #IMPLIED>
<!ENTITY % xhtml11.dtd
    PUBLIC  "-//W3C//DTD XHTML 1.1//EN"
            "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" >
%xhtml11.dtd;

Итак, сейчас я не получаю никаких ошибок, связанных с проверкой DTD, но атрибут onvalidate по-прежнему недействителен.

Обновление: Я отказался от DTD и добавил схему: http://schema.dandoes.net/FormValidation/1.0.xsd

Использование v: onvalidate для проверки в Visual Studio, но службе W3C все еще не нравится.

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

http://new.dandoes.net/auth

А вот ссылка на результат проверки w3c:

http://validator.w3.org/check?uri=http://new.dandoes.net/auth&charset=(detect+automatically)&doctype=Inline&group=0

Это настолько близко, насколько я смогу с этим разобраться, или я все еще делаю что-то не так?

1 Ответ

7 голосов
/ 12 января 2009

Если вы хотите, чтобы результат был действительным XHTML, я считаю, что вам нужно будет использовать пространства имен XML , а не пользовательский DTD. Мало того, что DTD определяет язык (и, следовательно, пользовательский DTD не "действительно" XHTML), но он также переведет любые браузеры, которые читают его, в режим quirks , даже если они не подавятся файлом.

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="http://example.com/ns/validation" xml:lang="en">
    <head><title>Validation Example</title></head>

    <body>
        <input id="name1" type="text" v:onvalidate="return this.value.length &gt; 0;"/>
        <input id="name2" type="text" v:validation="not empty"/>
    </body>
</html>
...