Вопрос
Я пытаюсь написать плагин 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, поэтому даже не совсем уверен, что делаю.Когда я запускаю свою страницу через валидатор XHTML W3, я получаю более 80 ошибок, потому что она получает повторяющиеся определения всех элементов XHTML.Я хотя бы на правильном пути?Какие-либо предложения?
РЕДАКТИРОВАТЬ:Я удалил этот раздел из своего пользовательского 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 это по-прежнему не нравится.
Вот страница, где я его использую, чтобы вы могли посмотреть источник:
А вот ссылка на результат проверки w3c:
Это настолько близко, насколько я могу это сделать, или я все еще делаю что-то не так?
Решение
Если вы хотите, чтобы результат был действительным XHTML, я считаю, вам нужно будет использовать Пространства имен XML а не собственный DTD.DTD не только определять язык (и, следовательно, собственный DTD «на самом деле» не является XHTML), но он будет выбрасывать любые браузеры, которые его читают, в режим причуд, даже если они не подавятся файлом.
С другой стороны, использование пространства имен позволит создать абсолютно корректный 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 > 0;"/>
<input id="name2" type="text" v:validation="not empty"/>
</body>
</html>