Ställ in markeringsområde i javascript IE8


Jag arbetar på en WYSIWYG-editor med div[contenteditable=true] och jag vill sätta ett markeringsintervall från offset X i nod A till offset Y i nod B. Jag gjorde det bra i Firefox och IE9, koden är:

var range = document.createRange();
range.setStart(selectNode, 0);
range.setEnd(selectNode, selectNode.textContent.length);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);

Men på IE8 är range-objektet helt annorlunda, det har inga setStart/setEnd, och selection-objektet har inga remove/addRange-grejer. Snälla hjälp,

Svar #1

Ta en titt på rangy. Det är ett tvärwebbläsar API för intervall/markering. Det är förmodligen vad du behöver.

http://code.google.com/p/rangy/

Svar #2

Jag hade ett liknande problem och hittade detta polyfill som var ganska användbart för mig, eftersom jag inte kunde använda rangy i min situation: http://bl.ocks.org/visnup/3456262

Redigera: den ursprungliga länken har faktiskt gått sönder. När jag tittar tillbaka på min gamla kod verkar det som att polyfill inte alls kom med i releasedkoden, vi använde helt enkelt funktionsdetektering på följande sätt:

if(window.getSelection || document.selection){

sedan vid musuppsläpp:

var range;
if(window.getSelection){
    var selection = window.getSelection();
    range = selection.getRangeAt(0);
} else if(document.selection){
    range = document.selection.createRange();
    if(!range.surroundContents){
        // then give up, feature not fully implemented
    }
}
// now do stuff with range (i.e. the selection)

...och IE8-användarna stöds därför inte för den funktionen.

Men allt är inte förlorat: det finns en nyare (än mitt ursprungliga svar) polyfill på Github som kan fungera om du måste stödja IE8. Den verkar både ganska slank och omfattande.