【问题标题】:Using SnapEngage with Emberjs cause a JS error将 SnapEngage 与 Emberjs 一起使用会导致 JS 错误
【发布时间】:2013-11-11 17:24:57
【问题描述】:

我一加:

<script src="/bower_components/ember/ember.min.js"></script>

在我们的snaengage聊天代码所在的同一页面上:

<!-- begin SnapEngage code -->
<script type="text/javascript">
    (function() {
        var se = document.createElement('script'); se.type = 'text/javascript'; se.async = true;
        se.src = '//commondatastorage.googleapis.com/code.snapengage.com/js/4f645e9b-afb9-4226-9ebc-f8fc52d28cef.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(se, s);
    })();
</script>
<!-- end SnapEngage code -->

它会引发错误:

Uncaught TypeError: Cannot call method 'push' of undefined 4f645e9b-afb9-4226-9ebc-f8fc52d28cef.js:223
YAHOO.register 4f645e9b-afb9-4226-9ebc-f8fc52d28cef.js:223
(anonymous function) 4f645e9b-afb9-4226-9ebc-f8fc52d28cef.js:242

有人经历过吗?有关如何解决此问题的任何建议?

PS:我尝试删除该 JS 行并且它有效,我猜这肯定是 Ember 和一些 YAHOO 库之间的冲突。

谢谢!

【问题讨论】:

    标签: javascript ember.js yahoo


    【解决方案1】:

    我在 SnapEngage 上开了一张票,他们最近推出了一个修复程序。如果您在 2014 年 3 月 6 日之前拥有 SnapEngage 帐户,那么您需要在帐户的“样式”部分中单击“保存”,以便将 JS 更新到最新版本。在此之后,错误应该消失 - 对我有用!

    注意:我使用的是 Ember 1.4.0

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我认为这是由 YAHOO.register 函数上的 _super() 循环通过第 233 行两次引起的。第一次它定义了变量 k.versions 和 k.builds ,但第二次没有定义(可能是因为超级重新运行了 YAHOO.register 函数而没有传入任何参数。不管究竟是什么原因造成的,我能够通过对 snapengage.js 源进行以下编辑来解决这个问题(尽管是以一种非常老套的方式):

      1) 233行更改:

      k.versions.push(p);k.builds.push(q);
      

      到:

      k.versions ? k.versions.push(p):false;k.builds ? k.builds.push(q):false;
      

      所有这一切都是检查变量是否已定义,如果已定义,则推送给它们。如果没有,什么也不做。

      我将编辑后的 ​​snapengage.js 源文件放在 app/assets/javascripts/vendor/ 中,然后将以下行添加到我的 application.js 文件中:

      //= stub ./vendor/snapengage.js
      

      这将阻止您的 ember 应用程序在应用加载时加载 SnapEngage 源。

      最后,我写了一个聊天 mixin 并加载 snapengage.js 脚本如下:

      App.Chat = Em.Mixin.create({
        agentOnline: false,
      
        didInsertElement: function() {
          this._getChatApi();
        },
      
        _getChatApi: function() {
          var url = 'assets/home/vendor/snapengage.js',
              _this = this;
      
          $.getScript(url).done(function() {
      
              // Your custom SnapEngage Javascript API code here. For example...
              SnapEngage.getAgentStatusAsync(function(online) {
                  _this.set('agentOnline', online);
              });
      
          });
        },
      
      });
      
      App.IndexView = Em.View.extend(Home.Chat, {
          // The rest of your view code here
      });
      

      snapengage.js 脚本不会自动加载两次,但如果您在多个页面上使用 mixin,您可能需要确保没有两次加载聊天资源(图像、加载微调器等),因为每次您单击网页上呈现的“帮助”按钮时,插件似乎都会调用 snapengage.com。

      正如我所提到的,这是一个非常老套的解决方案,我不建议编辑插件的源代码,但这会给你一个修复,以便在 Ember.js 应用程序中轻松使用 Snapengage。

      【讨论】:

        猜你喜欢
        • 2011-06-30
        • 2014-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 2013-06-22
        相关资源
        最近更新 更多