2016-05-06 17 views
11

Ich habe eine Menge Zeit damit verbracht, das Kommentar-Count-Skript auf meinen reagierenden Seiten funktionieren zu lassen. Um zu beginnen, empfehlen sie, das Skript in meine index.html Datei am Ende des Tags <body> zu setzen. Ich habe das getan und kein Ergebnis gesehen.Disqus's count.js Skript läuft nicht richtig in index.html mit react.js website

<body> 
 
    <div id="app"> 
 
    </div> 
 
    <script src="static/index.js"></script> 
 
    <script id="dsq-count-scr" src="//mtg-hunter.disqus.com/count.js" async></script> 
 
    </body>

ich eine index.js-Datei, die alle meine Komponenten geladen wird, einschließlich der Komponente (wir es ResultComponent.js nennen), die ich die Anzahl der Kommentare <span> Tags in haben wollen. die <span> Tags selbst wie folgt aussehen:

var commentCount = <span className="disqus-comment-count" onClick={function() {this.setState({currentSelectedTab: 4})}.bind(this)} 
 
\t \t \t data-disqus-identifier={idGoesHere} 
 
\t \t \t style={{fontVariant:"small-caps"}}>0 Comments</span>

So weit, so einfach. Ich verwende keine <a> Tags, so dass ich nirgendwo #disqus_thread habe. Wenn ich meine Seite lade, erwarte ich, dass meine Anzahl an Kommentaren steigt, aber kein Glück. Um dies zu testen, kopierte ich das unbearbeitete Skript unverändert aus dem rohen Skript count.js (welches located here ist). Ich habe es dann direkt in die Devtools-Konsole von Chrome eingefügt, und es hat funktioniert. alle relevanten Kommentarzähler gingen zu ihren entsprechenden Werten.

EDIT: einen Tag später, mehr stupsen; Ich habe Haltepunkte im aktuellen Code in der Domain disqus.com hinzugefügt. Das Skript im Skript-Tag läuft zum richtigen Zeitpunkt einwandfrei, außer dass Variablen fehlen, wenn es die Funktion displayCount() aufruft. Es gibt mehrere Variablen, die nur keine Werte erhalten, so dass sie nicht kommen und die Kommentare zählen können, es kommt immer fehl. Ich habe keine Ahnung, warum das fehlschlägt, wenn es in meiner index.html aufgerufen wird, aber nicht, wenn ich den rohen count.js Code in meine Konsole einfüge und es dort mache. Keine Ahnung warum.

Um zu klären, ist dies der entsprechende Code:

e.displayCount = function(b) { 
 
     for (var c, a, d, e = b.counts, b = b.text.comments; c = e.shift();) 
 
      if (a = j[c.id]) { 
 
       switch (c.comments) { 
 
       case 0: 
 
        d = b.zero; 
 
        break; 
 
       case 1: 
 
        d = b.one; 
 
        break; 
 
       default: 
 
        d = b.multiple 
 
       } 
 
       c = d.replace("{num}", c.comments); 
 
       a = a.elements; 
 
       for (d = a.length - 1; d >= 0; d--) 
 
        a[d].innerHTML = c 
 
      } 
 
    } 
 
    ;
Wenn es richtig läuft, von meinem Einfügen das Skript in die Konsole, die j Variable definiert ist. Wenn es von index.html aufgerufen wird, j ist nicht definiert, so dass es bei der ersten if fehlschlägt. Die aufrufende URL ist in beiden Situationen identisch: http://mtg-hunter.disqus.com/count-data.js?1=19767&1=235597&1=373322&1=382310&1=382841&1=382866&1=383023&1=397543&1=397682&1=398434. Das gibt den b Parameter, und wenn ich das Skript lokal ausführe, definiert es j, so dass der Zuweisungsoperator im if funktionieren kann (was eine wirklich seltsame Art ist, es zu tun, aber ok).

noch einmal bearbeiten: Ich sollte darauf hinweisen, dass ich dies auf einem lokalen Testserver (localhost:3000) mache, nicht sicher, ob das einen Unterschied macht oder nicht?

bearbeiten Sie mehr: Die Antwort auf meine obige Frage stellt sich als "Nein" heraus. Ich habe meinen Code auf meinen Server hochgeladen, und auf der Produktions-Site wurde auch angezeigt, dass das Skript nicht ordnungsgemäß ausgeführt wurde. Das ist absurd ... Ich habe jetzt keine Ideen mehr.

erneut bearbeiten mehr: Teilweise Durchbruch ... Ich habe diesen Code zu ResultComponent hinzugefügt.js:

componentDidMount() { 
 
    \t DISQUSWIDGETS.getCount(); 
 
    }, 
 

 
    componentDidUpdate() { 
 
    \t DISQUSWIDGETS.getCount(); 
 
    },

gute Nachricht; Wenn ich die Seite aktualisiere, wird die Anzahl der richtigen Kommentare angezeigt! Hurra! Schlechte Nachrichten: Wenn ich Teile der Seite, die die Ergebniskomponente ausblenden, und dann wieder zurückbringen (Triggerung componentDidUpdate), funktioniert der Anruf DISQUSWIDGETS.getCount() nicht. Es wird immer noch aufgerufen, aber der displayCount Teil des Skripts tut dies nie, daher wird das DOM nie mit den neuen Informationen aktualisiert. Es ist noch ein weiteres Beispiel für dieses schreckliche Skript, das sich anders verhält, obwohl es genau so aufgerufen wird ...

+0

Scheint, als ob reactjs etwas zu Ihrem erwarteten Kontext tun könnte. Können Sie 'displayCount' so anpassen, dass Sie' j' als zusätzliches Argument übergeben können? – Ouroborus

+0

Nein, dies ist ein Skript, das von disqus geladen/erstellt wurde und es befindet sich unter mtg-hunter.disqus.com/count.js. – IronWaffleMan

+0

Obwohl nicht die beste Lösung, sieht es so aus, als ob Sie den Code aktualisieren können. Nachdem 'count.js' geladen wurde, weisen Sie' DISQUSWIDGETS.displayCount' einer Funktion zu, die Ihrem Geschmack entspricht. Oder erstellen Sie sogar eine lokale Kopie von 'count.js' und modifizieren und verlinken Sie dazu. Zumindest könnte dies beim Debuggen helfen. – Ouroborus

Antwort

3

OK, nach viel Hin und Her mit dem Support-Typ bei Disqus habe ich endlich eine Antwort gefunden; Ich war nahe. Die Lösung lautet:

componentDidMount() { 
 
    \t DISQUSWIDGETS.getCount({reset:true}); 
 
    }, 
 

 
    componentDidUpdate() { 
 
    \t DISQUSWIDGETS.getCount({reset:true}); 
 
    },

Es stellte sich heraus ich die reset:true param passieren musste, die ein Stück Code in getCount aktiviert werden, damit tatsächlich etwas tun. Ich nehme an, dass ich das aus dem Code hätte herausfinden können, aber ich gebe der extrem reduzierten Formatierung die Schuld (selbst mit Chrome-Dev-Tools, die dazu beitragen, sie zu verschönern), dass ich das vermisse. Es war auch in ihrem Knowledge-Base-Artikel, wie man Kommentarzähler hinzufügt, aber ich vermisste den Kontext davon (und wurde von der "Tatsache" absorbiert, dass "es offensichtlich war, dass das Skript nicht funktionierte, klar").

Und so endet einer meiner frustrierendsten Tage des Codierens. Und eine nützliche Lektion ... treten Sie zurück und schauen Sie sich das große Bild hin und wieder an, denn die Antwort kann Sie ins Gesicht sehen.