2010-02-06 17 views
10

Ich benutze einen inhalts-editierbaren iframe, um einen Syntax-Highlighter in Javascript zu erstellen, und eines der wichtigsten Dinge ist, Code richtig einrücken zu können.Auswahlbereiche im Webkit (Safari/Chrome)

Der folgende Code funktioniert, wie es sollte in Firefox:

// Create one indent character 
var range = window.getSelection().getRangeAt(0); 
var newTextNode = document.createTextNode(Language.tabChar); 
range.insertNode(newTextNode); 
range.setStartAfter(newTextNode); 

Es schafft eine Registerkarte Zeichen und bewegt den Cursor auf die rechte Seite des Charakters. In Chrome und Safari wird ein Zeichen eingefügt, der Cursor bewegt sich jedoch nicht rechts davon.

Ich habe das Range-Objekt sowohl in Chrome als auch in Firefox untersucht und dann festgestellt, dass das Range-Objekt von Firefox viel reicher ist als das von Chrome. Ich konnte keine Spezifikationen des Bereichsobjekts im Webkit finden.

Wie kann ich diesen Code für Webkit und Firefox verwenden?

Vielen Dank!

Antwort

23

Sowohl die Range-Objekte von Firefox als auch von WebKit entsprechen vollständig der DOM Range spec. Wenn Firefox mehr Eigenschaften hat, dann sind dies Mozillas eigene Erweiterungen, aber im Allgemeinen bietet die Spezifikation alles, was Sie brauchen könnten.

Wie auch immer, das Problem ist, dass Sie den Bereich nach dem Ändern sie erneut auswählen müssen:

// Create one indent character 
var sel = window.getSelection(); 
var range = sel.getRangeAt(0); 
var newTextNode = document.createTextNode(Language.tabChar); 
range.insertNode(newTextNode); 
range.setStartAfter(newTextNode); 
sel.removeAllRanges(); 
sel.addRange(range); 

Beachten Sie, dass dies nicht in frühen Versionen von Safari arbeiten (3 vor Version, glaube ich), weil seine Auswahlobjekt unterstützt getRangeAt nicht. Es gibt einen Workaround dafür, den ich bereitstellen kann, wenn Sie es brauchen.

+0

Fantastisch! Es funktioniert sowohl in Firefox als auch in Chrome :) Danke! – Christoffer

+1

Also in Firefox nur Aufruf von range.setStartAfter() wird die Auswahl zu aktualisieren, selection.addRange() Aufruf ist nicht erforderlich. Chrome benötigt jedoch den Aufruf von addRange(). – maulik13

+1

@ maulik13: Das ist wahr. Firefox ist jedoch der einzige Browser, der das tut, und die Spezifikation sagt nichts darüber aus, daher empfehle ich normalerweise, den 'addRange()' Aufruf zu verwenden, ohne diese Subtilität zu erwähnen. –