Как вы пишете код Valid XHTML 1.0 Strict, когда вы используете javascript для заполнения элемента, для которого требуется дочерний элемент?

Я запускаю свой сайт через валидатор W3C, пытаясь проверить его как XHTML 1.0 Strict, и я столкнулся с особенно неприятной (по крайней мере, по моему опыту) ошибкой проверки. Я добавляю на сайт определенные значки различных сервисов, которые предоставляют собственный API и код для размещения на внешнем сайте. Эти значки используют javascript (по большей части) для заполнения элемента, который вы вставляете в разметку, для которой требуется дочерний элемент. Это означает, что, в конце концов, генерируется абсолютно корректная разметка, но для валидатора все, что он видит, — это неполный тег «родитель-потомок», который затем выдает ошибку.

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

Дополнительное предостережение: я бы предпочел, чтобы разметка оставалась семантической, насколько это возможно. т.е. Добавление пустого тега li или пары tr-td для проверки будет нежелательным решением, даже если оно может быть необходимым. Если это единственный способ проверки, да ладно, но, пожалуйста, склоняйте ответы к семантической разметке.

Например:

<div id="twitter_div">
<h2><a href="http://twitter.com/stopsineman">@Twitter</a></h2>
<ul id="twitter_update_list">
<script type="text/javascript" src="http://twitter.com/javascripts/blogger.js"></script>
<script type="text/javascript" src="http://twitter.com/statuses/user_timeline/stopsineman.json?callback=twitterCallback2&amp;count=1"></script>
</ul>
</div>

Обратите внимание на теги ul, обертывающие javascript. Это в конечном итоге заполняется lis через скрипт, но для валидатора он видит только незаполненный ul.

Заранее спасибо!


person Tim Visher    schedule 29.09.2008    source источник
comment
Похоже, Twitter использует обратный вызов, который вставляет xhtml. Для Twitter вы можете открыть twitter.com/javascripts/blogger.js и проверить twitterCallback2( ) и измените его, чтобы он работал так, как вы предпочитаете. Просто передайте новое имя функции обратного вызова в параметр обратного вызова во втором теге скрипта.   -  person Joe Lencioni    schedule 29.09.2008


Ответы (6)


Следующий фрагмент является действительным XHTML и выполняет эту работу:

<div id="twitter_div">
    <h2 class="twitter-title"><a href="http://twitter.com/stopsineman" title="Tim's Twitter Page.">Twitter Updates</a></h2>
    <div id="myDiv" />
</div> 

<script type="text/javascript">
    var placeHolderNode = document.getElementById("myDiv");
    var parentNode = placeHolderNode.parentNode;
    var insertedNode = document.createElement("ul");
    insertedNode .setAttribute("id", "twitter_update_list");
    parentNode.insertBefore( insertedNode, placeHolderNode);
    parentNode.remove(placeHolderNode);
</script>
<script type="text/javascript" src="http://twitter.com/javascripts/blogger.js"></script>
<script type="text/javascript" src="http://twitter.com/statuses/user_timeline/stopsineman.json?callback=twitterCallback2&amp;count=5"></script>
person Panos    schedule 29.09.2008
comment
Я сделал небольшое изменение, но в итоге остановился на этом. Я удалил parentNode.remove(placeHolderNode);. Работает отлично! - person Tim Visher; 30.09.2008
comment
Разве это не должно быть parentNode.removeChild(placeHolderNode)? - person wfarr; 17.01.2009

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

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

Не могли бы вы привести конкретный пример HTML/ссылки на страницу с неверным кодом?

person Rudi    schedule 29.09.2008
comment
Это интересная мысль. Таким образом, в исходной разметке присутствует только сценарий, а не недопустимая разметка. Хм... :\ - person Tim Visher; 29.09.2008
comment
Это просто означает, что вы скрываете то, что позже может оказаться недействительным. Я не уверен, ЧТО вы пытаетесь проверить - только HTML или всю DOM страницы, поскольку браузер/пользователь должен ее использовать? - person Cade Roux; 29.09.2008

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

<div id="twitter_div">
  <h2><a href="http://twitter.com/stopsineman">@Twitter</a></h2>
  <div id="twitter_update_list"></div>
</div>

<script type="text/javascript">
function updateTwitterCallback(obj)
{
  var twitters = obj;
  var statusHTML = "";
  var username = "";
  for (var i = 0; i < twitters.length; i++)
  {
    username = twitters[i].user.screen_name;
    statusHTML += ('<li><span>' + twitters[i].text + '</span> <a style="font-size:85%" href="http://twitter.com/' + username + '/statuses/' + twitters[i].id + '">' + relative_time(twitters[i].created_at) + '</a></li>');
  }
  document.getElementById('twitter_update_list').innerHTML = '<ul>' + statusHTML + '</ul>';
}
</script>
<script type="text/javascript" src="http://twitter.com/javascripts/blogger.js"></script>
<script type="text/javascript" src="http://twitter.com/statuses/user_timeline/stopsineman.json?callback=updateTwitterCallback&amp;count=1"></script>
person Joe Lencioni    schedule 29.09.2008

Я поместил ‹li› с «display:none» в тег ‹ul›:

<ul id="twitter_update_list"><li style="display:none;">A</li></ul>

<script type="text/javascript" src="http://twitter.com/javascripts/blogger.js"></script>
<script type="text/javascript" src="http://twitter.com/statuses/user_timeline/01241.json?callback=twitterCallback2&amp;count=1"></script>

Это не мешает работе скрипта и в данном случае работает, и я не думаю, что это "нежелательное решение" :)

person Markus    schedule 13.06.2010

В какой-то момент страница становится действительной, верно? Это единственный раз, когда это действительно может быть проверено.

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

person Cade Roux    schedule 29.09.2008
comment
Я не уверен, что понимаю ваши рассуждения. Это правда, что на каждом этапе разработки ваша разметка не гарантируется. Однако, если окончательная разметка не проходит проверку, то более поздней точки, в которой она будет проверяться, не будет. Что мне не хватает? - person Tim Visher; 29.09.2008
comment
Ваш валидатор запускается слишком рано. Его необходимо запустить на окончательно построенной странице после применения всех скриптов. - person Cade Roux; 29.09.2008

Возможно, это не самое популярное мнение на эту тему, но...

Не беспокойтесь о 100% проверке. Это просто не так уж важно.

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

Короче говоря, приза за валидацию нет :)

person rfunduk    schedule 29.09.2008
comment
Я полагаю, что нет никакой «награды» за подтверждение, кроме общей «доброты» стандартов для любой практики. Проверка даже не гарантирует, что ваша страница будет корректно отображаться везде. Тем не менее, я, например, хочу поддержать движение за стандарты в веб-разработке. :) - person Tim Visher; 29.09.2008
comment
Конечно, вы хотите поддерживать веб-стандарты, как и я (мой сайт подтверждает). Я хочу сказать, что, не беспокоясь о некоторых сторонних бейджах, вы ВСЕ ЕЩЕ поддерживаете веб-стандарты, не слишком усердствуя в этом. Сеть не идеальное место, вы уже вносите свой вклад. - person rfunduk; 29.09.2008