2013-10-31 53 views
1

只要我補充一下:使用SnapEngage與Emberjs導致JS錯誤

<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庫之間的衝突,我猜。

謝謝!

回答

0

我有這個相同的問題,我認爲這是由YAHOO.register函數的_super()兩次循環通過233行引起的。第一次做的時候,變量k.versions和k.build被定義,但是第二次沒有(可能是因爲超級沒有傳入任何參數就重新運行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; 

所有這些都是檢查變量是否被定義爲a如果是,推送給他們。如果沒有,什麼都不要做。

我把編輯snapengage.js源文件中的應用程序/資產/ Java腳本/供應商/然後添加下面一行到我的application.js文件:

//= stub ./vendor/snapengage.js 

這將阻止加載您的應用程序的餘燼應用程序加載時的SnapEngage源。

最後,我寫了一個聊天混入和加載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。

1

我用SnapEngage打開了一張票,他們最近推出了一個修復程序。如果您在2014年3月6日之前擁有SnapEngage帳戶,則需要在帳戶的「樣式」部分中單擊「保存」,以便將JS更新到最新版本。在此之後,錯誤應該消失 - 爲我工作!

注意:我正在使用Ember 1.4。0