почему textarea.selectionStart не работает на ie? - PullRequest
2 голосов
/ 26 января 2012

это дошло до абсолютного разочарования.мы пытаемся написать несколько js, которые будут вставлять текст в определенное место в тексте, связанном с текстовой областью.кажется, что все должно быть просто, но пока мы не поняли.

что усложняет наш процесс, так это то, что у нас есть плавающее меню, из которого вы выбираете, что вы хотите вставить.таким образом, последовательность:

  • позиция до желаемого места вставки в текстовой области.используя точку останова отладчика, отладчик Visual Studio указывает, что объект textarea имеет selectionStart и selectionEnd, определенные как числа с правильными значениями.если на этом перерыве вы попытаетесь написать js, который обращается к selectionStart и selectionEnd, и вы получите неопределенное значение (что не имеет смысла, но есть много публикаций, в которых говорится, что у всех остальных есть такая же проблема)

  • теперь мы позиционируемся в плавающее меню, которое является не чем иным, как оберткой div для таблицы, где элементы td вызывают функцию для вставки текста).если мы щелкнем точно по элементу td, текст будет вставлен туда, где он принадлежит.если в любой момент мы щелкаем за пределами элемента td, но внутри меню, выбор документа сбрасывается в начало текстовой области, и мы вставляем в неправильном месте.

  • мы попытались отловитьцепочка событий onclick, связанная с меню, и нет ничего очевидного, что могло бы изменить выбор документа, но тем не менее.

  • мы пробовали различные обходные пути, где мы помещаемonClick на самой текстовой области и запомните текущий диапазон для текстовой области, но он всегда заканчивается в начале буфера.

, так что в простых терминах: почему не создаютсяTextRange и documentотбор ведет себя рационально, т. е. и какой обходной путь?

что делает jquery, чтобы обойти эту проблему, так как наиболее распространенный ответ на сообщения об этом, кажется, использует jquery.

1 Ответ

0 голосов
/ 26 января 2012

Вот метод, который будет вставлен в каретку.

function insertAtCaret ( areaId, text ) {
    var txtarea = document.getElementById(areaId),
        scrollPos = txtarea.scrollTop,
        strPos = 0,
        range, front, back,
        br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ? 
        "ff" : (document.selection ? "ie" : false ) );
    if (br == "ie") { 
        txtarea.focus();
        range = document.selection.createRange();
        range.moveStart ('character', -txtarea.value.length);
        strPos = range.text.length;
    }
    else if (br == "ff") strPos = txtarea.selectionStart;

    front = (txtarea.value).substring(0,strPos);  
    back = (txtarea.value).substring(strPos,txtarea.value.length); 
    txtarea.value=front+text+back;
    strPos = strPos + text.length;
    if (br == "ie") { 
        txtarea.focus();
        range = document.selection.createRange();
        range.moveStart ('character', -txtarea.value.length);
        range.moveStart ('character', strPos);
        range.moveEnd ('character', 0);
        range.select();
    }
    else if (br == "ff") {
        txtarea.selectionStart = strPos;
        txtarea.selectionEnd = strPos;
        txtarea.focus();
    }
    txtarea.scrollTop = scrollPos;
};

Я изначально получил его из ответа здесь на SO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...