将SnapEngage与Emberjs一起使用会导致JS错误

时间:2013-10-31 15:48:00

标签: javascript ember.js yahoo

我加上:

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

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

<!-- 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

enter image description here

有没有人经历过这个?关于如何解决这个问题的任何建议?

PS:我尝试删除那条JS系列并且它可以正常工作,这绝对是Ember和我想的YAHOO库之间的冲突。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

注意:我使用的是Ember 1.4.0

答案 1 :(得分:0)

我遇到了同样的问题,我认为这是由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。

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