2015-05-25 17 views
5

Ich möchte einen Textbereich von einer HTML-Seite hervorheben und die markierte Position zum Speichern von Kommentaren verwenden.Informationen über eine Textauswahl im Browser speichern

Mein Problem

Ich habe einen Artikel Seite, die dem Benutzer eine Auswahl von Text markieren können und einen Kommentar hinzufügen. Ich habe es zu einem Punkt, wo ich eine UI-Box auf der rechten Seite des ausgewählten Textes positionieren kann, um einen Kommentar einzugeben (denke Google Docs).

Ich muss Informationen über den ausgewählten Text speichern, damit ich es mit beliebigen Kommentaren verknüpfen kann. Im Idealfall würde ich nur den ausgewählten Text speichern und dann den Inhalt für diese Auswahl scannen. Dies hat einen großen Fehler: Was passiert, wenn zwei oder mehr Kopien der gleichen Textauswahl im Inhalt vorkommen.

Der Inhalt selbst ist HTML in einer DB gespeichert.

Zum Beispiel wurde eine Auswahl des folgenden Absatzes hervorgehoben (fett markierte Auswahl). Ich brauche Informationen über die Auswahl speichern zu können, um es in der Zukunft zu finden.

„Effizientes revolutionieren Interoperabilität Humankapital über virale Nischen ganzheitlich Weltklasse-Möglichkeiten durch weltweite Gemeinden ergreifen Sachlich multidisziplinären Nischen für parallel umarmen. Paradigmen. Professionell. "

Was ich bisher getan

Mit dem getBoundingClientRect() der Textauswahl range ich den Abstand vom oberen Rand der Seite bekommen. Obwohl dies für die Positionierung der UI-Kommentarbox nützlich ist, glaube ich nicht, dass dies mir helfen wird, Kommentare mit dem ausgewählten Text zu verknüpfen.

Ich kann den ausgewählten Text von window.getSelection() erhalten, aber es könnte mehrere Vorkommen geben.

Ich möchte den Inhalt NICHT ändern. d. h. drücke die Auswahl in eine span oder ähnlich, wenn ich helfen kann, als ob ein Kommentar entfernt wird, könnte es schwierig sein, sie zu entfernen, die Markup.

Antwort

0

Ihre beste Wette wäre, dass die Kommentare auf Offsets in Ihrem Text gesetzt sind (d. H. Zeichen # 100 bis Zeichen # 150).

Sie müssen die Diffs auflösen, wenn Leute Ihr Dokument bearbeiten (und wenn nicht, umso besser!). Wenn also jemand 10 Zeichen vor dem Teil hinzufügt, wo der Kommentar platziert wurde, zeigt der Kommentar jetzt zu 110-160.

+0

Das einzige Problem mit dieser Methode ist, dass 'startOffset' und' endOffset' aus dem Bereich als Teil eines Abschnitts sind. d. h. ein Absatz ist ein Abschnitt, aber auch wenn ein Absatz einen Link in der Mitte enthält, teilt er den Absatz in zwei Abschnitte auf, und so kann "startOffset" 0 sein, aber aus dem zweiten Abschnitt des zweiten Absatzes. Obwohl es keine Möglichkeit gibt, welche Abschnitte zu kennen. – iamjonesy

+0

Verwenden Sie den gesamten Text als relativen Punkt. Ignoriere die Abschnitte. –

+0

Es sieht so aus, als wären die bereitgestellten Offsets 'getRangeAt (0)' relativ zum 'Abschnitt' und nicht zum gesamten Text. Wenn ich das erste Wort des zweiten Absatzes hervorhebe, ist "startOffset" 0. – iamjonesy

0

window.getSelection gibt Ihnen ein Objekt mit viel mehr als nur dem Text. Sie könnten das ganze Objekt speichern, Sie hätten so ziemlich alle Informationen, die Sie benötigen. https://developer.mozilla.org/en-US/docs/Web/API/Selection

Normalerweise anchorNode (wo Sie parentNode anwenden um den Abschnitt zu erhalten, in dem die Auswahl begonnen hat) und startoffset sollte für alle Auswahlen eindeutig sein und Sie können genau die Zeichen zielen, die, ohne sich auf Text ausgewählt wurden Inhalt.

Verwandte Themen