Комментарии Disqus не работают в пользовательском полимерном элементе

Я не знаю, как заставить код комментариев disqus работать внутри моих пользовательских элементов.

Структура моего сайта:

| index.html
--------\ my-app.html (пользовательский элемент)
----------------\ my-testView1.html (пользовательский элемент)
---- ------------\ my-testView2.html (пользовательский элемент)

Мне нужно поместить комментарии disqus внутри my-testView1.html и my-testView2.html

Структура index.html:

 <body>
   <my-app>
      <div class="disqusClass1" id="disqus_thread"></div>
      <div class="disqusClass2" id="disqus_thread"></div>
   <my-app>
</body>

Структура my-app.html:

 <iron-pages>
      <my-testView1 name="testView"><content select=".disqusClass1"></content></my-testView1>
      <my-testView2 name="testView2"><content select=".disqusClass2"></content></div></my-testView2>
    </iron-page‌​s>

Структура my-testView1.html:

<template>
  <content select=".disqusClass1"></content>
</template>

Структура my-testView2.html:

<template>
  <content select=".disqusClass2"></content>
</template>

Дискус див

Я поместил div комментариев disqus внутрь <my-app> на index.html, чтобы хром мог его найти. Он не сможет найти его, если я вставлю его внутрь <my-testView1> вот так:

страница my-app.html

<iron-pages>
  <my-testView1 name="testView"><div id="disqus_thread"></div></my-testView1>
  <my-testView2 name="testView2"><div id="disqus_thread"></div></my-testView2>
</iron-page‌​s>

потому что my-app.html сам по себе является настраиваемым элементом, и он не позволит хрому его найти. Поэтому мне пришлось поместить его за пределы теневого дома (страница index.html)

Код Javascript на страницах my-testView1.html и my-testView2.html выглядит так:

<dom-module id="my-testView1">
  <template>
   ...
        <content></content>
   ...
 </template>

  <script>
    Polymer({
      is: 'my-testView1',

      ready: function () 
          {    
             // DEFAULT DISQUS CODE (I changed real URLs though):        
             var disqus_config = function () {
             this.page.url = 'https://www.example.com/testView1'; // Replace PAGE_URL with your page's canonical URL variable
             this.page.identifier = '/testView1'; 
             // this.page.title = 'Test View';
             };

            (function() { 
            var d = document, s = d.createElement('script');
            s.src = '//myChannelName.disqus.com/embed.js';
            s.setAttribute('data-timestamp', +new Date());
            (d.head || d.body).appendChild(s);
            })();
        }
     });
  </script>
</dom-module>

Результат

Комментарии появляются только на одном из этих my-testView1.html my-testView2.html одновременно. Мне нужна 1 ветка disqus на my-testView1.html и еще одна ветка disqus на my-testView2.html

Возможно, это из-за маршрутизации. В сообщении консоли Disqus говорится, что мне нужно использовать метод ajax https://help.disqus.com/customer/portal/articles/472107-using-disqus-on-ajax-sites К сожалению, я не смог заставить его работать, когда заменил приведенный выше код javascript кодом из пример:

  <script>
    Polymer({
      is: 'my-testView1',

      ready: function () 
          {    
                 var disqus_shortname = 'myDisqusChannelId';
                 var disqus_identifier = '/testView1';
                 var disqus_url = 'http://example.com/testView1';
                 var 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);
                 })();

                 var reset = function (newIdentifier, newUrl) {
                     DISQUS.reset({
                         reload: true,
                         config: function () {
                             this.page.identifier = newIdentifier;
                             this.page.url = newUrl;
                         }
                     });
                 };
        }
     });
  </script>
</dom-module>

внутри обоих пользовательских элементов (изменив disqus_identifier и disqus_url соответственно для каждого из них)


person Un1    schedule 28.09.2016    source источник
comment
Вам, вероятно, не нужно помещать скрипт Disqus в основной документ. Посмотрите, как я поместил его в шаблон элемента и привязал свойство channelName: jsbin.com/feqaqig/ редактировать?html,js,вывод   -  person Tomasz Pluskiewicz    schedule 29.09.2016
comment
Теперь, если подумать, размещение Disqus внутри элемента Polymer, вероятно, не очень хорошая идея. Это не будет работать в Shadow DOM, и я не вижу особой выгоды.   -  person Tomasz Pluskiewicz    schedule 29.09.2016
comment
@Supersharp Я поставил ОБНОВЛЕНИЕ #1 в вопросе, если у вас есть свободная минутка, не могли бы вы его проверить?   -  person Un1    schedule 29.09.2016
comment
@TomaszPluskiewicz Хорошо, у меня есть страницы моего сайта в качестве настраиваемых элементов, и я хотел поместить script disqus на некоторые из этих страниц (настраиваемые элементы). Но, как вы сказали, это не будет работать в теневом доме, и я новичок, поэтому я еще не знаю, как это реализовать. К сожалению, в документации по полимерам нет полезной (для новичков) информации о скриптах внутри пользовательских полимерных элементов.   -  person Un1    schedule 29.09.2016
comment
добавьте div дважды и дайте им другой идентификатор выбора   -  person Supersharp    schedule 29.09.2016
comment
Как в разделе Результат вопроса? Я только что попробовал, и это не работает, к сожалению.   -  person Un1    schedule 29.09.2016
comment
Нет. Как в этом примере: stackoverflow.com/a/39484400/4600982. Но вы уверены, что можете вставить 2 темы disqus на одну страницу?   -  person Supersharp    schedule 29.09.2016
comment
Ну, я не уверен, смогу ли я вставить 2 потока disqus, но, поскольку каждый пользовательский элемент помещается на свою собственную страницу .html, я подумал, что это сработает. Здесь задействована маршрутизация, но... я не знаю. Что ж, я увидел предупреждение консоли о том, что я должен указать его как ajax, и оно дало мне эту ссылку ссылка, поэтому я щелкнул там пример рецепта DISQUS.reset и заменил текущий код javascript этим примером, представленным там на каждой из страниц настраиваемых элементов, и теперь я вижу Нам не удалось загрузить Disqus вместо комментариев   -  person Un1    schedule 29.09.2016
comment
Итак, мне нужно добавить select=""? Как показано в разделе Результат, у меня есть эти идентификаторы disqus_thread и disqus_thread2 Нужно ли мне сделать так, чтобы ‹content› выглядел так: в одном пользовательском элементе <content select="#disqus_thread"> и <content select="#disqus_thread2"> в другом как для страниц пользовательских элементов, так и для промежуточная страница (my-app.html)?   -  person Un1    schedule 29.09.2016
comment
Ваш div должен иметь имя disqus_thread (точно), чтобы работать. Таким образом, вы можете иметь только один на своей странице. Поместите его на один уровень выше в своей иерархии и следуйте советам по предоставленной вами ссылке.   -  person Supersharp    schedule 29.09.2016
comment
Благодаря вам, похоже, единственная оставшаяся проблема - это javascript самого disqus. Я пытаюсь преобразовать этот javascript так, как предлагает пример disqus, но пока безуспешно. Эхх... веб-разработчик - это сложно, чувак   -  person Un1    schedule 30.09.2016
comment
метод DISQUS.resest() следует вызывать каждый раз, когда отображается представление (1 или 2).   -  person Supersharp    schedule 01.10.2016


Ответы (2)


Ошибка связана с тем, что библиотека disqus не может найти элемент <div id="disqus_thread">.

Это потому, что этот элемент находится внутри Shadow DOM (и именно поэтому он отлично работает в Firefox, который не реализует настоящий Shadow DOM).

3 возможных решения:

  1. Не используйте Shadow DOM с вашими полимерными элементами.
  2. Не помещайте элемент #disqus_thread в элемент Polymer (вставьте его в обычный DOM).
  3. Используйте <content> в своем <template> и элемент #disqus_thread внутри тега полимера, чтобы сделать его доступным для библиотеки:

В пользовательских элементах:

<template>
   //HTML code here
   <content></content>
</template>

На HTML-странице, куда вы вставляете настраиваемый элемент:

<my-app>
   <my-testView>
      <div id="disqus_thread"></div>
   </my-testView>
</my-app>

<div> будет отображен в том месте, где размещены (вложенные) теги <content>.

person Supersharp    schedule 29.09.2016
comment
Спасибо за ответ. У меня есть эта структура index.html --/ my-app.html (custom element) --/ my-testView.html (custom element). Итак, это пользовательский элемент внутри пользовательского элемента. Так что я должен поместить <div id="disqus_thread"></div> внутри index.html <body> в основном? Я только что сделал это, а также поместил <content></content> в нужное место на странице моего пользовательского элемента my-testView.html. И я могу видеть disqus теперь на всех страницах, закрепленных вверху страницы. Но он не попал в тег <content>. О боже, это действительно отстойно быть новичком в веб-разработке.. - person Un1; 29.09.2016
comment
если у вас есть вложенные пользовательские элементы, вы должны добавить элементы содержимого во все шаблоны пользовательских элементов. Не применяйте 2 разных решения одновременно. - person Supersharp; 29.09.2016
comment
хорошо. Теперь я просто поместил <div id="disqus_thread"></div> внутри тега body в index.html и добавил ‹content›‹/content› внутри <iron-pages><my-testView name="testView"><content></content></my-testView></iron-pages> к пользовательскому элементу my-app.html и я также добавил ‹content›‹/content› в пользовательский элемент my-testView.html на том месте, где он должен быть, но я просто не понимаю, как он знает, что <div id="disqus_thread"></div> внутри body в index.html нужно перейти к <content></content> в my-testView.html Что я здесь делаю неправильно? - person Un1; 29.09.2016
comment
div должен быть внутри вашего пользовательского элемента, а content внутри template! как в примере выше - person Supersharp; 29.09.2016
comment
Тогда он его не найдет, потому что сам my-app.html, если пользовательский элемент. Я переписал свой вопрос и обновил его, чтобы было легче увидеть, что вложено, а что нет, показав, как это выглядит. Я понимаю, что вы, вероятно, уже устали от этого вопроса, но если вы знаете ответ, я буду признателен, если вы добавите что-то к нему, большое спасибо - person Un1; 29.09.2016
comment
на самом деле ваш переписанный вопрос является новым - person Supersharp; 29.09.2016

Я хотел дать еще одно возможное решение использования комментариев Disqus в Polymer. Основная проблема — невозможность использовать Disqus с элементами в теневом доме, потому что они скрыты. Итак, как мы можем сделать элемент теневого дома видимым? Мы можем передать его вниз по иерархии компонентов из index.html приложения.

Чтобы представить структуру элементов вашего html следующим образом:

index.html
<polymer-app>
  <div id="disqus_thread">
</polymer-app>

В приложении «Полимер»:

<dom-module id="polymer-app">
  <template>
      <slot></slot>
  <template>
</dom-module>

Слот — это место, где будет отображаться #disqus_thread. И вы можете передать его дальше другим компонентам, внутри полимер-приложения.

<dom-module id="polymer-app">
  <template>
    <my-page>
      <slot></slot>
    </my-page>
  <template>
</dom-module>

Примечание. Этот код является лишь примером. Не пытайтесь скопировать и вставить, он не будет работать.

person dlaub3    schedule 08.04.2018