6

ここ私の会社では、素晴らしい Disqus ウィジェットを使用して、素晴らしいコメント エクスペリエンスを提供するために懸命に取り組んでいます。

私たちのサイトは完全に AJAX ベースであり、ほとんどの場合、requirejs、jquery、backbone を使用しています。

Disqus ウィジェットは、必要なページに既に追加されています。もちろん、ページの変更中に Disqus ウィジェットが存在する div を破棄し、すべてのものを再度インスタンス化します。

すべてのブラウザーで、古いウィジェットを使用しても問題ありません。Disqus 2012 のウィジェットをアクティブ化すると、「Uncaught TypeError: Cannot call method 'postMessage' of null」というエラーが表示されず、Safari および Chrome で問題が発生します。Firefoxはうまく機能します。

関連するコードは次のとおりです。

define([
  'underscore',
  'backbone',
  'models/config',
  'models/book'
], function(_, Backbone, config) {

    App.Models.Disqus = Backbone.Model.extend({
        bookObj: null,

        initialize: function(options){
            console.log("discus.initialize()");
            var _this=this;

            _this.bookObj= new App.Models.Book({id: options.id});
            _this.bookObj.fetch({
                dataType: 'jsonp',
                success: function(model,response){
                    (typeof DISQUS == 'undefined')?_this.initDisqus():_this.resetDisqus();              }
            });

        },

        initDisqus: function(){
            console.log("discus.init()");
            disqus_shortname=config.get('DISQUS_ID');
            disqus_title = this.bookObj.get('content').title; 
            disqus_config = function (){
                // this.page.identifier = _this.id;
                // this.page.url = document.URL;
                this.language = config.get('LANG');
            };
            require(['http://'+disqus_shortname+'.disqus.com/embed.js'], function(){});
        },

        resetDisqus: function(){
            console.log("discus.reset()");
            var _this=this;
            DISQUS.reset({
                reload: true,
                config: function(){
                    this.page.identifier = _this.id;
                    this.page.url = document.URL;
                    this.page.title = _this.bookObj.get('content').title;
                    this.language = config.get('LANG');
                }
            });
        }

    });

    return App.Models.Disqus;
});

さらに詳しい情報が必要な場合は、お気軽にお問い合わせください。

前もって感謝します、ジョルジオ

OKみんな、このように解決しました:

define([
  'underscore',
  'backbone',
  'models/config',
  'models/book'
], function(_, Backbone, config) {

    App.Models.Disqus = Backbone.Model.extend({
        bookObj: null,

        initialize: function(options){
            console.log("discus.initialize()");
            var _this=this;
            _this.bookObj= new App.Models.Book({id: options.id});
            _this.bookObj.fetch({
                dataType: 'jsonp',
                success: function(model,response){
                    //(typeof DISQUS == 'undefined')?_this.initDisqus():_this.resetDisqus();

                    delete DISQUS;

                    disqus_shortname = config.get('DISQUS_ID');
                    disqus_identifier = _this.id;
                    disqus_url = document.URL;         
                    disqus_title = _this.bookObj.get('content').title;

                    (function() {
                        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
                        dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
                    })();

                }
            });
        },
    });

    return App.Models.Disqus;
});
4

2 に答える 2

1

DISQUS.reset ドキュメントに記載されているように、Disqus スレッドの識別子と URL をリセットする必要があります。これは、ドキュメントで提供されている 2 つの変数を介して行われます:this.page.identifierthis.page.url. 現在、Disqus のページ タイトルと言語をリセットしています。代わりに、識別子と URL をリセットしてみてください。

于 2012-10-19T22:35:14.010 に答える
0

私もこの問題を抱えていましたが、上記の解決策 (DISQUS を削除し、ページ上のスクリプトを再ロードする) は厳密モードでは機能しません。DISQUS を削除しようとすると、「厳密モードでの修飾されていない識別子の削除」というエラーが発生します。

Disqus が接続されているコンテナーを決して削除しないようにすることで問題を解決しました。これは、投稿を ajax 経由で新しく読み込まれた投稿と交換するときに行っていました。この修正なしで Firefox で動作したのは奇妙ですが、現在はどこでも動作します。

于 2013-02-06T09:17:59.220 に答える