Diff zwischen zwei HTML-Chunks: strukturelle statt Linien / Zeichen?

8

Ich suche nach einer JavaScript-Diff-Engine, die den Unterschied in der Struktur zweier HTML-Teile zurückgibt. Das heißt, statt "an dieser Linie, bei diesem und jenem Charakter, geschah etwas", wäre es, "dieses Element wurde nach diesem Element eingefügt" oder "dieses Element wurde entfernt", oder "dieser Textknoten war geändert ", etc.

Cursory Forschung schlägt vor das ist hart .

Das spezifische Szenario ist, dass ich eine Live-Vorschau des Markdown-Texteditors habe. Es funktioniert gut mit nur Text, aber sobald ein Nutzer zum Beispiel ein YouTube <iframe> einbucht, wird er bei jedem Tastendruck neu gerendert / neu geladen, was absurd teuer ist. Große Bilder sind auch schwierig, weil sie beim Laden aus dem Cache (zumindest in WebKit) einen ekelhaften Jitter-Effekt verursachen.

Was wäre schön, wäre ein Ersatz für jQuery.html() , das anstelle der HTML-Inhalte tatsächlich das Alte mit dem Neuen vergleicht und selektiv aktualisiert / eingefügt / angehängt, so dass die unveränderten Elemente in Ruhe gelassen werden.

    
JKS 12.08.2011, 19:46
quelle

1 Antwort

1
  1. Deep clone (über node.cloneNode(true) ) beide Knoten, wenn sie gerade verwendet werden (d. h. wenn in Ihrem JavaScript auf untergeordnete Knoten verwiesen wird).
  2. Normalisieren Sie beide Knoten über node.normalize() .
  3. Iteriere über jeden Kindknoten beider Knoten und vergleiche mit node.isEqualNode(other_node) .
  4. Wiederholen Sie für jeden nicht gleichen Knoten tiefer, um festzustellen, ob Sie gleichwertige untergeordnete Knoten finden können.

Um ehrlich zu sein, ist es viel besser, eine Text-Diff-Lib zu verwenden, anstatt eine eigene DOM-basierte Diff-Bibliothek zu erstellen.

    
Eli Grey 14.08.2011 08:19
quelle

Tags und Links