2012-02-03 51 views
1

我有一个页面,我需要大约30个Facebook Like按钮。他们都喜欢相同的网址。基本上只需复制HTML代码。HTML - 如何在一个页面上高效地完成多个Facebook Like按钮

无论如何,当您加载页面时,每个Facebook Like Button div都会向Facebook拨打电话。你可以在开发工具中看到它。减慢了页面加载的速度。

是否有解决此问题的更有效的解决方案?

UPDATE

让我问一个替代的问题:有没有办法给每个Facebook的格状按钮,Facebook的服务器动态连接需求?所以基本上,当页面加载时,没有一个Facebook div与Facebook建立连接,并且脚本能够通过每个按钮并按需(按需)运行连接它的脚本。这可能吗?现在看来,它的工作方式是我的页面从Facebook下载all.js。该脚本查找页面上的所有Facebook div,并将它们连接到Facebook并将它们变为Like按钮。如果有一种方法可以选择性地在任何你想要的div上运行这个脚本,这将帮助我更接近解决方案...

+0

转向XFBML关闭如果是相同的URL,关闭FB JS API的小部件的自动渲染,什么是错的只有有一个按钮? – Bojangles 2012-02-03 22:16:39

+0

它是页面设计的一部分。我只是开发人员,而不是设计师。 – 2012-02-03 22:19:09

+0

我只是好奇;从外部的角度来看,似乎很难复制同一条信息30次,但当然它超出了你的控制范围:-) – Bojangles 2012-02-03 23:28:22

回答

0

多的测试之后,这是我的最终解决方案:

载入Facebook的all.js SDK自动解析页面上所有的Facebook如按钮。不幸的是没有选择加载SDK而没有解析现有的Facebook Like按钮。

两个解决方案:

  1. 加载SDK和没有你的页面上的任何Facebook的赞按钮。然后,每当屏幕上出现一个Like按钮时,加载Like按钮html/fbxml,然后使用SDK分析标记。我没有测试这个。

  2. 根本不加载SDK。只需使用AJAX即可在需要加载的位置动态添加Facebook iframe。我去了这个解决方案。

0

如果您使用iFrame like按钮,也许XFBML Like按钮不会打这些电话。

你必须合并包括验证脚本的facebook jdk,这看起来像很多像按钮一样。我只会尝试这一点,如果有很多像按钮而不是一个按钮是至关重要的。

+0

但是如果我有30个iFrames,每一个都必须加载相同的HTML。我认为这会变得相当缓慢。 – 2012-02-03 22:20:05

+0

这就是为什么我说,如果你使用iFrame像按钮。所以我认为你使用的是XFBML? – 2012-02-03 22:21:29

+0

不,我正在使用HTML5选项。它看起来和XFBML一样慢。 – 2012-02-03 22:41:03

0

这只是糟糕的设计。每个类似的按钮都会创建自己的iFrame,并且你无能为力。

+0

啊,我明白你的意思了。每个像按钮有自己的iFrame是糟糕的设计_by Facebook_确实。 – lnostdal 2012-04-23 15:16:52

+1

@Inostdal Facebook的设计不好?他们还会如何阅读您的会话cookie? – 2012-04-23 21:01:25

+0

一个好的设计将是他们不做这样的事情;没有阅读会话cookie或类似的东西 – lnostdal 2012-11-05 15:47:42

-1

您可以使用参数使您的URL略有不同,并设置每个像一个不同的ref属性。

+0

这将如何帮助连接数量? – 2013-06-14 10:18:57

3

如果有一种方法,你 想,这将有助于我更接近解决任何DIV选择运行此脚本...

是的,你可以在运行FB.XFBML.parse();特定的DOM对象。所以动态地将类似的按钮代码添加到div,然后在其上调用FB.XFBML.parse();。请参阅:http://developers.facebook.com/docs/reference/javascript/FB.XFBML.parse/

FB.XFBML.parse(document.getElementById('foo'));

+0

是的,我看到了。试图避免使用XFBML标记,而是使用HTML5实现。对于非XFBML是否有类似的解析方法? – 2012-02-06 16:21:57

+0

我认为同样的解析方法甚至会出去找到HTML5版本的新实例。 – DMCS 2012-02-06 16:39:22

3

我知道这是一个老话题,但这可能会派上用场,对于其他人也有同样的问题。

如果您在搜索结果页面上有每吨结果的facebook小部件,并希望它们全都呈现,但不想在同一时间用大量连接击中用户,则可以使用它节制渲染。

代码:

var fbThrottle = (function() { 
    var settings = { 
     // how many widgets can be rendering at any one time 
     simultaneousRenders: 3, 
     // how often to add a new widget to the queue, if the queue is not full 
     renderInterval: 100, 
     // max amount of time we will wait until marking a widget as rendered 
     // this is in place so as not to block the queue if a widget takes too long 
     maxRenderWaitFailsafe: 5000, 
     // how long to wait before calling the callback function (if supplied) 
     // after a widget finishes rendering. can be used to say set the area visible after render if you had it hidden to prevent fout. 
     callbackDelay: 250, 
    }; 

    var fbWidgets = []; 
    var activeRenders = 0; 

    setInterval(function() { 
     if (fbWidgets.length == 0) 
      return; 

     if (!window.FB) 
      return; 

     if (activeRenders < settings.simultaneousRenders) { 
      var obj = fbWidgets.shift(); 

      if (typeof obj !== 'undefined') { 
       activeRenders++; 

       (function() { 
        var currentRenderDone = false; 

        setTimeout(function() { 
         if (!currentRenderDone) { 
          activeRenders--; 
          currentRenderDone = true; 
         } 
        }, settings.maxRenderWaitFailsafe); 

        window.FB.XFBML.parse(obj.widget, function() { 
         if (!currentRenderDone) { 
          activeRenders--; 
          currentRenderDone = true; 
         } 

         if (typeof obj.callback === 'function') { 
          setTimeout(function() { 
           obj.callback(); 
          }, settings.callbackDelay); 
         } 
        }); 
       })(); 
      } 
     } 
    }, settings.renderInterval); 

    return { 
    add: function (widget, callback, top) { 
     if (typeof widget === 'undefined') 
      return; 

     if (typeof widget === 'string') 
      widget = document.getElementById(widget); 

     var obj = { 
      widget: widget, 
      callback: callback 
     }; 

     if (top) 
      fbWidgets.unshift(obj); 
     else { 
      fbWidgets.push(obj); 
     } 
    }, 
    }; 
})(); 

用法:

您可以将元素添加到油门一下子,或有声纳通过他们,因为他们变得可见。

// add in the element to be rendered to the end of the list 
fbThrottle.add(element); 

// or you can pass in just the id 
fbThrottle.add("idOfElement"); 

// you can pass in a callback as well 
fbThrottle.add(element, function(){ 
    // do something after 
}); 

// you can add an element to the top of the list by setting the third parameter to true 
fbThrottle.add(element, callback, true); 

由于Jakobud提到最好是在你的FB.init

window.FB.init({ 
    xfbml: false 
}); 
+1

我很想看到类似按钮的html5版本的东西 – 2013-01-22 08:40:59

相关问题