How can i rerender Pinterest's Pin It button?

前端 未结 13 2139
暖寄归人
暖寄归人 2021-01-30 18:14

I\'m trying to create and manipulate the Pin It button after page load. When i change the button properties with js, it should be rerendered to get the functionality of pinning

相关标签:
13条回答
  • 2021-01-30 18:28

    Try reading this post http://dgrigg.com/blog/2012/04/04/dynamic-pinterest-button/ it uses a little javascript to replace the pinterest iframe with a new button and then reloads the pinit.js file. Below is the javascript to do the trick

    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);
    }
    
    0 讨论(0)
  • 2021-01-30 18:29

    As of June 2020, Pinterest updated the pin js code to v2. That's why data-pin-build might not work on <script defer="defer" src="//assets.pinterest.com/js/pinit.js" data-pin-build="parsePins"></script>

    Now it works on pinit_v2.js <script async defer src="//assets.pinterest.com/js/pinit_v2.js" data-pin-build="parsePins"></script>

    0 讨论(0)
  • 2021-01-30 18:35

    I tried to adapt their code to work the same way (drop in, and forget about it), with the addition that you can make a call to Pinterest.init() to have any "new" buttons on the page (eg. ajax'd in, created dynamically, etc.) turned into the proper button.

    Project: https://github.com/onassar/JS-Pinterest Raw: https://raw.github.com/onassar/JS-Pinterest/master/Pinterest.js

    0 讨论(0)
  • 2021-01-30 18:40

    I built on Derrek's solution (and fixed undeclared variable issue) to make it possible to dynamically load the pinterest button, so it can't possibly slow down load times. Only tangentially related to the original question but I thought I'd share anyway.

    at end of document:

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

    in document ready function:

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

    in your document where you want the pinterest button to appear, just add an element with the id pinterestOption, i.e.

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

    hope that helps someone!

    0 讨论(0)
  • 2021-01-30 18:41

    Here's what I did.

    First I looked at pinit.js, and determined that it replaces specially-marked anchor tags with IFRAMEs. I figured that I could write javascript logic to get the hostname used by the src attribute on the generated iframes.

    So, I inserted markup according to the normal recommendations by pinterest, but I put the anchor tag into an invisible 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>
    

    Then, immediately after that, I inserted a script to slurp up the hostname for the pinterest CDN, from the injected 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));
    

    Then,

    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;
    }
    

    And then use it from jQuery like this:

        var pinMarkup = getPinMarkup("snap1.jpg", "Something clever here");
        $('#pagePin').empty(); // a div...
        $('#pagePin').append(pinMarkup);
    
    0 讨论(0)
  • 2021-01-30 18:43

    To render a pin-it button after a page has loaded you can use:

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

    Assuming of course the assets.pinterest.com/js/pinit.js is already loaded on the page. The render object has some other useful methods like buttonBookmark, buttonFollow, ebmedBoard, embedPin, embedUser.

    0 讨论(0)
提交回复
热议问题