codice:
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>window.getSelection() e document.createRange() per IE</title>
</head>
<script type="text/javascript">
if (!Window.prototype.getSelection && document.selection) { (function() {
function getRangeEnd(aTextRange, aEndPoint) {
var fixedRange = this.document.body.createTextRange();
var endNode = aTextRange.parentElement();
var scrollingRng = this.document.body.createTextRange();
var endChar = 0;
var scrollingNode = endNode;
var isHere;
function scrollRange(aNode) {
if (aNode.nodeType === 1) {
scrollingRng.moveToElementText(aNode);
}
else if (aNode.nodeType === 3) {
if (scrollingNode.previousSibling !== null) {
scrollingRng.moveToElementText(aNode.previousSibling);
scrollingRng.setEndPoint("StartToEnd", scrollingRng);
}
else { scrollingRng.moveToElementText(aNode.parentNode); }
}
else { return; }
endNode = aNode;
scrollingRng.collapse();
}
while (scrollingNode.hasChildNodes()) {
scrollingNode = scrollingNode.firstChild;
scrollRange(scrollingNode);
if (scrollingNode.nextSibling !== null && scrollingRng.compareEndPoints(aEndPoint ? "EndToEnd" : "StartToStart", aTextRange) < 1) {
isHere = false;
while (scrollingRng.compareEndPoints(aEndPoint ? "EndToEnd" : "StartToStart", aTextRange) < 1) {
if (scrollingNode.nextSibling === null) { isHere = true; break; }
scrollingNode = scrollingNode.nextSibling;
//if (aEndPoint) { alert(scrollingNode + " - " + endNode.nodeValue + " + " + scrollingRng.compareEndPoints(aEndPoint ? "EndToEnd" : "StartToStart", aTextRange)); }
scrollRange(scrollingNode);
}
if (!isHere) { scrollingNode = scrollingNode.previousSibling; scrollRange(scrollingNode); }
}
if (!scrollingNode) { break; }
}
while (scrollingRng.compareEndPoints(aEndPoint ? "EndToEnd" : "StartToStart", aTextRange) < 0) {
scrollingRng[aEndPoint ? "moveEnd" : "moveStart"]("character", 1);
endChar++;
}
fixedRange.setEndPoint(aEndPoint ? "EndToEnd" : "StartToStart", scrollingRng);
//debugNode = endNode; while (debugNode.hasChildNodes()) { debugNode = debugNode.firstChild; } alert(debugNode.nodeValue)
//alert(endChar);
delete fixedRange;
delete scrollingRng;
return {
//"semiRange" : fixedRange,
"container" : endNode,
"contnChar" : endChar
};
}
function W3CRange(aIETextRng) {
var startPoint = getRangeEnd(aIETextRng, false);
var endPoint = getRangeEnd(aIETextRng, true);
var IETextRange = aIETextRng;
var positiveDirection = true;
this.collapsed = null;
this.startContainer = startPoint.container;
this.startOffset = startPoint.contnChar;
this.endContainer = endPoint.container;
this.endOffset = endPoint.contnChar;
this.commonAncestorContainer = aIETextRng.parentElement();
this.setStart = function(aStartNode, aStartChar) {
var sTmpNode1 = aStartNode;
if (sTmpNode1.nodeType === 3) {
if (sTmpNode1.previousSibling !== null) { sTmpNode1 = sTmpNode1.previousSibling; }
else { sTmpNode1 = sTmpNode1.parentNode; }
}
var newIERng1 = document.body.createTextRange();
newIERng1.moveToElementText(sTmpNode1);
if (aStartChar > 0) { newIERng1.moveStart("character", aStartChar); }
if (IETextRange.compareEndPoints("EndToStart", newIERng1) < 0) {
IETextRange.setEndPoint("EndToStart", newIERng1);
IETextRange.setEndPoint("StartToStart", newIERng1);
this.endContainer = sTmpNode1;
this.endOffset = aStartChar;
} else {
IETextRange.setEndPoint("StartToStart", newIERng1);
}
this.startContainer = sTmpNode1;
this.startOffset = aStartChar;
this.commonAncestorContainer = IETextRange.parentElement();
delete newIERng1;
};
this.setEnd = function(aEndNode, aEndChar) {
var sTmpNode2 = aEndNode;
if (sTmpNode2.nodeType === 3) {
if (sTmpNode2.previousSibling !== null) { sTmpNode2 = sTmpNode1.previousSibling; }
else { sTmpNode2 = sTmpNode2.parentNode; }
}
var newIERng2 = document.body.createTextRange();
newIERng2.moveToElementText(sTmpNode2);
if (aEndChar > 0) { newIERng2.moveStart("character", aEndChar); }
if (IETextRange.compareEndPoints("StartToEnd", newIERng2) > 0) {
IETextRange.setEndPoint("StartToStart", newIERng2);
IETextRange.collapse();
this.startContainer = sTmpNode2;
this.startOffset = aEndChar;
} else {
IETextRange.setEndPoint("EndToStart", newIERng2);
}
this.endContainer = sTmpNode2;
this.endOffset = aEndChar;
this.commonAncestorContainer = IETextRange.parentElement();
delete newIERng2;
};
this.setStartBefore = null;
this.setStartAfter = null;
this.setEndBefore = null;
this.setEndAfter = null;
this.collapse = null;
this.selectNode = null;
this.selectNodeContents = null;
this.compareBoundaryPoints = null;
this.deleteContents = null;
this.extractContents = null;
this.cloneContents = null;
this.insertNode = null;
this.surroundContents = null;
this.cloneRange = null;
this.detach = null;
this.START_TO_START = null;
this.START_TO_END = null;
this.END_TO_END = null;
this.END_TO_START = null;
this.createContextualFragment = null;
this.isPointInRange = null;
this.comparePoint = null;
this.valueOf = null;
this.toString = function() { return(IETextRange.text) };
this.constructor = "[object Range]";
}
var selectedRange, anchorPoint, focusPoint, W3CSelection = {
"QueryInterface": null,
"anchorNode": null,
"anchorOffset": null,
"focusNode": null,
"focusOffset": null,
"isCollapsed": null,
"rangeCount": null,
"getRangeAt": function(aGetAt) {
var tmpRange = selectedRange.duplicate();
tmpRange.moveStart("character", aGetAt);
return(new W3CRange(tmpRange));
},
"collapse": function() {
selectedRange.collapse();
this.focusNode = anchorPoint.container;
this.focusOffset = anchorPoint.contnChar;
},
"extend": null,
"collapseToStart": function() {
},
"collapseToEnd": function() {
},
"containsNode": null,
"selectAllChildren": null,
"addRange": null,
"removeRange": null,
"removeAllRanges": null,
"deleteFromDocument": null,
"selectionLanguageChange": null,
"getIETextRange": function() { return(selectedRange.duplicate()); },
"toString": function() { return(selectedRange.text) },
"valueOf": null,
"constructor": "[object Selection]"
};
HTMLDocument.prototype.createRange = function() {
IETextRng = this.body.createTextRange();
IETextRng.collapse();
return(new W3CRange(IETextRng));
}
Window.prototype.getSelection = function() {
selectedRange = this.document.selection.createRange();
anchorPoint = getRangeEnd.call(this,selectedRange, false);
focusPoint = getRangeEnd.call(this,selectedRange, true);
/*var debugRange = this.document.body.createTextRange();
debugRange.setEndPoint("StartToStart", anchorPoint.semiRange);
debugRange.setEndPoint("EndToEnd", focusPoint.semiRange);
alert(debugRange.text);*/
W3CSelection.anchorNode = anchorPoint.container;
W3CSelection.anchorOffset = anchorPoint.contnChar;
W3CSelection.focusNode = focusPoint.container;
W3CSelection.focusOffset = focusPoint.contnChar;
W3CSelection.isCollapsed = anchorPoint.container === focusPoint.container && anchorPoint.contnChar === focusPoint.contnChar ? true : false;
return(W3CSelection);
};
})(); }
function captureSelection() {
var customSel = window.getSelection();
customRange = document.createRange();
customRange.setStart(document.getElementById("samplePar1"), 3);
customRange.setEnd(document.getElementById("samplePar2"), 6);
//alert(customRange);
alert(customSel);
}
</script>
</head>
<body onmouseup="captureSelection();">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In eget quam in erat venenatis sagittis et quis massa. Vestibulum mi nulla, sollicitudin nec molestie laoreet, rhoncus a enim. Nunc vehicula auctor nibh non molestie. Maecenas feugiat, nisl eget tempus accumsan, lorem risus condimentum risus, id elementum lectus dolor nec elit. Phasellus ut orci ac magna convallis sollicitudin sed ut nulla. Fusce sit amet felis ligula. Nam quis blandit ipsum. Maecenas ac ornare erat. Maecenas lorem orci, blandit non iaculis a, sagittis vitae nisl. Vestibulum quis tincidunt ligula. Suspendisse id lorem ante, a pretium est. Nullam luctus molestie orci id hendrerit. Aenean vel cursus urna. Ut tortor orci, laoreet sit amet fermentum nec, tristique sed metus. Maecenas mollis varius dui sit amet feugiat. Donec dignissim velit in felis dapibus porta eleifend turpis venenatis. Vivamus blandit tellus fringilla massa fringilla bibendum.
</p>
Aenean consectetur nisl nec odio porta ut fringilla felis congue. In molestie dolor nec ligula egestas sit amet adipiscing orci sodales. Mauris hendrerit mi augue. Cras sed est vel augue vestibulum dignissim at eu nibh. Fusce consectetur magna ac orci cursus tempus. Sed at nisi odio, id luctus orci. Duis ut sapien lorem. In id malesuada justo. Mauris ut augue eget turpis elementum pellentesque. Pellentesque semper purus et lorem cursus sed sodales felis tincidunt. Quisque vitae arcu ut orci mattis dictum et sed nulla. Cras porta, erat non tincidunt egestas, lorem orci ultrices lorem, sed imperdiet mauris nulla nec leo. Aliquam a justo dui. Praesent quis turpis ac neque rhoncus condimentum. In vulputate varius porta.
</p>
<p id="samplePar1">
Fusce id dignissim nulla. Maecenas egestas mattis elit sed gravida. Nam ac massa vel libero dictum porta. Fusce porta tristique sapien, vitae condimentum neque semper in. Morbi ornare vulputate dolor sed accumsan. Duis tempor, augue fermentum pulvinar consectetur, nunc leo lobortis libero, nec egestas enim massa id diam. Nam ultricies enim sed metus molestie lacinia. Pellentesque sodales vehicula pulvinar. Quisque et orci vel risus fringilla condimentum. Aliquam id pretium lacus. Vestibulum ut ipsum ipsum. Nullam lacinia tellus et augue viverra ultrices. Fusce in erat quam, vitae sollicitudin eros. Sed mollis, ligula vel fermentum auctor, erat neque condimentum eros, et mollis turpis nisi sed lacus. Nunc mollis, arcu at placerat hendrerit, lacus libero suscipit dolor, non posuere magna sapien rutrum lorem. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nullam eros mauris, tincidunt ut ornare in, molestie vitae risus. Donec in lacus id diam mattis sollicitudin.
</p>
<p id="samplePar2">
In mattis dictum magna, sed hendrerit lacus ultrices id. Suspendisse eget diam ut turpis dignissim euismod. Sed tortor arcu, scelerisque ut pharetra ut, sollicitudin ac augue. Etiam risus lacus, cursus nec molestie sed, mattis quis nisi. Duis elit risus, pharetra quis adipiscing ac, tempus et dolor. In elementum urna vel nibh bibendum volutpat. Donec odio tortor, elementum nec egestas et, auctor quis ante. Sed vehicula neque quis lacus tempor rhoncus. Integer adipiscing laoreet dictum. Integer massa magna, bibendum sit amet porttitor non, sagittis nec risus. Suspendisse potenti. Proin hendrerit ante lorem, et feugiat justo. Aliquam feugiat, nisl mollis fermentum fermentum, eros metus imperdiet elit, nec porta magna augue et tellus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla pellentesque, mi ut ullamcorper tempus, orci diam faucibus tellus, nec vestibulum sem felis quis lorem. Etiam commodo orci vitae ligula pretium lacinia. Suspendisse sit amet imperdiet diam. Quisque sagittis eros felis, et commodo leo. Phasellus nec pretium augue. Proin in congue nisi.
</p>
Duis eu justo et velit ultrices congue. Nunc iaculis diam vel sapien tincidunt blandit at sed nunc. Phasellus ac arcu ut <u>leo</u> tincidunt tristique convallis a tellus. Cras ultricies justo sed lectus adipiscing feugiat sed eget nibh. Curabitur nec lectus non lorem vestibulum eleifend mollis nec felis. Suspendisse nec massa nec nisi mattis blandit in pharetra odio. Etiam ultricies, diam eu suscipit elementum, dolor felis aliquet elit, id scelerisque odio sem non erat. Praesent gravida, enim eget interdum feugiat, lorem lacus feugiat enim, ut dignissim sapien est in ante. Curabitur lacinia malesuada luctus. Nullam vel justo purus, nec volutpat tortor. Aliquam eu enim ac nisl mattis sagittis et vel quam.
</p>
</body>
</html>