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

Я пытаюсь создать и манипулировать кнопкой Pin It после загрузки страницы. Когда я изменяю свойства кнопки с помощью js, она должна быть перерисована, чтобы получить функциональность закрепления динамически загружаемых изображений. Итак, есть ли у Pinterest какой-либо метод, подобный функции Facebook B.XFBML.parse()?

Спасибо...


person onur    schedule 19.02.2012    source источник


Ответы (13)


Просто добавьте атрибут data-pin-build к тегу SCRIPT:

<script defer
  src="//assets.pinterest.com/js/pinit.js"
  data-pin-build="parsePinBtns"></script>

Это приводит к тому, что pinit.js предоставляет свою внутреннюю функцию build глобальному объекту window как функцию parsePinBtns.

Затем вы можете использовать его для анализа ссылок в неявном элементе или всех ссылок на странице:

// parse the whole page
window.parsePinBtns();

// parse links in #pin-it-buttons element only
window.parsePinBtns(document.getElementById('pin-it-buttons'));

Совет: чтобы показать нулевой счет, просто добавьте data-pin-zero="1" к тегу SCRIPT.

person Styx    schedule 06.01.2014
comment
Это потрясающе! Как вы узнали об этом? - person Mikhail; 15.01.2014
comment
Это гораздо более простой способ выполнить то, что делает принятый ответ. Отличная работа, Стикс! - person creativetim; 20.01.2014
comment
Работает, но необходимо убедиться в следующем: 1. скрипт Pinterest должен вызываться таким образом первым на странице. Если он был загружен без него, то другой экземпляр его загрузки может не сделать доступной функцию сборки. 2. Сценарий Pinterest удаляет этот тег сценария и вместо него вставляет pinit_main.js. Во время процесса он проверяет тег скрипта first pinit.js, имеет ли он атрибут data-pin-build, и если да, то использует его. 3. Несжатый файл pinit_main.js находится здесь< /а> - person Firsh - justifiedgrid.com; 10.02.2014
comment
Мне нравится это решение. Почему так сложно найти такую ​​информацию на веб-сайте документации Pinterest? - person Hewins; 30.04.2014
comment
Отличное решение! Работал отлично для меня. Я не могу поверить, что этот хук функции все еще не задокументирован в 2016 году! - person wuworkshop; 23.11.2016
comment
Просто хотел добавить, что есть комментарий к проблеме GitHub, в котором упоминается этот недокументированный функциональный хук. github.com/pinterest/widgets/issues/13#issuecomment-27737036 - person wuworkshop; 03.01.2017

Лучший способ сделать это:

  1. Удалите iframe кнопки Pin It, которой вы хотите управлять.
  2. Добавьте html для новой кнопки, манипулируя ею по своему усмотрению.
  3. Realod их скрипт - т.е. используя jQuery:

    $.ajax({ url: 'http://assets.pinterest.com/js/pinit.js', dataType: 'script', cache:true});
    
person Carlo Mallone    schedule 23.02.2012
comment
Это работает для меня, и я предпочитаю это, поскольку не требуется поддерживать локальный Javascript, чтобы оставаться в синхронизации с тем, что Pinterest может сделать в будущем. - person DavidJ; 15.04.2013
comment
Я использовал это в ситуации с бесконечной прокруткой, и все, что мне нужно было сделать, это сделать строку ajax после загрузки любого нового контента. Работает как шарм! - person Kevin Beal; 25.07.2013

Чтобы отобразить кнопку «пин-ит» после загрузки страницы, вы можете использовать:

<a href="..pin it link.." id="mybutton" class="pin-it-button" count-layout="none">
    <img border="0" src="//assets.pinterest.com/images/PinExt.png" width="43" height="21" title="Pin It" />
</a>
<script>
    var element = document.getElementById('mybutton');
    (function(x){ for (var n in x) if (n.indexOf('PIN_')==0) return x[n]; return null; })(window).f.render.buttonPin(element);
</script>

Если, конечно, assets.pinterest.com/js/pinit.js уже загружен на страницу. Объект рендеринга имеет некоторые другие полезные методы, такие как buttonBookmark, buttonFollow, ebmedBoard, embedPin, embedUser< /сильный>.

person Tsanyo Tsanev    schedule 17.11.2012

Я использовал решение Деррека (и исправил проблему с необъявленными переменными), чтобы сделать возможной динамическую загрузку кнопки pinterest, чтобы она не могла замедлить время загрузки. Только косвенно связано с исходным вопросом, но я все равно решил поделиться.

в конце документа:

<script type="text/javascript">
addPinterestButton = function (url, media, description) {
    var js, href, html, pinJs;
    pinJs = '//assets.pinterest.com/js/pinit.js';
    //url = escape(url);
    url = encodeURIComponent(url);
    media = encodeURIComponent(media);
    description = encodeURIComponent(description);
    href = 'http://pinterest.com/pin/create/button/?url=' + url + '&media=' + media + '&description=' + description;
    html = '<a href="' + href + '" class="pin-it-button" count-layout="vertical"><img border="0" src="http://assets.pinterest.com/images/PinExt.png" title="Pin It" /></a>';
    $('#pinterestOption').html(html);

    //add pinterest js
    js = document.createElement('script');
    js.src = pinJs;
    js.type = 'text/javascript';
    document.body.appendChild(js);
}
</script>

в функции готовности документа:

addPinterestButton('pageURL', 'img', 'description');//replace with actual data

в вашем документе, где вы хотите, чтобы кнопка pinterest отображалась, просто добавьте элемент с идентификатором pinterestOption, т.е.

<div id="pinterestOption"></div>

надеюсь, что это поможет кому-то!

person Jay Paroline    schedule 14.05.2012

Вот что я сделал.

Сначала я посмотрел на pinit.js и определил, что он заменяет специально помеченные теги привязки на IFRAME. Я подумал, что могу написать логику javascript, чтобы получить имя хоста, используемое атрибутом src в сгенерированных фреймах.

Итак, я вставил разметку по обычным рекомендациям pinterest, но якорный тег поместил в невидимый div.

<div id='dummy' style='display:none;'>
<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>
</div>
<script type="text/javascript" src="//assets.pinterest.com/js/pinit.js">
</script>

Затем, сразу после этого, я вставил скрипт, чтобы получить имя хоста для CDN pinterest из внедренного iframe.

//
// pint-reverse.js
//
// logic to reverse-engineer pinterest buttons.
//
// The standard javascript module from pinterest replaces links to
// http://pinterest.com/create/button with links to some odd-looking
// url based at cloudfront.net. It also normalizes the URLs.
//
// Not sure why they went through all the trouble. It does not work for
// a dynamic page where new links get inserted.  The pint.js code
// assumes a static page, and is designed to run "once" at page creation
// time.
//
// This module spelunks the changes made by that script and
// attempts to replicate it for dynamically-generated buttons.
//

pinterestOptions = {};

(function(obj){

    function spelunkPinterestIframe() {
        var iframes = document.getElementsByTagName('iframe'),
            k = [], iframe, i, L1 = iframes.length, src, split, L2;

        for (i=0; i<L1; i++) {
            k.push(iframes[i]);
        }
        do {
            iframe = k.pop();
            src = iframe.attributes.getNamedItem('src');
            if (src !== null) {
                split = src.value.split('/');
                L2 = split.length;
                obj.host = split[L2 - 2];
                obj.script = split[L2 - 1].split('?')[0];
                //iframe.parentNode.removeChild(iframe);
            }
        } while (k.length>0);
    }

    spelunkPinterestIframe();

}(pinterestOptions));

Потом,

function getPinMarkup(photoName, description) {
    var loc = document.location,
        pathParts = loc.pathname.split('/'),
        pageUri = loc.protocol + '//' + loc.hostname + loc.pathname,
        href = '/' + pathToImages + photoName,
        basePath = (pathParts.length == 3)?'/'+pathParts[1]:'',
        mediaUri = loc.protocol+'//'+loc.hostname+basePath+href,
        pinMarkup;

    description = description || null;

    pinMarkup = '<iframe class="pin-it-button" ' + 'scrolling="no" ' +
        'src="//' + pinterestOptions.host + '/' + pinterestOptions.script +
        '?url=' + encodeURIComponent(pageUri) +
        '&media=' + encodeURIComponent(mediaUri);

    if (description === null) {
        description = 'Insert standard description here';
    }
    else {
        description = 'My site - ' + description;
    }

    pinMarkup += '&description=' + encodeURIComponent(description);
    pinMarkup += '&title=' + encodeURIComponent("Pin this " + tagType);
    pinMarkup += '&layout=horizontal&count=1">';
    pinMarkup += '</iframe>';
    return pinMarkup;
}

А затем используйте его из jQuery следующим образом:

    var pinMarkup = getPinMarkup("snap1.jpg", "Something clever here");
    $('#pagePin').empty(); // a div...
    $('#pagePin').append(pinMarkup);
person Cheeso    schedule 21.03.2012
comment
Я не тестировал скрипт, но кажется, что передача pageUri, mediaUri и description напрямую через getPinMarkup будет работать для меня, пока pinterest не добавит свою функцию. - person onur; 22.03.2012
comment
Cloudfront — это вещь AWS, которая будет хранить изображения в облаке. Они сделали это, вероятно, потому что они используют этот сервис. - person Kevin Beal; 25.07.2013

Я переписал код кнопки Pinterest для поддержки синтаксического анализа тегов Pinterest после загрузки содержимого AJAX, аналогично FB.XFBML.parse() или gapi.plusone.go(). В качестве бонуса альтернативный файл JavaScript в проекте поддерживает допустимый синтаксис HTML5.

Ознакомьтесь с проектом PinterestPlus на GitHub.

person Mike Kibbel    schedule 21.06.2012
comment
Мне бы очень хотелось, чтобы это сработало, но я даже не могу заставить его работать с нормально загруженными кнопками Pinit, а тем более с AJAX-загрузкой. - person andrewtweber; 12.04.2013

Вот что я сделал. Небольшая модификация @Derrick Grigg, чтобы заставить его работать с несколькими кнопками pinterest на странице после перезагрузки AJAX.

refreshPinterestButton = function () {
    var url, media, description, pinJs, href, html, newJS, js;
    var pin_url;
    var pin_buttons = $('div.pin-it a');
    pin_buttons.each(function( index ) {
        pin_url = index.attr('href');
        url = escape(getUrlVars(pin_URL)["url"]);
        media = escape(getUrlVars(pin_URL)["media"]);
        description = escape(getUrlVars(pin_URL)["description"]);
        href = 'http://pinterest.com/pin/create/button/?url=' + url + '&media=' + media + '&description=' + description;
        html = '<a href="' + href + '" class="pin-it-button" count-layout="horizontal"><img border="0" src="http://assets.pinterest.com/images/PinExt.png" title="Pin It" /></a>';
        index.parent().html(html);
    });

    //remove and add pinterest js
    pinJs = '//assets.pinterest.com/js/pinit.js';
    js = $('script[src*="assets.pinterest.com/js/pinit.js"]');
    js.remove();
    js = document.createElement('script');
    js.src = pinJs;
    js.type = 'text/javascript';
    document.body.appendChild(js);
}

});


function getUrlVars(pin_URL)
{
    var vars = [], hash;
    var hashes = pin_URL.slice(pin_URL.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}
person Sreejith Sreenivasan    schedule 18.04.2013
comment
Извините, это требует небольшого обновления строки № 6, она должна быть 'pin_url = $(this).attr('href');' - person Sreejith Sreenivasan; 20.04.2013
comment
Также вы можете использовать FB.XFBML.parse(document.getElementById('your container id')); twttr.widgets.load(); для повторного рендеринга кнопок facebook и twitter. - person Sreejith Sreenivasan; 20.04.2013

Попробуйте прочитать этот пост http://dgrigg.com/blog/2012/04/04/dynamic-pinterest-button/ он использует небольшой javascript, чтобы заменить iframe pinterest новой кнопкой, а затем перезагружает файл pinit.js. Ниже приведен javascript, чтобы сделать трюк

refreshPinterestButton = function (url, media, description) {
    var js, href, html, pinJs;
    url = escape(url);
    media = escape(media);
    description = escape(description);
    href = 'http://pinterest.com/pin/create/button/?url=' + url + '&media=' + media + '&description=' + description;
    html = '<a href="' + href + '" class="pin-it-button" count-layout="horizontal"><img border="0" src="http://assets.pinterest.com/images/PinExt.png" title="Pin It" /></a>';
    $('div.pin-it').html(html);

    //remove and add pinterest js
    pinJs = $('script[src*="assets.pinterest.com/js/pinit.js"]');
    pinJs.remove();
    js = document.createElement('script');
    js.src = pinJs.attr('src');
    js.type = 'text/javascript';
    document.body.appendChild(js);
}
person Derrick Grigg    schedule 04.04.2012

Официальный способ сделать это — установить атрибут «data-pin-build» при загрузке скрипта:

<script defer="defer" src="//assets.pinterest.com/js/pinit.js" data-pin-build="parsePins"></script>

Затем вы можете динамически отображать свои кнопки следующим образом:

// render buttons inside a scoped DOM element
window.parsePins(buttonDomElement);

// render the whole page
window.parsePins();

На этом сайте также есть другой метод, который позволяет вам рендерить их в JavaScript без тега script< /а>.

person Kamo    schedule 17.03.2014

Их файл pinit.js, ссылка на который содержится в их документация кнопки "Закрепить", не предоставляет никаких глобальных переменных. Он запускается один раз и не оставляет следов, кроме создаваемого iframe.

Вы можете снова ввести этот файл, чтобы «разобрать» новые кнопки. Их JS просматривает все теги привязки при запуске и заменяет их на class="pin-it-button" с помощью кнопки iframe.

person Ross Allen    schedule 21.02.2012

у меня это отлично работает: http://www.mediadevelopment.no/projects/pinit/ Он собирает все данные о событии клика

person pete    schedule 07.03.2012

Я попытался адаптировать их код, чтобы он работал таким же образом (зашел и забыл об этом), с добавлением того, что вы можете сделать вызов Pinterest.init(), чтобы иметь любые «новые» кнопки на странице (например, ajax добавлено, создано динамически и т. д.) превратилось в правильную кнопку.

Проект: https://github.com/onassar/JS-Pinterest Сырье: https://raw.github.com/onassar/JS-Pinterest/master/Pinterest.js

person onassar    schedule 12.10.2012

По состоянию на июнь 2020 года Pinterest обновил пин-код js до версии 2. Вот почему сборка данных может не работать на <script defer="defer" src="//assets.pinterest.com/js/pinit.js" data-pin-build="parsePins"></script>

Теперь работает на pinit_v2.js <script async defer src="//assets.pinterest.com/js/pinit_v2.js" data-pin-build="parsePins"></script>

person Sherzod Shermukhamedov    schedule 02.06.2020