Как я могу изменить кнопку Pin It Pinterest? - PullRequest
21 голосов
/ 19 февраля 2012

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

Спасибо ...

Ответы [ 12 ]

44 голосов
/ 06 января 2014

Просто добавьте атрибут 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.

14 голосов
/ 23 февраля 2012

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

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

    $.ajax({ url: 'http://assets.pinterest.com/js/pinit.js', dataType: 'script', cache:true});
    
9 голосов
/ 18 ноября 2012

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

<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 .

4 голосов
/ 14 мая 2012

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

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

<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

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

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

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

3 голосов
/ 21 июня 2012

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

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

3 голосов
/ 21 марта 2012

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

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

Итак, я вставил разметку в соответствии с обычными рекомендациями по процентам, но я поместил тег привязки в невидимый 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 интереса из вставленного 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);
2 голосов
/ 18 апреля 2013

Вот что я сделал ... Небольшая модификация @Derrick Grigg, позволяющая работать с несколькими кнопками интереса на странице после перезагрузки 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;
}
2 голосов
/ 05 апреля 2012

Попробуйте прочитать этот пост http://dgrigg.com/blog/2012/04/04/dynamic-pinterest-button/ он использует небольшой javascript для замены pra iframe новой кнопкой и затем перезагружает файл 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);
}
1 голос
/ 21 февраля 2012

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

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

0 голосов
/ 17 марта 2014

Официальный способ сделать это - установить атрибут «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 без тега сценария .

...