当href参数是变量时,Facebook Share对话框不起作用

时间:2014-09-25 18:33:47

标签: jquery facebook url facebook-javascript-sdk href

我试图在我的网络应用中分享Facebook上的链接。我已经初始化了SDK等,以下代码工作正常:

callToMyAPI()
    .then(function(response) {
        FB.ui({
            method: "share",
            href: "http://www.google.com",
        }, function(response) {
            console.log(response);
        });
    });

这会弹出一个Facebook共享对话框,其中包含指向http://www.google.com的链接和一些嵌入式预览(底部的框显示URL中的图像,以及页面中的标题和说明/摘录) 。当我点击"发布到Facebook"对话框中的按钮,然后切换到Facebook,我看到带有共享链接的帖子。

但是我需要使用从我的API返回的值动态设置href参数。所以我这样做了:

callToMyAPI()
    .then(function(response) {
        var url = response; // http://www.google.com

        FB.ui({
            method: "share",
            href: url,
        }, function(response) {
            console.log(response);
        });
    });

基本上,我所做的就是用变量"http://www.google.com"替换硬编码的url(其值为响应,即http://www.google.com)。其他一切都完全一样。但是当我这样做时,会发生什么:

  1. Facebook分享对话框仍然会打开,但它缺少我试图分享的网址的嵌入式预览

  2. 当我点击"发布到Facebook"按钮,对话框关闭,但没有任何内容发布到Facebook。并且记录的响应只是一个空数组([]

  3. 因此,使用我的API的响应作为href值会让人感到窒息,但我不明白为什么。我该如何解决这个问题?


    更新:经过多次反复试验,我发现了这种奇怪的行为......

    如果我使用http://dev.example.com作为href值(其中example.com实际上是我的真实域名),我就无法在“共享”对话框中获得预览,并且没有任何内容发布到Facebook :

    FB.ui({
        method: "share",
        href: "http://dev.example.com"
    });
    

    但如果我使用http://www.example.com(请注意www)作为href值(再次,example.com实际上是我的真实域名),我仍然不会在“共享”对话框中进行预览,但帖子 通过:

    FB.ui({
        method: "share",
        href: "http://www.example.com"
    });
    

    但是,由于“共享”对话框中仍然没有预览,因此它实际上并未将链接附加到邮件。所以在Facebook上,我得到的是一篇帖子,上面写着我写的任何评论,但没有http://www.example.com的嵌入式链接。

3 个答案:

答案 0 :(得分:3)

真正的答案是三方面的:

  1. 我的http://dev.example.com网站需要身份验证;我完全忘了这个,因为我保存了用户名/密码,因此它从不提示我

  2. 我的http://www.example.com实际上是一个较长的网址(http://www.example.com/test/12345),它没有指向该服务器上的现有网页(它只存在于我的开发服务器上)。因此,Facebook可以访问该网址(无需身份验证),但无法从中获取任何内容,因此,为什么帖子会通过,但没有嵌入式预览

  3. 我分享的页面缺少各种Open Graph元标记(og:type等);显然href是您可以通过共享方法传递的唯一参数,而共享所需的所有其他内容必须来自页面上的OG标记

  4. 所以我在页面上添加了缺少的OG标签(og:url除外),在我的开发服务器上禁用了auth(暂时用于测试),现在最后帖子正在通过附加正确的链接。< / p>

答案 1 :(得分:1)

我现在使用feed方法代替share方法解决了这个问题,如this answer中所述:

callToMyAPI()
    .then(function(response){
        var url = response;

        FB.ui({
            method: "feed",
            link: url,
        }, function(response) {
            console.log(response);
        });
    });

语法与share方法完全相同,只有参数名称为link而不是href,并且工作正常。这证实了我的回答确实是一个字符串,所以我真的不明白为什么share不会以相同的方式工作。

唯一的问题是,feed方法是deprecated,并且将于2015年4月30日停止工作。所以我仍然希望找到一种方法来使用较新的share方法。

答案 2 :(得分:1)

我遇到了同样的问题,我通过在我必须分享的网址末尾添加一个随机GET参数来解决它。

例如:

var url = window.location;
url = url+"?randomParameter=randomValue"

FB.ui({ method:'share', href: url }, function(response){});