Подтвердить что ты не робот

Кнопка Google +1: как они это делают?

Изучая кнопку Google +1, я обнаружил две вещи нечетные в отношении кода, который они поставляют:

<script type="text/javascript" src="https://apis.google.com/js/plusone.js">
  {lang: 'en-GB'}
</script>

<g:plusone size="tall" href="#" onclick="location.href='http://www.google.com'; return false;"></g:plusone>

Итак, у меня есть два вопроса:
В первую очередь:               Второй: Является ли синтаксис <g:plusone ... HTML действительным? Что это называется?

4b9b3361

Ответ 1

Как Google может использовать текст между тегами script?

Элементы

<script> отлично видны в DOM:

<script type="text/javascript">//FIRST SCRIPT BLOCK</script>

<script type="text/javascript">
    var s= document.getElementsByTagName('script')[0];
    alert(s.textContent); // "//FIRST SCRIPT BLOCK"
</script>

Google sneaky трюк заключается в размещении контента в <script>, который имеет внешний src. В этом случае src переопределяет содержимое внутри блока и вместо этого выполняет внешний script, но содержимое элемента <script> все еще читается через DOM, даже если они ничего не делают.

Является синтаксисом <g:plusone... HTML действительным? Что это называется?

Нет. Если бы они сделали свой собственный doctype для HTML + plusone, это могло бы быть справедливым, но оно не удовлетворяет действительности для HTML, и это даже не пространство имен, хорошо сформированное в документе XHTML, если вы не добавите дополнительный xmlns:g для него тоже.

Ответ 2

Является ли синтаксис <g:plusone... HTML действительным?

Нет

Что это называется?

Недопустимые пространства имен psuedo

Ответ 3

Первый трюк интересен. Это похоже на творческий способ передать "глобальные" аргументы из разметки страницы во внешние скрипты. Есть способы, чтобы найти элемент <script>, который запускает текущий код, и я не удивлюсь, если бы был доступен внутренний текст этого элемента <script> из DOM, хотя браузер игнорирует его.

В вашем вопросе этот шаблон позволяет каждой внешней клиентской стороне script использовать (по крайней мере) свои собственные параметры локализации, а также позволяет серверному коду отображать этот параметр как побочный эффект рендеринга <script> самого элемента. Это впечатляет.

Второй трюк, я не так уверен. В основном, я думаю, что большинство браузеров рассматривают элемент с именами <g:plusone> как неизвестный или даже недействительный, поэтому они должны отображать его содержимое, но он ничего не сделает, конечно, поскольку этот элемент пуст для начала.

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

Ответ 4

  • Возможно, это JSON, и они получают доступ к нему через DOM
  • Это XHTML действительный