Как устранить чрезмерные HTTP-запросы при использовании кнопок Pinterest?

Связанный: Как я могу перерисовать кнопку Pinterest Pin It?


Дизайн кнопки «закрепить» в pinterest для веб-сайтов, показанный на странице их полезных товаров призывает веб-дизайнера вставить специально помеченный тег привязки на свою веб-страницу. Затем страница должна вызывать шаблон pinit.js.

Специальный тег привязки должен быть таким:

<a href="http://pinterest.com/pin/create/button/?
    url=http%3A%2F%2Fpage%2Furl
    &media=http%3A%2F%2Fimage%2Furl" 
   class="pin-it-button" count-layout="horizontal"></a>

а шаблон pinit.js должен выглядеть так и должен располагаться после последней булавки.

<script type="text/javascript" src="//assets.pinterest.com/js/pinit.js">
</script>

Насколько я могу судить, код pinit.js делает следующее:

  • сканирует страницу на наличие якорных тегов
  • ищет специальные маркировки, в частности, класс "pin-it-button" и префикс href
  • заменяет теги привязки переформатированными IFRAME. Атрибуты src для этих iframe получают нормализованные URL-адреса, указывающие на другой сервер, а не на pinterest.com, а на сервер из CDN, который использует pinterest.

Это нормально на статической веб-странице, но:

  • он не работает на динамической странице, где кнопки «закрепить» могут динамически генерироваться с помощью логики jquery и внедряться в разметку страницы в ответ на действия пользователя.
  • для каждой кнопки «закрепить» требуется один iframe, что означает один HTTP GET для каждой кнопки «закрепить». Если у вас есть 10 фотографий, каждая с кнопкой pinit, то есть 10 HTTP GET для CDN pinterests. Все эти GET предназначены для ресурсов с одинаковыми именами, но все они немного отличаются в зависимости от URL-адреса изображения, которое нужно закрепить, и поэтому не могут быть кэшированы.

Что я хотел бы сделать, так это устранить чрезмерные GET. Есть идеи?


У меня была одна идея:

  • вставьте ровно один тег привязки в div со стилем display:none;.
  • вызовите pinit.js, что приведет к волшебной замене этого тега привязки и загрузке нового iframe. Он невидим, потому что все еще находится в невидимом элементе div.
  • запустите дополнительную логику JS, чтобы проверить URL-адрес атрибута src для сгенерированного iframe, сохранив имя хоста для CDN pinterest.
  • ?

Затем я могу сгенерировать «нормализованные» URL-адреса для CDN pinterest, но... если я просто использую их как src для iframe, сгенерированного моей логикой, у меня будет та же проблема с чрезмерными GET. Все, что я сделал, это исключил последовательные вызовы pinit.js (который в любом случае кэшируется).

Кто-нибудь сталкивался с этим?

Я должен верить, что этот дизайн изменится — он кажется не масштабируемым для Pinterest в том виде, в котором он работает сейчас.


ИЗМЕНИТЬ

Я прочитал где-то еще, что pinterest предоставляет «асинхронный» механизм для кнопок «закрепить» на странице, подходящий для использования, когда кнопок «закрепить» много. Не уверен, что это такое; Я не мог найти его.


person Cheeso    schedule 21.03.2012    source источник


Ответы (1)


Я отвечаю на свой вопрос.

Я посмотрел, но не смог найти на pinterest подробного документа, описывающего, как подойти к этой проблеме. Я думаю, что их API слишком новый, слишком незрелый, чтобы покрыть это.

Проблема, которую я обнаружил, заключалась в том, что для каждой кнопки «закрепить» был один IFRAME, и этот iframe загружал источник из CDN pinterest. 10 изображений означали 10 iframe и 10 HTTP GET.

Я нашел способ вставить на веб-страницу одну кнопку, которая позволяет пользователю закрепить любое из 10 изображений. Это было сделано с помощью скрипта pinmarklet.js, предоставленного pinterest. Но этот скрипт у меня не работал, и в нем было несколько ошибок, поэтому я модифицировал его под свои нужды.

Теперь, когда я нажимаю кнопку «закрепить», она заполняет только один IFRAME, требует только одного HTTP GET, независимо от того, сколько фотографий доступно на странице. Пользовательский интерфейс выглядит следующим образом:

введите здесь описание изображения

... хотя, я думаю, вы можете сделать все, что захотите.

Какие проблемы я исправил?

Пинмарклет был

(а) тупой. Он определил анонимный скрипт, и страница должна была повторно запрашивать JS каждый раз, когда ей нужно было открыть всплывающую форму взаимодействия с pinterest. В этом нет необходимости. Давайте просто сделаем это один раз.

(б) сломанный. Было несколько ошибок, в том числе состояние гонки в коде, который пытается определить естественный размер изображения. Из-за этой ошибки форма пинмарклета иногда не отображалась. Хромой!

Я изменил код, чтобы исправить эти вещи, и теперь он хорошо работает для меня.

http://pastebin.com/y5fBRJHc

person Cheeso    schedule 26.03.2012
comment
Нет необходимости редактировать JS Pinterest. Ознакомьтесь со связанным вопросом и/или этим. - person Firsh - justifiedgrid.com; 10.02.2014
comment
Необходимо отредактировать JS, если вы хотите избежать состояния гонки, о котором я упоминал. Но, возможно, Pinterest решил эту проблему за 2 года с тех пор, как я ответил на этот вопрос. Это вполне возможно. - person Cheeso; 19.02.2014