DISQUS和Pushstate AJAX或Hashbang

时间:2012-12-07 22:41:55

标签: javascript disqus pjax singlepage

是否有人因为像PJAX或甚至常规#! AJAX这样的东西而得到了正常的工作。

让我们看一下这样做的人的一些例子:

  1. http://donejs.com/
  2. http://www.playmodules.net/demo/1
  3. 第一个使用Hash bang风格,第二个使用PJAX。现在点击这些网站,你会注意到你的gravatar图标消失了,如果你打开javascript控制台,你通常会收到错误和日志消息,因为DISQUS对象无法解除绑定。

    我已经尝试过我自己的随机黑客攻击(这很难,因为我找不到通过缩小而不会混淆的DISQUS js):

    (function() {
        if ( document.getElementById('my_disqus_script') && document.getElementById('disqus_thread') ) {
            //var ds = document.getElementById('my_disqus_script');
            //(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).removeChild(ds);
            alert(window.location.href);
            DISQUS.reset({
                reload: true,
                config: function() {
                    this.page.identifier = 'disqus_thread';
                    this.page.url = window.location.href + '#!disqus_thread';
                }
            });
        }
        else if (document.getElementById('disqus_thread')){
            var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
            dsq.id = 'my_disqus_script';
            dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
            (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
        }
        else {
            var ds = document.getElementById('my_disqus_script');
            if (ds)
                (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).removeChild(ds);
            if (window['DISQUS']) {
                alert('cleanup');
                DISQUS.reset();
                DISQUS.cleanup();
                DISQUS = null;
            }
        }
    })();
    

    基本上我尝试了一堆清理技术,这样当我的PJAX加载新页面时,它应该清理,但我总是得到一些绑定到null的事件抛出异常。

1 个答案:

答案 0 :(得分:1)

@JanHančič是正确的,因为iframe是最好的路线(所以如果他回答我会标记他是正确的)。 iframe的高度和无缝可以通过以下方式处理:https://github.com/house9/jquery-iframe-auto-height

我所做的是制作一个控制器(或任何你的框架所称的控制器)来处理任何网址,例如:http://my.com/page/disqus,它会为http://my.com/page加载评论。

控制器只加载DISQUS小部件(包含在html/body中)。然后在http://my.com/page模板中,将iframe包含到http://my.com/page/disqus