【问题标题】:Embed Javascript Widget In Meteor Template在 Meteor 模板中嵌入 Javascript 小部件
【发布时间】:2013-04-12 13:57:15
【问题描述】:

我正在构建我的第一个 Meteor 应用程序,但遇到了嵌入 Javascript 小部件的问题。

所以我的应用是基本的单页登陆页面,我正在尝试使用以下代码嵌入 Twitter 时间线小部件...

<a class="twitter-timeline" href="https://twitter.com/abrudtkuhl" data-widget-id="325157935250546688">Tweets by @abrudtkuhl</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>

脚本标签永远不会被执行,它只会渲染 a 标签。我不太确定这是 Handlebars (Meteor 的默认模板引擎) 问题还是 Meteor 问题,因为我对这两个框架都比较陌生。

【问题讨论】:

    标签: javascript meteor handlebars.js


    【解决方案1】:

    一般来说,当您构建 Meteor 应用程序时,您希望将 Javascript 与模板分开。试试这个:

    我假设 &lt;a class="twitter-timeline"... 位于名为“twitter”的模板中(例如 &lt;template name="twitter"&gt;。将您的 javascript 放入名为 twitter.js 的文件中,并在模板呈现后调用。

    Template.twitter.rendered = function () {
      ! function (d, s, id) {
        var js, fjs = d.getElementsByTagName(s)[0];
        if (!d.getElementById(id)) {
          js = d.createElement(s);
          js.id = id;
          js.src = "//platform.twitter.com/widgets.js";
          fjs.parentNode.insertBefore(js, fjs);
        }
      }(document, "script", "twitter-wjs");
    }
    

    【讨论】:

    • 这确实应该被标记为答案。适用于几乎任何东西,用户语音等。
    • 为什么要使用自执行匿名函数?您已经在一个函数中,无需限定您的变量。
    【解决方案2】:

    虽然@emgee 的回答绝对正确,但在某些情况下这还不够。

    当 JavaScript 只是插入一个新元素时,下次显示模板时,不会重新插入 JS(它已经存在)并且不会再次调用它的初始化。

    大多数社交小部件都是如此,您需要手动强制这些小部件重新解析页面。这不仅仅是 Meteor 问题,对于任何在 AJAX 中加载包含小部件的内容的网站都是如此。

    例如,对于 twitter 小部件,您需要调用 twttr.widgets.load(rootElement)

    例如,在pijs.io的主页上,要重新处理嵌入的推文和“关注”按钮,我有:

    Template.home.rendered = function() {
      setTimeout(function() { 
        twttr.widgets.load(this.firstNode);;
        FB.XFBML.parse(this.firstNode);
      }, 0);
    }
    

    参考:

    【讨论】:

    • 我在 facebook 部分遇到了一些问题......它会导致有关跨域错误的错误消息(facebook 使用 SSL 而我的网站在 http 中)。我暂时把它注释掉了。
    • 感谢您添加此内容!对我来说,让基本的 twitter 时间线在“重新加载”页面上工作是绝对必要的。新手无知,但你能告诉我为什么 widgets.load() 需要包装在 setTimeout 调用中吗?
    • 简短回答:没有它就行不通(至少在我的情况下)。长答案: setTimeout(, 0) 只是延迟对 twitter api 的调用,直到渲染完成,这似乎是需要的。
    • 我必须将它包装在 if (typeof twttr !== "undefined") 中,以使其在第一次加载时工作。
    • 谢谢,这就是它所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 2014-11-22
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    相关资源
    最近更新 更多