一页上有几个disqus-threads

时间:2011-02-10 22:32:35

标签: javascript global-variables disqus

我们有一个网站,我们列出了很多活动,并希望为每个活动添加讨论。

所以我们想使用disqus,并检查出来。原来他们使用全局变量来配置实例。

等;

var disqus_shortname = '';

var disqus_identifier = '';

var disqus_url = '';

当我们不想使用相同的标识符,而是每个disqus实例使用一个唯一的标识符时,这给我们带来了问题。尝试将每个实例化+配置放在iframe中,但这真的搞砸了ie8。有更好的方法吗?

所以,总结一下;一页上的几个disqus实例。怎么样? 还有其他人做过吗?

由于

8 个答案:

答案 0 :(得分:20)

我们遇到了类似的问题并通过电子邮件向Disqus发送了关于此事他们证实,默认情况下,他们每页仅支持一个Disqus模块。

在浏览Disqus JS文档时,我找到了一个解决方案,当用户与网站交互时,可以通过加载和卸载Disqus模块来解决这个问题:

DISQUS.reset({
  reload: true,
  config: function () {  
    this.page.identifier = "newidentifier";  
    this.page.url = "http://example.com/#!newthread";
  }
});

http://docs.disqus.com/help/85/

确切的实施将取决于您的网站,但这应该为您提供一个构建块。例如,如果通过扩展内容区域可以获得事件信息,则只要有人展开事件内容,您就可以加载Disqus模块。

答案 1 :(得分:17)

我写了一篇关于此的文章,在这里找到它。 http://mystrd.at/articles/multiple-disqus-threads-on-one-page/

从本质上讲,如果您一次只显示一个模块并使用某种“显示注释”控件,那么您可以通过以下方式执行此操作(使用Wordpress和jQuery作为示例,但您可以根据您的需要调整内容标识符)。在post循环中,为每个插入一个额外的控件:

<a onclick="loadDisqus(jQuery(this), '<?= $id ?> <?= $post->guid ?>', '<? the_permalink() ?>');">
   Show comments
</a>

之后你需要一个通用函数,它将使用这些post参数并根据需要重新加载Disqus。请注意2012版本的Disqus还没有reset()方法,因此无法使用它。

// global vars used by disqus
var disqus_shortname = 'yoursiteshortnameindisqus';
var disqus_identifier; // made of post id &nbsp; guid
var disqus_url; // post permalink

function loadDisqus(source, identifier, url) {
    if (window.DISQUS) {
        jQuery('#disqus_thread').appendTo(source.parent()); // append the HTML to the control parent

        // if Disqus exists, call it's reset method with new parameters
        DISQUS.reset({
            reload: true,
            config: function() {
                this.page.identifier = identifier;
                this.page.url = url;
            }
        });
    } else {
        //insert a wrapper in HTML after the relevant "show comments" link
        jQuery('<div id="disqus_thread"></div>').insertAfter(source);
        disqus_identifier = identifier; // set the identifier argument
        disqus_url = url; // set the permalink argument

        // append the Disqus embed script to HTML
        var dsq = document.createElement('script');
        dsq.type = 'text/javascript';
        dsq.async = true;
        dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
        jQuery('head').appendChild(dsq);
    }
};

除此之外,我相信你不得不求助于使用iframe。以Ruby为例的这种解决方案在此处列出 - http://blog.devinterface.com/2012/01/how-to-insert-more-disqus-box-in-single-page/

答案 2 :(得分:3)

据称截至2012年7月17日,Disqus 2012现在再次支持“重置”。

答案 3 :(得分:1)

我需要在GWT应用程序中使用Disqus,因此我需要解决在应用程序中的虚拟页面发生更改时按需加载线程的问题。

少量的逆向工程和实验使我构建了一个实用工具类(如下)。

主要见解是:

  1. 有一个名为disqus_container_id的未记录的全局参数 它允许您将评论放在任何地方。如果这在某些方面不起作用 未来版本,我的后备将是暂时设置目标的ID 将元素添加到disqus_thread,添加注释,然后将其更改回原始ID。
  2. 由于这是使用JSNI为GWT开发的,我需要设置全局 原始窗口上下文中的参数,可通过$wnd访问。我变了 相应的默认Disqus嵌入代码。我之前没有意识到全球化 变量在Window对象中,但我学到了一些新东西。
  3. 您可以重复使用同一个容器,Disqus似乎在您清除内容时 激活它。
  4. 这会在DOM中留下大量脚本标记的副本。也许这会很好 一旦使用它们,也要清理它们。或者,我可能会做一些 使用其他答案中描述的DISQUS.reset方法进行更多实验。
  5. 仅为使用JS的人提取关键信息,这应该允许你在任何你喜欢的地方粘贴一个Disqus线程:

    function loadComments(container_id, shortname, identifier, developer) {
        // CONFIGURATION VARIABLES
        window.disqus_container_id = container_id;
        window.disqus_developer = developer ? 1 : 0;
        window.disqus_shortname = shortname; // required
        if (identifier) window.disqus_identifier = identifier;
    
        // DON'T EDIT BELOW THIS LINE
        (function() {
           var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
           dsq.src = 'http://' + shortname + '.disqus.com/embed.js';
           (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
        })();
    }
    

    这是完整的GWT实用程序类。到目前为止,我只实现了我需要的参数。

    import com.google.gwt.user.client.Element;
    import com.google.gwt.user.client.Random;
    import com.google.gwt.user.client.ui.Widget;
    
    public class Disqus {
    
        public static boolean developer = false;
        public static String shortname;
    
        public static void showComments(Widget where, String identifier) {
            showComments(where.getElement(), identifier);
        }
    
        public static void showComments(Element where, String identifier) {
            if (shortname == null)
                throw new IllegalArgumentException(
                          "You must specify the disqus shortname before displaying comments");
    
            // Store the original id of the target element
            String id = where.getId();
            if (id == null) {
                id = "disqus-" + Integer.toHexString(Random.nextInt());
                where.setId(id);
            }
    
            // Update the id temporarily
            where.setId("disqus_thread");
    
            // Load the comments
            loadComments(id, shortname, identifier, developer);
        }
    
        private static native void loadComments(String container_id, String shortname, String identifier, boolean developer) /*-{
            // CONFIGURATION VARIABLES
            $wnd.disqus_container_id = container_id;
            $wnd.disqus_developer = developer ? 1 : 0;
            $wnd.disqus_shortname = shortname; // required
            if (identifier) $wnd.disqus_identifier = identifier;
    
            // TODO
            // disqus_url
    
            // disqus_title
    
            // disqus_category_id
    
            // DON'T EDIT BELOW THIS LINE (sorry, I've edited it anyway)
            (function() {
                var dsq = $doc.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
                dsq.src = 'http://' + shortname + '.disqus.com/embed.js';
                ($doc.getElementsByTagName('head')[0] || $doc.getElementsByTagName('body')[0]).appendChild(dsq);
            })();
        }-*/;
    }
    

答案 4 :(得分:1)

Tente isso:

<div class="showDisqus" data-title="MyTitle" data-id="1" data-url="mysite.com/mypost">Show Comments</div>

$('.showDisqus').on('click', function(){   // click event of the show comments button
    var this_ = $(this);
        disqus_shortname = 'your_shortname',
        title = $(this).attr('data-title'),
        identifier = parseFloat($(this).attr('data-id')),
        url = $(this).attr('data-url');

    if (window.DISQUS) {

        DISQUS.reset({ // Remove the old call
          reload: false,
          config: function () {
          this.page.identifier = window.old_identifier;
          this.page.url = window.old_url;
          this.page.title = window.old_title;
          }
        });
        $('.showDisqus').show();
        $('#disqus_thread').remove();

        $('<div id="disqus_thread"></div>').insertAfter(this_);

        setTimeout( function() { // Creates a new call DISQUS, with the new ID
            DISQUS.reset({
              reload: true,
              config: function () {
              this.page.identifier = identifier;
              this.page.url = url;
              this.page.title = title;
              }
            });
            window.old_identifier = identifier;
            window.old_url = url;
            window.old_title = title;
        });

    } else {

        var disqus_identifier = parseFloat(identifier),
            disqus_title = title,
            disqus_url = url;

        $('<div id="disqus_thread"></div>').insertAfter(this_);

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

        setTimeout( function() { // Sorry, there must be a better way to force the ID called correctly
            DISQUS.reset({
              reload: true,
              config: function () {
              this.page.identifier = identifier;
              this.page.url = url;
              this.page.title = title;
              }
            });
        },500);

        window.old_identifier = identifier;
        window.old_url = url;
        window.old_title = title;

    }
    $(this).fadeOut();  // remove the show comments button
});

答案 5 :(得分:1)

我重复了上面的解决方案,没有一个开箱即用。检查来源,我拼凑了这个,这是有效的。它并不遥远,但看起来却有所不同。

<script type="text/javascript">
var disqus_shortname  = 'superchocolate',
    disqus_identifier = 'default',
    disqus_title      = 'I Heart Chocoloate',
    disqus_config     = function(){
        this.language = 'en';
    };


(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);
})();



function loadDisqus( identifier, url, title )
{
    DISQUS.reset({
        reload: true,
        config: function ()
        {
            this.page.identifier = identifier;
            this.page.url        = url;
            this.page.title      = title;
            this.language        = 'en';
        }
    });
}
</script>

在你的标记中,加上标准:

<div id="disqus_thread"></div>

然后在点击操作中,它非常简单。我有一个叫做数据&#39;的成员。我从AJAX电话回来了。

loadDisqus( 'ugc-' + data.id,  location.protocol+'//'+location.hostname + "/ugc-submission-" + data.id + "/", data.title );

这对我有用,解决了上面代码中有几个线程之间传递类似注释的问题。

我在Bootstrap模式中显示我的Disqus线程,我在调用$(el).moda(&#39; show&#39;)之前调用loadDisqus并且它是无缝的。

答案 6 :(得分:0)

我知道这个问题已经很老了但是我遇到了同样的问题,我找到了一个对我有用的工作。

我目前有一个页面 - 我们称之为专辑 - 列出属于该专辑的一系列图像。

单击图像将弹出一个包含当前图像的灯箱和一个特殊的侧边栏,通过ajax当前图像信息(如标题,日期,作者,评论等)获取..(非常类似于Facebook图像查看器/侧栏评论)

我希望用户能够对主要相册页面进行评论,也希望用户可以在灯箱边栏内查看特定图片。

由于一些属于灯箱的回调函数,每当打开灯箱时就会运行一个回调函数,我已经习惯将主相册页面中的div'disqus_thread'临时重命名为其他内容。

每当你更改灯箱内的图像时,都会运行另一个回调 - 这允许我重新加载有关图像的侧边栏信息,其中包含一个新的disqus_thread div和一个强制执行disqus_reset的javascript。

另一个回调在灯箱关闭时运行,这允许我将专辑评论div重命名为disqus_thread并强制重新设置。

总而言之,主页面包含相册的评论,当您点击图像时,我将原始div重命名为其他内容。然后通过AJAX获取一些信息,其中包含一个新的disqus_thread div。我使用DISQUS.reset并在灯箱上加载注释。当我关闭灯箱时,我将原始div重命名为disqus_thread并强制重新启动。

我希望它有所帮助!

答案 7 :(得分:-3)

您可以通过iframe加载每个实例。你可能不得不有页面滚动条...但是很糟糕。