How to get nodes lying inside a range with javascript?

后端 未结 9 2085
被撕碎了的回忆
被撕碎了的回忆 2020-11-29 03:59

I\'m trying to get all the DOM nodes that are within a range object, what\'s the best way to do this?

var selection = window.getSelection(); //what the user          


        
9条回答
  •  温柔的废话
    2020-11-29 04:45

    here is function return you array of sub-ranges

    function getSafeRanges(range) {
    
    var doc = document;
    
    var commonAncestorContainer = range.commonAncestorContainer;
    var startContainer = range.startContainer;
    var endContainer = range.endContainer;
    var startArray = new Array(0),
        startRange = new Array(0);
    var endArray = new Array(0),
        endRange = new Array(0);
    // @@@@@ If start container and end container is same
    if (startContainer == endContainer) {
        return [range];
    } else {
        for (var i = startContainer; i != commonAncestorContainer; i = i.parentNode) {
            startArray.push(i);
        }
        for (var i = endContainer; i != commonAncestorContainer; i = i.parentNode) {
            endArray.push(i);
        }
    }
    if (0 < startArray.length) {
        for (var i = 0; i < startArray.length; i++) {
            if (i) {
                var node = startArray[i - 1];
                while ((node = node.nextSibling) != null) {
                    startRange = startRange.concat(getRangeOfChildNodes(node));
                }
            } else {
                var xs = doc.createRange();
                var s = startArray[i];
                var offset = range.startOffset;
                var ea = (startArray[i].nodeType == Node.TEXT_NODE) ? startArray[i] : startArray[i].lastChild;
                xs.setStart(s, offset);
                xs.setEndAfter(ea);
                startRange.push(xs);
            }
        }
    }
    if (0 < endArray.length) {
        for (var i = 0; i < endArray.length; i++) {
            if (i) {
                var node = endArray[i - 1];
                while ((node = node.previousSibling) != null) {
                    endRange = endRange.concat(getRangeOfChildNodes(node));
                }
            } else {
                var xe = doc.createRange();
                var sb = (endArray[i].nodeType == Node.TEXT_NODE) ? endArray[i] : endArray[i].firstChild;
                var end = endArray[i];
                var offset = range.endOffset;
                xe.setStartBefore(sb);
                xe.setEnd(end, offset);
                endRange.unshift(xe);
            }
        }
    }
    var topStartNode = startArray[startArray.length - 1];
    var topEndNode = endArray[endArray.length - 1];
    var middleRange = getRangeOfMiddleElements(topStartNode, topEndNode);
    startRange = startRange.concat(middleRange);
    response = startRange.concat(endRange);
    return response;
    

    }

提交回复
热议问题