function createBoundaryTextRange(boundaryPosition, isStart) {
        var boundaryNode, boundaryParent, boundaryOffset = boundaryPosition.offset;
        var doc = dom.getDocument(boundaryPosition.node);
        var workingNode, childNodes, workingRange = doc.body.createTextRange();
        var nodeIsDataNode = dom.isCharacterDataNode(boundaryPosition.node);

        if (nodeIsDataNode) {
            boundaryNode = boundaryPosition.node;
            boundaryParent = boundaryNode.parentNode;
        } else {
            childNodes = boundaryPosition.node.childNodes;
            boundaryNode = (boundaryOffset < childNodes.length) ? childNodes[boundaryOffset] : null;
            boundaryParent = boundaryPosition.node;
        }

        // Position the range immediately before the node containing the boundary
        workingNode = doc.createElement("span");

        // Making the working element non-empty element persuades IE to consider the TextRange boundary to be within the
        // element rather than immediately before or after it, which is what we want
        workingNode.innerHTML = "&#feff;";

        // insertBefore is supposed to work like appendChild if the second parameter is null. However, a bug report
        // for IERange suggests that it can crash the browser: http://code.google.com/p/ierange/issues/detail?id=12
        if (boundaryNode) {
            boundaryParent.insertBefore(workingNode, boundaryNode);
        } else {
            boundaryParent.appendChild(workingNode);
        }

        workingRange.moveToElementText(workingNode);
        workingRange.collapse(!isStart);

        // Clean up
        boundaryParent.removeChild(workingNode);

        // Move the working range to the text offset, if required
        if (nodeIsDataNode) {
            workingRange[isStart ? "moveStart" : "moveEnd"]("character", boundaryOffset);
        }

        return workingRange;
    }
function createBoundaryTextRange(boundaryPosition, isStart) {
        var boundaryNode, boundaryParent, boundaryOffset = boundaryPosition.offset;
        var doc = dom.getDocument(boundaryPosition.node);
        var workingNode, childNodes, workingRange = doc.body.createTextRange();
        var nodeIsDataNode = dom.isCharacterDataNode(boundaryPosition.node);

        if (nodeIsDataNode) {
            boundaryNode = boundaryPosition.node;
            boundaryParent = boundaryNode.parentNode;
        } else {
            childNodes = boundaryPosition.node.childNodes;
            boundaryNode = (boundaryOffset < childNodes.length) ? childNodes[boundaryOffset] : null;
            boundaryParent = boundaryPosition.node;
        }

        
        workingNode = doc.createElement("span");

        
        
        workingNode.innerHTML = "&#feff;";

        
        
        if (boundaryNode) {
            boundaryParent.insertBefore(workingNode, boundaryNode);
        } else {
            boundaryParent.appendChild(workingNode);
        }

        workingRange.moveToElementText(workingNode);
        workingRange.collapse(!isStart);

        
        boundaryParent.removeChild(workingNode);

        
        if (nodeIsDataNode) {
            workingRange[isStart ? "moveStart" : "moveEnd"]("character", boundaryOffset);
        }

        return workingRange;
    }
function createBoundaryTextRange ( boundaryPosition , isStart ) { var boundaryNode , boundaryParent , boundaryOffset = boundaryPosition . offset ; var doc = dom . getDocument ( boundaryPosition . node ) ; var workingNode , childNodes , workingRange = doc . body . createTextRange ( ) ; var nodeIsDataNode = dom . isCharacterDataNode ( boundaryPosition . node ) ; if ( nodeIsDataNode ) { boundaryNode = boundaryPosition . node ; boundaryParent = boundaryNode . parentNode ; } else { childNodes = boundaryPosition . node . childNodes ; boundaryNode = ( boundaryOffset < childNodes . length ) ? childNodes [ boundaryOffset ] : null ; boundaryParent = boundaryPosition . node ; } // Position the range immediately before the node containing the boundary workingNode = doc . createElement ( "span" ) ; // Making the working element non-empty element persuades IE to consider the TextRange boundary to be within the // element rather than immediately before or after it, which is what we want workingNode . innerHTML = "&#feff;" ; // insertBefore is supposed to work like appendChild if the second parameter is null. However, a bug report // for IERange suggests that it can crash the browser: http://code.google.com/p/ierange/issues/detail?id=12 if ( boundaryNode ) { boundaryParent . insertBefore ( workingNode , boundaryNode ) ; } else { boundaryParent . appendChild ( workingNode ) ; } workingRange . moveToElementText ( workingNode ) ; workingRange . collapse ( ! isStart ) ; // Clean up boundaryParent . removeChild ( workingNode ) ; // Move the working range to the text offset, if required if ( nodeIsDataNode ) { workingRange [ isStart ? "moveStart" : "moveEnd" ] ( "character" , boundaryOffset ) ; } return workingRange ; }
Returns a TextRange representing the boundary of a TextRange expressed as a node and an offset within that node. This function started out as an optimized version of code found in Tim Cameron Ryan's IERange (http://code.google.com/p/ierange/)
Returns a TextRange representing the boundary of a TextRange expressed as a node and an offset within that node . This function started out as an optimized version of code found in Tim Cameron Ryan s IERange ( http : // code . google . com / p / ierange / )