如何使社交按钮与 location.hash 一起使用

Posted

技术标签:

【中文标题】如何使社交按钮与 location.hash 一起使用【英文标题】:How to make social buttons work with location.hash 【发布时间】:2011-12-23 15:31:50 【问题描述】:

我在 jQuery (http://creotiv.in.ua/examples/photowall/ - 略为 NSFW) 中创建了一些图库脚本,并希望为每张图片添加社交按钮,以便用户可以分别为每张图片点赞。 但是在添加社交按钮后,我发现它们没有使用 url 哈希部分,但我用它来浏览所有图像。

如果您单击图库图片,您会在底部看到三个社交媒体按钮。他们使用的是图库 URL,而不是每张图片的 URL。

可能有人知道如何让 Twitter、Google+ 和 Facebook 按钮使用页面位置散列,如果更改则更改它?

这是生成社交按钮的代码:

(function(w, d, s) 
  function go()
    var js, fjs = d.getElementsByTagName(s)[0], load = function(url, id) 
      if (d.getElementById(id)) return;
      js = d.createElement(s); js.src = url; js.id = id;
      fjs.parentNode.insertBefore(js, fjs);
    ;
    load('https://connect.facebook.net/en_US/all.js#xfbml=1', 'fbjssdk');
    load('https://apis.google.com/js/plusone.js', 'gplus1js');
    load('https://platform.twitter.com/widgets.js', 'tweetjs');
  
  if (w.addEventListener)  w.addEventListener("load", go, false); 
  else if (w.attachEvent)  w.attachEvent("onload",go); 
(window, document, 'script'));

【问题讨论】:

警告 - 有品位的网站,但有一些鲣鸟。 您是如何创建社交媒体按钮的?代码生成服务器端还是客户端?可以发一下代码吗? 这是我工作的一部分,因为我是摄影师) 在描述中添加了社交代码。 html 代码是每个按钮的标准代码。主要问题是我可以在每张照片更改时重新创建社交按钮,但这对客户来说很难(所以这不是答案) 此外,即使使用 window.history.push(),此按钮也不起作用;这不仅会更改所有 url 的哈希部分。 【参考方案1】:

URL 的哈希部分仅由 Web 浏览器用户界面处理,HTML 解析器会忽略它。

有一个规范可以让 hashbanged 页面可抓取:

 https://code.google.com/web/ajaxcrawling/docs/specification.html

但是还没有爬虫或网站支持它。

您需要找到一种方法来使用真实的图片网址而不是 hashbang 网址。

【讨论】:

我使用哈希在 jquery 库中导航。例如 photo1 - example.com/#p=1, photo2 - example.com/#p=2 这不是为爬虫提供的,而是为用户提供的,因此他们可以将 url 保存到他们喜欢的全屏图像中。另外,他们可以共享此图像的 url,我添加了社交按钮。但问题是他们不使用 url 的哈希部分,或者在加载时只使用一次。 啊哈。抱歉 :( 我在想 Facebook 分享(点击分享后)屏幕会给你不正确的 URL 和照片预览,因为它不读取哈希值。 Facebook 和 google 共享确实给出了不正确的 url,因为当我与 hash 共享 url 时,它会从中删除 hash 并只保存主要部分和搜索部分【参考方案2】:

好的...让我们再试一次。这些共享脚本在 load() 期间运行时使用现有的 window.location 来获取 URL 并生成 HTML。 URL 存储在此 HTML 中,并且此 HTML 仅生成一次。我猜他们不公开 API 会动态更新组件内的 URL。您无法从父框架访问数据,因此您无法自行更新 URL。

对于 Facebook,您可以使用 Facebook javascript SDK 对共享小部件进行更底层的访问。我不知道这是否适用于其他社交网络。

听起来更好? :)

【讨论】:

并非如此(如果他们在加载时构建 url - 这是错误,因为 url 可以更改。许多脚本和所有 Flash 页面都使用哈希部分进行导航。 我认为没有正常的方法可以做到这一点。这真的很糟糕。 请将您的反馈提交给相应的 API 作者,他们可能会在未来的版本中修复它【参考方案3】:

仅找到一个解决此问题的方法。在 url 更改时重新初始化所有社交按钮。像这样:

//Facebook like
if(typeof(FB) !== 'undefined')
     FB.XFBML.parse(document.getElementById('fblike'));

//Google plus one
if(typeof(gapi) !== 'undefined') 
    gapi.plusone.render(document.getElementById('gplus'),
        'href':location.href,
        'annotation':'bubble',
        'width': 90,
        'align': 'left',
        'size': 'medium'
    );


//Twitter tweet button
if(typeof(twttr) !== 'undefined') 
    $('.twitter-share-button').attr('data-url',location.href);
    twttr.widgets.load();

使用这样的html代码:

<div style="float:left;margin-top: 5px;width:80px;">
    <div id="gplus" class="g-plusone" data-size="medium"></div>
</div>
<div style="float:left;margin-top:5px;width:90px;">
    <a href="https://twitter.com/share" class="twitter-share-button">Tweet</a>
</div>
<div style="float:left;margin-top:5px;width:80px;" id="fblike">
    <fb:like send="false" layout="button_count"  show_faces="false"></fb:like>
</div>

但是G+按钮仍然存在bug,因为它使用正确的url进行分享,而不是用于计数

【讨论】:

以上是关于如何使社交按钮与 location.hash 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

单击时如何使用 Angular js 的 $location.hash 更改 html 元素的颜色?

如何使开放图形链接与301重定向一起使用

如何使 UIButton 与 UIScrollView 一起移动

如何使社交图标与移动设备的中心对齐?

如何将 Azure 授权社交提供程序与静态 html 角度网站一起使用?

location.hash的不一样用法