【问题标题】:How can i rerender Pinterest's Pin It button?如何重新呈现 Pinterest Pin It 按钮?
【发布时间】:2012-02-19 18:42:24
【问题描述】:

我正在尝试在页面加载后创建和操作 Pin It 按钮。当我使用 js 更改按钮属性时,应该重新渲染它以获得固定动态加载图像的功能。那么,Pinterest 有没有类似 Facebook 的 B.XFBML.parse() 函数的方法?

谢谢...

【问题讨论】:

    标签: javascript ajax asynchronous pinterest


    【解决方案1】:

    只需将data-pin-build 属性添加到SCRIPT 标签:

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

    这会导致pinit.js 将其内部build 函数作为parsePinBtns 函数公开给全局window 对象。

    然后,您可以使用它来解析隐式元素中的链接或页面上的所有链接:

    // 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 标记即可。

    【讨论】:

    • 太棒了!你是怎么知道的?
    • 这是完成公认答案的更直接的方法。干得好,冥河!
    • 有效,但要确保以下几点:1. Pinterest 脚本必须首先在页面中像这样调用。如果它在没有它的情况下被加载,那么另一个加载它的实例可能不会使构建函数暴露。 2. Pinterest 脚本会删除此脚本标签并放入 pinit_main.js。在此过程中,它检查 first pinit.js 脚本标记是否具有 data-pin-build 属性,如果有,则使用它。 3. 未压缩的 pinit_main.js 为 here
    • 我喜欢这个解决方案。为什么在 Pinterest 文档网站上很难找到此类信息?
    • 简单有效的解决方案。在他们的开发者文档的 pin-it 页面上找不到任何相关信息:developers.pinterest.com/pin_it 我真的很想知道这个提示来自哪里。
    【解决方案2】:

    最好的方法:

    1. 删除要操作的 Pin It 按钮的 iframe
    2. 为新按钮添加 html 以根据需要进行操作
    3. 重新编写他们的脚本 - 即使用 jQuery:

      $.ajax({ url: 'http://assets.pinterest.com/js/pinit.js', dataType: 'script', cache:true});
      

    【讨论】:

    • 这对我有用,我更喜欢它,因为它不需要维护本地 Javascript 来与 Pinterest 未来可能做的任何事情保持同步。
    • 我在无限滚动的情况下使用了它,我需要做的就是在加载任何新内容后执行 ajax 行。像魅力一样工作!
    【解决方案3】:

    要在页面加载后呈现 pin-it 按钮,您可以使用:

    <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 已经加载到页面上。渲染对象还有一些其他有用的方法,如 buttonBookmarkbuttonFollowebmedBoardembedPinembedUser。

    【讨论】:

      【解决方案4】:

      我建立在 Derrek 的解决方案(并修复了未声明的变量问题)的基础上,使动态加载 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 按钮出现的文档中,只需添加一个 id 为 pinterestOption 的元素,即

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

      希望对某人有所帮助!

      【讨论】:

        【解决方案5】:

        这就是我所做的。

        首先我查看了 pinit.js,并确定它用 IFRAME 替换了特殊标记的锚标记。我想我可以编写 javascript 逻辑来获取生成的 iframe 上 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>
        

        然后,紧接着,我插入了一个脚本,从注入的 iframe 中获取 pinterest CDN 的主机名。

        //
        // 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);
        

        【讨论】:

        • 我没有测试脚本,但似乎直接通过 getPinMarkup 传递 pageUri、mediaUri 和 description 对我有用,直到 pinterest 添加自己的功能。
        • cloudfront 是 AWS 的东西,可以将图像存储在云中。他们这样做可能是因为他们使用了该服务。
        【解决方案6】:

        我重写了 Pinterest 按钮代码以支持在加载 AJAX 内容后解析 Pinterest 标签,类似于 FB.XFBML.parse() 或 gapi.plusone.go()。作为奖励,项目中的备用 JavaScript 文件支持 HTML5 有效的语法。

        查看PinterestPlus project at GitHub.

        【讨论】:

        • 我真的希望这能奏效,但我什至无法让它在正常加载的 Pinit 按钮上工作,更不用说加载 AJAX 了
        【解决方案7】:

        这就是我所做的.. 对@Derrick Grigg 稍作修改,使其在 AJAX 重新加载后可以在页面上的多个 pinterest 按钮上工作。

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

        【讨论】:

        • 抱歉,这需要在第 6 行进行小更新,应该是 'pin_url = $(this).attr('href');'
        • 您也可以使用FB.XFBML.parse(document.getElementById('your container id')); twttr.widgets.load(); 重新渲染 facebook 和 twitter 按钮。
        【解决方案8】:

        尝试阅读这篇http://dgrigg.com/blog/2012/04/04/dynamic-pinterest-button/ 的帖子,它使用一个小的 javascript 将 pinterest 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);
        }
        

        【讨论】:

          【解决方案9】:

          官方的做法是在加载脚本时设置“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();
          

          这个网站上还有另一种方法可以让你render them in JavaScript without the script tag

          【讨论】:

            【解决方案10】:

            他们的pinit.js 文件(在他们的"Pin it" button docs 中引用)不公开任何全局变量。它运行一次,除了它创建的 iframe 之外不会留下任何痕迹。

            您可以再次注入该文件以“解析”新按钮。他们的 JS 在运行时会查看所有锚标签,并用他们的 iframe 按钮替换为 class="pin-it-button" 的标签。

            【讨论】:

              【解决方案11】:

              这对我来说很好用:http://www.mediadevelopment.no/projects/pinit/ 它会获取点击事件的所有数据

              【讨论】:

                【解决方案12】:

                我试图调整他们的代码以同样的方式工作(插入,然后忘记它),此外您可以调用 Pinterest.init() 以在页面上添加任何“新”按钮(例如,ajax'd in、动态创建等)变成了正确的按钮。

                项目:https://github.com/onassar/JS-Pinterest 原始:https://raw.github.com/onassar/JS-Pinterest/master/Pinterest.js

                【讨论】:

                  【解决方案13】:

                  截至 2020 年 6 月,Pinterest 将 pin js 代码更新为 v2。这就是为什么 data-pin-build 可能无法正常工作的原因 &lt;script defer="defer" src="//assets.pinterest.com/js/pinit.js" data-pin-build="parsePins"&gt;&lt;/script&gt;

                  现在它适用于 pinit_v2.js &lt;script async defer src="//assets.pinterest.com/js/pinit_v2.js" data-pin-build="parsePins"&gt;&lt;/script&gt;

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2014-01-27
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-04-06
                    • 2012-10-11
                    • 1970-01-01
                    • 2013-03-27
                    相关资源
                    最近更新 更多