2013-12-03 1 views
1

Я пытаюсь добавить систему комментариев disqus в свое приложение. я следовал инструкции написано в статье KLICKДобавление disqus в проект meteor.js

Я создал шаблон под названием disqus.html

<template name="disqus"> 
    {{#isolate}} 
    <div id="disqus_thread"></div> 
    <noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript> 
    <a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a> 
    {{/isolate}} 
</template> 

Если этот шаблон оказывается, embed.js необходимо загрузить один раз и Disqus делает сброс.

Template.disqus.rendered = function() { 
    Session.set("loadDisqus", true); 

    return typeof DISQUS !== "undefined" && DISQUS !== null ? DISQUS.reset({ 
    reload: true, 
    config: function() {} 
    }) : void 0; 
}; 

Реагировать на sessionchange в deps.autorun

Meteor.startup (function() { 
    Deps.autorun(function() { 
    if(Session.get("loadDisqus") && !window.DISQUS) { 
     var disqus_shortname = '<example>'; // required: replace example with your forum shortname 

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

    } 
    }); 
}); 

Это отлично работает в Firefox 25.0.1. Я могу войти в систему, выйти из системы и создать комментарии. Но он не работает в Chrome 31.0.1650.57 м. Я не могу войти в систему. Ошибка не возникает. Что я могу сделать? Какие-либо предложения?

Даже для входа в disqus в discovermeteor.com/... не возможно.

ответ

2

Использование сеанса здесь интересно, но не нужно. Вот что я migth сделать в вашем disqus.js файле:

var isDisqusLoaded = false, 
    myScriptLoader = function funcMyScriptLoader(jsEl, callback) { 
    if (window.attachEvent) { 
     // for IE (sometimes it doesn't send loaded event but only complete) 
     jsEl.onreadystatechange = function funcOnReadyStateChange() { 
     if (jsEl.readyState === 'complete') { 
      jsEl.onreadystatechange = ""; 
     } else if (jsEl.readyState === 'loaded') { 
      jsEl.onreadystatechange = ""; 
     } 

     if (typeof callback === 'function') { 
      callback(); 
     } 
     }; 
    } else { 
     // most browsers 
     jsEl.onload = function funcOnLoad() { 
     if (typeof callback === 'function') { 
      callback(); 
     } 
     }; 
    } 
    }; 

Template.disqus.rendered = function funcTplDisqusRendered() { 
    if (!isDisqusLoaded) { 
    var myElJs = document.createElement('script'), 
     s = document.getElementsByTagName('script')[0]; 
    myElJs.type = 'text/javascript'; 
    myElJs.async = true; 
    myElJs.src = '//' + disqus_shortname + '.disqus.com/embed.js'; 

    myScriptLoader(myElJs, function funcEventLoaded() { 
     isDisqusLoaded = true; 
    }); 

    s.parentNode.insertBefore(myElJs, s); 
    } 
}; 

С помощью этого сценария вам не нужно использовать Deps.autorun и Session. Вы должны использовать эту функцию только там, где хотите получить в реальном времени, но если она не нужна, избегайте ее, потому что она ухудшит производительность вашего приложения.

Вы можете добавить Disqus.reset, если это действительно необходимо, но я не уверен, посмотрите документацию disqus.

Я не тестировал сценарий, но все должно быть в порядке.

+0

Приятная идея избежать Deps.autorun. У вас есть какая-либо информация о том, насколько высокая производительность теряется при использовании многопользовательских автозапуска? Может быть, есть статистика. Я дам ему попробовать и протестировать его, но сначала вы могли бы объяснить мне functioncall myScriptLoader? Я не могу это получить. Что такое M6.Events.manager? – chaosbohne

+0

Нет информации об этом, потому что. Но это зависит от оборудования клиента. Это может быть тяжело на смартфоне/планшете, но бесполезно думать об этом на рабочем столе CoreI7. Я удалил Events.manager, потому что здесь бесполезно. myScriptLoader возьмет ваш элемент сценария dom и добавит прослушиватель событий, используя onload/onreadystatechange (в зависимости от браузера), а затем этот прослушиватель выполнит обратный вызов при срабатывании события. – Rebolon

+0

Хорошо, спасибо, я скоро проверю это – chaosbohne

0

Звучит как странная ошибка кэширования, вы пытались сбросить кеш хрома?

+0

Это не проблема с наличными. Я, мой хром, отключил сторонние файлы cookie. Таким образом, diqus не смог создать файл cookie и не смог сохранить логин. Возможно, это следует упомянуть в документах diqus. – chaosbohne

 Смежные вопросы

  • Нет связанных вопросов^_^