Javascript 执行动态添加的社交网络小部件
我目前正在Liferay 6.2中开发一个portlet。在Portlet配置中,我存储社交网络名称及其脚本(由不同的社交网络提供的脚本,如Facebook、Twitter等) 对于公共portlet,我有不同的选项卡,每个存储的社交网络对应一个选项卡(因此它们的数量是可变的)。当我最初加载portlet时,我在显示Facebook页面插件方面没有问题,但是当我开始更改选项卡时,出现了一个问题。我带来了社交网络脚本(html+脚本标签) 我知道,如果插入这些代码,脚本标记将不会被执行,因此我不会在portlet上加载插件,只有html。如果我对脚本进行eval(),则Facebook脚本根本不起作用,并且不会显示任何错误。如果我用自己的代码更改Facebooks脚本标记,然后eval()它,它会工作,但如果我继续使用Facebooks代码,什么也不会发生Javascript 执行动态添加的社交网络小部件,javascript,html,facebook,liferay,facebook-javascript-sdk,Javascript,Html,Facebook,Liferay,Facebook Javascript Sdk,我目前正在Liferay 6.2中开发一个portlet。在Portlet配置中,我存储社交网络名称及其脚本(由不同的社交网络提供的脚本,如Facebook、Twitter等) 对于公共portlet,我有不同的选项卡,每个存储的社交网络对应一个选项卡(因此它们的数量是可变的)。当我最初加载portlet时,我在显示Facebook页面插件方面没有问题,但是当我开始更改选项卡时,出现了一个问题。我带来了社交网络脚本(html+脚本标签) 我知道,如果插入这些代码,脚本标记将不会被执行,因此我不会
A.io.request(portletURL.toString(),{
on: {
success: function() {
var data = this.get('responseData');
var cont = document.getElementById('contenedor-script');
document.getElementById('contenedor-script').innerHTML = data;
var arr = document.getElementById('contenedor-script').getElementsByTagName('script')
for (var n = 0; n < arr.length; n++){
console.log(arr[n].innerHTML);
eval(arr[n].innerHTML) //this executes the script tag
}
}
}
});
A.io.request(portletURL.toString(){
关于:{
成功:函数(){
var data=this.get('responseData');
var cont=document.getElementById('contendor-script');
document.getElementById('contendor-script')。innerHTML=data;
var arr=document.getElementById('contendor-script').getElementsByTagName('script'))
对于(变量n=0;n
现在插入的脚本出现了:
<div id="fb-root"></div>
<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/es_ES/sdk.js#xfbml=1&version=v2.7";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
<div class="fb-page" data-href="https://www.facebook.com/facebook" data-tabs="timeline" data-small-header="false" data-adapt-container-width="true" data-hide-cover="false" data-show-facepile="true"><blockquote cite="https://www.facebook.com/www.oviedo.es/" class="fb-xfbml-parse-ignore"><a href="https://www.facebook.com/www.oviedo.es/">Facebook</a></blockquote></div>
(功能(d、s、id){
var js,fjs=d.getElementsByTagName[0];
if(d.getElementById(id))返回;
js=d.createElement;js.id=id;
js.src=“//connect.facebook.net/es#es/sdk.js#xfml=1&version=v2.7”;
fjs.parentNode.insertBefore(js,fjs);
}(文档“脚本”、“facebook jssdk”);
当不计算函数时,将显示html标记
我的另一种选择是加载所有的标签,并开始显示和隐藏它们与CSS,但这是一个更糟糕的想法
谢谢。您需要使用
FB.XFBML.parse()
再次解析插件:
在浏览器中呈现元素后立即调用该函数,JavaScript SDK将解析/显示这些元素
顺便说一句,当然,您应该只加载JSSDK一次。永远不要使用“eval”…
eval
只是一个问题,如果我开始添加其他社交网络,它会起作用吗?我是说,不仅仅是Facebook。因为我试过使用Facebook,它运行得很好,但在添加了Twitter脚本后,它似乎无法使用Twitter。我所寻找的是一种适用于所有社交网络的通用方法,我发现的只是特定的解决方案。FB.XFBML.parse当然只适用于facebook插件。这是JavaScript SDK中的一种方法。其他平台可能有不同的解决方案。没有通用的方法。