Несколько disqus-потоков на одной странице
У нас есть веб-сайт, на котором мы перечисляем множество событий, и хотели бы добавить обсуждения к каждому из событий.
Итак, мы хотели использовать disqus и проверили его. Оказывается, для настройки экземпляра они используют глобальные переменные.
как
var disqus_shortname = '';
var disqus_identifier = '';
var disqus_url = '';
Это создает проблему для нас, когда мы не хотим использовать один и тот же идентификатор, а скорее уникальный для экземпляра disqus. попробовал помещать каждую инстанцирование + конфигурацию в iframe, но это действительно испортило ie8. есть ли лучший способ сделать это?
Итак, подведем итог; несколько экземпляров disqus на одной странице. как?
кто-то еще это сделал?
Спасибо
Ответы
Ответ 1
Мы столкнулись с подобной проблемой и отправили по электронной почте 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 всякий раз, когда кто-то расширяет содержимое события.
Ответ 2
Я написал статью об этом, найди ее здесь. http://mystrd.at/articles/multiple-disqus-threads-on-one-page/
В сущности, если вам хорошо отображать один модуль за раз и использовать какой-то элемент управления "show comments", вы можете сделать это следующим образом (используя Wordpress и jQuery в качестве примера, но вы можете настройте идентификаторы содержимого на основе ваших потребностей). В почтовом цикле добавьте дополнительный элемент управления для каждого:
<a onclick="loadDisqus(jQuery(this), '<?= $id ?> <?= $post->guid ?>', '<? the_permalink() ?>');">
Show comments
</a>
Затем вам понадобится общая функция, которая будет использовать эти параметры сообщения и перезагружать Disqus по требованию. Имейте в виду, что версия Disqus в 2012 году еще не имеет метода reset(), и поэтому это не сработает с ней.
// global vars used by disqus
var disqus_shortname = 'yoursiteshortnameindisqus';
var disqus_identifier; // made of post id 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 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);
}
};
Кроме этого, я считаю, вам придется прибегать к использованию iframes. Такое решение с Ruby в качестве примера описано здесь - http://blog.devinterface.com/2012/01/how-to-insert-more-disqus-box-in-single-page/
Ответ 3
Предположительно с 17 июля 2012 года Disqus 2012 теперь снова поддерживает "reset".
Ответ 4
Мне нужно было использовать Disqus из приложения GWT, поэтому мне нужно было решить проблему загрузки потоков по требованию при изменении виртуальных страниц в приложении.
Небольшое количество обратной инженерии и экспериментов привело меня к созданию служебного класса (ниже).
Основные идеи:
- Существует недокументированный глобальный параметр
disqus_container_id
который позволяет размещать комментарии везде, где вам нравится. Если это не работает в некоторых
будущей версии, мой отказ будет заключаться в том, чтобы временно установить идентификатор цели
элемент disqus_thread
, добавьте комментарии, а затем верните исходный идентификатор.
- Поскольку это было разработано для GWT с использованием JSNI, мне нужно было установить глобальный
параметры в исходном контексте окна, доступные через
$wnd
. Я изменился
по умолчанию соответствующий код встраивания Disqus. Я не осознавал, что все глобальные
переменные находятся в объекте Window, но я узнал что-то новое.
- Вы можете повторно использовать тот же контейнер, Disqus, похоже, очищает содержимое, когда вы
активируйте его.
- Это оставляет много копий тега script в DOM. Может быть, это будет хорошо
чтобы очистить их тоже, как только они были использованы. В качестве альтернативы, я могу сделать некоторые
больше экспериментов с использованием метода
DISQUS.reset
, описанного в других ответах.
Извлекая только важную информацию для кого-то, кто использует 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);
})();
}-*/;
}
Ответ 5
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
});
Ответ 6
Я повторил эти решения выше, и ни один из них не вышел из строя. Проверяя через источник, я вымотал это, что работает. Он не за горами, но делает все возможное.
<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>
И тогда в ваших действиях клика это довольно просто. У меня был член под названием "данные", который я получал от вызова AJAX.
loadDisqus( 'ugc-' + data.id, location.protocol+'//'+location.hostname + "/ugc-submission-" + data.id + "/", data.title );
Это сработало для меня, решив проблему в вышеприведенном коде, в которой аналогичные комментарии передавались между несколькими потоками.
Я показываю поток Disqus в модальном модуле Bootstrap, я вызываю loadDisqus перед вызовом $(el).moda('show'), и он бесшовна.
Ответ 7
Я знаю, что этот вопрос очень старый, но поскольку я столкнулся с той же проблемой, я нашел работу, которая работала очень хорошо для меня.
В настоящее время у меня есть страница - назовем ее альбомом - в которой перечислены серии изображений, принадлежащих этому альбому.
Нажав на изображение, вы увидите ярлык с текущим изображением и специальную боковую панель, которая извлекает через текущую информацию о текущем изображении ajax, такую как название, дата, автор, комментарии и т.д. (очень похож на facebook image viewer/sidebar comments)
Я хотел, чтобы пользователи могли комментировать основную страницу альбома, а также на конкретном изображении, которое они просматривают на боковой панели лайтбоксов.
Благодаря некоторым функциям обратного вызова, которые принадлежат к лайтбокс, каждый из них запускался всякий раз, когда открывался лайтбокс, который я использовал для временного переименования div 'disqus_thread' на главной странице альбома, чтобы что-то еще.
Другой обратный вызов выполнялся всякий раз, когда вы меняли изображения внутри лайтбокса, что позволило мне перезагрузить информацию о боковой панели, касающуюся изображения, где я включил новый divqus_thread div и javascript, заставляющий disqus_reset.
И другой обратный вызов запускается, когда лайтбокс закрывается, что позволяет мне переименовать комментарий альбома div обратно в disqus_thread и навязать еще один reset.
Итак, чтобы подвести итог, главная страница содержит комментарии к альбому, когда вы нажимаете на изображение, я переименовываю оригинальный div в другое. Затем с помощью AJAX извлекается некоторая информация, которая содержит новый divqus_thread. Я использую DISQUS.reset и комментарии загружаются в лайтбокс. Когда я закрываю лайтбокс, я переименую исходный div обратно в disqus_thread и нажимаю еще один reset.
Я надеюсь, что это поможет кому-то!
Ответ 8
Вы можете загружать каждый экземпляр через iframe. Возможно, вам придется иметь полоски прокрутки на странице, хотя... yuck.