Выбор StartContainer в IE - PullRequest
       38

Выбор StartContainer в IE

7 голосов
/ 03 августа 2009

У меня есть объект выбора, где в IE я запускаю

range = selection.createRange();

Затем я пытаюсь получить startContainer, но не могу понять, как это сделать. Все примеры показывают мне УСТАНОВКУ startContainer, но я основываю это на выделении текста. Как узнать, какой элемент установить, не получая его первым?

Я знаю, что в FireFox это так же просто, как

range     = selection.getRangeAt(0);
firstNode = range.startContainer;

Ответы [ 3 ]

2 голосов
/ 21 июля 2011

[Прошло два года.] Хорошо, это будет некрасиво, но я думаю, что получил ответ на этот вопрос (похоже, работает на IE8). Код выглядит следующим образом (пояснение в комментариях):

/**
 * @param {window object} win The window from which the selection is to be retrieved. This could also be an iframe.contentWindow.
 */
function getRangeObject(win) { //Gets the first range object. 
    win=win || window;
    if (win.getSelection) { // W3C/FF/Chrome/Safari/Opera/IE9
        return win.getSelection().getRangeAt(0);    //W3C DOM Range Object
    }
    else if(win.document.selection) { // IE8
        return win.document.selection.createRange(); //Microsoft TextRange Object
    }
    return null;
}

function getStartContainer(win) {
win=win || window;
    var range=getRangeObject(win);
    if(range) {
        if(range.startContainer) { // W3C/FF/Chrome/Safari/Opera/IE9
            return range.startContainer;
        } else if(document.selection) { //IE8
            var rangeCopy=range.duplicate(); //Create a copy
            var rangeObj=range.duplicate();

            rangeCopy.collapse(true); //Go to beginning of the selection
        rangeCopy.moveEnd('character',1); //Select only the first character
            //Debug Message
            //alert(rangeCopy.text); //Should be the first character of the selection
            var parentElement=rangeCopy.parentElement();
            rangeObj.moveToElementText(parentElement); //Select all text of parentElement
            rangeObj.setEndPoint('EndToEnd',rangeCopy); //Set end point to the first character of the 'real' selection
            var text=rangeObj.text; //Now we get all text from parentElement's first character upto the real selection's first character

            //Iterate through all the child text nodes and check for matches
            //As we go through each text node keep removing the text value (substring) from the beginning of the text variable.
            var container=null;
            for(var node=parentElement.firstChild; node; node=node.nextSibling) {
                if(node.nodeType==3) {//Text node
                    var find=node.nodeValue;
                    var pos=text.indexOf(find);
                    if(pos==0 && text!=find) { //text==find is a special case
                        text=text.substring(find.length);
                    } else {
                        container=node;
                        break;
                    }
                }
            }
            range.startContainer=container; //Finally we are here
            //Debug Message
            //alert(container.nodeValue);
        }
    }
}

Извините за чрезмерные комментарии (я думаю, что это было необходимо). Как только вы удалите все эти комментарии, вы получите код, который ... менее уродлив: P.

0 голосов
/ 06 февраля 2011

Я только что столкнулся с этой проблемой. Я не могу найти элегантное решение, поэтому вот не элегантное:

Примечание: это будет работать ТОЛЬКО, если стартовый контейнер имеет идентификатор

Сначала проверьте, является ли браузер IE. Тогда,

            // var range should be your TextRange object
            var matches = range.htmlText.match(/<[^>]* id=([^\s]+)[^>]*>/);
            if (matches) {
                var startContainer = document.getElementById(matches[1]);
                if (startContainer) {
                    ...
                }
            }

Вот методы из диапазона: http://msdn.microsoft.com/en-us/library/ms535872(v=vs.85).aspx

Я не вижу способа получить фактический набор dom objs.

0 голосов
/ 19 августа 2009

Я тоже работаю над чем-то похожим. Я еще не дошел до IE, но я бы предложил перебрать список свойств диапазона и посмотреть, что вам доступно

var msg = '';
for (var i in range) {
    msg += i + ': ' + range[i] + '\n';
}
alert(msg);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...