我试图在我的应用中实现facebook分享按钮,但是我似乎无法让它继续工作并且为什么这是我到目前为止所为。
HTML(/后/一些随机串)
<div id="fb-root"></div>
<meta property="og:site_name" content="App">
<meta property="og:url" content="/post/{{data.permalink}}">
<meta property="og:title" content="{{data.title}}">
<meta property="og:type" content="blog">
<meta property="og:image" content="https://i1.ytimg.com/vi/tIWPnxEpNQg/maxresdefault.jpg">
<meta property="og:description" content="{{data.preview}}">
<body >
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&appId=580882498674160&version=v2.0";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
// this facebook share button doesn't appear.
<div class="fb-share-button" data-href="https://developers.facebook.com/docs/plugins/" data-type="button"></div>
//so i manually make one.
<a href="" ng-click='facebookShare();'>Share</a>
</body>
controller.js
$scope.facebookShare= function(){
return window.open('http://www.facebook.com/sharer/sharer.php?u='+encodeURIComponent(location.href), 'facebook_share', 'height=320, width=640, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, directories=no, status=no');
}
它有效但它没有读取我在html页面上面写的元标记,而是从我的索引页面读取
索引页
<!DOCTYPE html>
<html ng-app='app'>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<noscript>
<meta http-equiv="refresh" content="7">
<style type="text/css">
.pagecontainer {display:none;}
</style>
<div class="pure-u-1 text-center">
<title>Symsal- Oh no ! We need Javascript to work !</title>
<h3> Please Enable javascript </h3>
</div>
</noscript>
<head>
<title ng-bind='title'></title>
// some css file
</head>
<body>
<div class='puretype'>
<div ng-controller="MasterCtrl">
<div id="layout">
<!-- Menu toggle -->
<a href="" id="menuLink" class=" white menu-link">
<span></span>
</a>
<div id='menu' class="pure-u-1">
<div ng-bind-html="userView"></div>
</div>
</div>
<div class="pure-g-r">
<div id="feed-container" class='pure-u-1 slide'ng-view=''></div>
</div>
</div>
</div>
// some javascript files
</body>
</html>
facebook调试器
答案 0 :(得分:14)
jackypan1989说的是真的,你将必须使用绝对网址。 但另一件我非常确定的事情是Facebook不会运行你的JavaScript代码,因此部分
<meta property="og:url" content="/post/{{data.permalink}}">
永远不会被
取代<meta property="og:url" content="/post/the-page-that-was-shared">
您遇到此问题也可能会阻止Google抓取您的网页。
我们遇到了同样的问题,我们使用https://prerender.io来解决它。 您可以在自己的服务器上使用它,也可以使用其中一种免费/付费服务。
答案 1 :(得分:2)
您已经在ng-view周围定义了一个正文。然后你的视图有自己的身体。所以你试图在身体内注射一个不会做你想要的身体。
请注意,您的控制器不控制包含Meta标记的HTML元素。它只控制它包含的代码(在你的情况下是一个div)。
您可以将控制器添加到HTML标记,也可以使用$ rootScope。
这里有很多答案:How to dynamically change header based on AngularJS partial view?
在处理ng-view的控制器中:
app.controller('MainControl', function ($rootScope, $scope, Config) {
...
$rootScope.canonical = Config.domain;
});
我需要动态设置规范链接,但metas的主体是相同的。在你的标题中:
<link rel="canonical" ng-href="{{ canonical }}" />
您可能希望将ng-bind
用于元标记。
答案 2 :(得分:2)
我想补充以前的答案,prerender将解决爬行问题,但我认为facebook分享有点不同(随意证明我错了:))。为避免烦人{{}}
,您可以定义自己的元指令<meta meta-description>
并使用模板:
app.directive('metaDescription', [ 'metaData', function(metaData){
return {
restrict: 'A',
replace: true,
template: '<meta name="description" content="{{metaData.pageDesc}}">',
link: function(scope,element){
scope.metaData = metaData;
}
};
}]);
我们仍在使用angularJS来解决SEO /分享问题,但这正是我们目前使用的。
答案 3 :(得分:0)
在您的代码中,您应该在fb-share-button的attr'data-href'上设置您的绝对网址。
例如:
<div class='fb-share-button' data-href='https://yourabsoluteurl.com' data-type='button'>
</div>
答案 4 :(得分:0)
我使用快递使它工作。可能会有一些空白,因此,如果有人尝试,请随时填写评论中的空白,我将进行更新...
我在两个不同的控制台中都运行了Express和React。由于某些原因,我只需要在prod中的express文件上运行node。做任何您需要使其运行。这会将请求转发到React服务器。
app.get('*', function(req, res) {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});
然后我有一条通往我共享页面的路线,看起来像这样。
app.get('/details/:itemId', function(req, res) {
const fileName = path.join(__dirname, 'build', `${req.params.itemId}.html`);
var fileContents = fs.readFileSync(path.join(__dirname, 'build', 'index.html'), 'utf8');
fileContents = fileContents.replace("og tags", "new values");
fs.writeFileSync(fileName, fileContents);
res.sendFile(fileName);
});
您可能希望先搜索文件,然后将其首先提供(如果存在),这样,在大容量环境中,多个客户端同时写入同一文件就不会有问题。或者更好的是,在内存中执行此操作。请记住,顺序是在快速文件中计算的,因此您确实需要反转快速文件中这两个函数的顺序。