在文本输入中将插入位置保持在可见位置 - firefox行为异常

时间:2009-03-26 14:33:38

标签: javascript firefox textinput

我正在想我的文本输入框,点击包含选择的“标签”的div来添加元内容。我的文本输入宽度为35,但我希望它能够溢出。

我已经搜索并找到了在更新的输入内容结束时聚焦和定位我的插入符的方法,并且chrome和IE表现自己并自动滚动以在输入框的可见区域中显示光标,但是当文本输入已满且溢出Firefox 3.0.7将正确定位的插入符号从右侧视图中移开(但如果按键盘上的右箭头,则可以在不打扰位置的情况下进行操作)。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:2)

请参阅我的回答this question。虽然它是相对kludgy,你可以触发FF中的按键事件,输入将滚动到结尾(显示你想看到它的插入符号)。

答案 1 :(得分:1)

我在FireFox的textarea中滚动到选区时遇到了类似的问题。我无法发送'空格'然后发送'退格'字符,因为这会覆盖textarea中的选择。因此,我找到了一种更好的方法,即在选择后立即重新输入字符,这将迫使选择显示。

以下是代码:

function setSelRange(inputEl, selStart, selEnd) { 
     if (inputEl.createTextRange) {
        var range = inputEl.createTextRange(); 
        range.collapse(true); 
        range.moveEnd('character', selEnd); 
        range.moveStart('character', selStart); 
        range.select(); 
        //range.scrollIntoView();
    } else if (inputEl.setSelectionRange) {
        inputEl.focus(); 
        inputEl.setSelectionRange(selEnd, selEnd + 1);
        // ---- Firefox Workaround ----
        // Send a virtual key, which is the character immediately after the 
        // selected text. It justs rewrites the same character so that no unnecessary changes
        // are made to the content.
        // When the selection is at the end of the textarea, an extra space is appended
        // because the inputEl.value.charCodeAt(selEnd) would otherwise cause an error.
        var evt = document.createEvent("KeyboardEvent");
        if (inputEl.value.length == selEnd) {
            evt.initKeyEvent("keypress", true, true, null, false, false, false, false, 0, 32);
        } else {
            evt.initKeyEvent("keypress", true, true, null, false, false, false, false, 0, inputEl.value.charCodeAt(selEnd));
        }
        inputEl.dispatchEvent(evt);
        inputEl.setSelectionRange(selStart, selEnd);

    } 
}

希望这有助于任何一直在寻找此事的人。我浪费了很多时间试图解决这个问题。

答案 2 :(得分:0)

谢谢,这对我有用jtompson。将它与现有脚本相结合,将插入符号移动到textinput或textarea的末尾,似乎涵盖了IE7,FF3和chrome。

    function setCaretPosition(elemId, caretPos) {
        var elem = document.getElementById(elemId);

    if(elem != null) {
        if(elem.createTextRange) {
            var range = elem.createTextRange();
            range.move('character', caretPos);
            range.select();
        }
        else {
            if(elem.selectionStart) {
                elem.setSelectionRange(caretPos, caretPos);
                elem.focus();
                // Workaround for FF overflow no scroll problem
                // Trigger a "space" keypress.
                var evt = document.createEvent("KeyboardEvent");
                evt.initKeyEvent("keypress", true, true, null, false, false, false, false, 0, 32);
                elem.dispatchEvent(evt);
                // Trigger a "backspace" keypress.
                evt = document.createEvent("KeyboardEvent");
                evt.initKeyEvent("keypress", true, true, null, false, false, false, false, 8, 0);
                elem.dispatchEvent(evt);
            }
            else
                elem.focus();
        }
    }
}
 setCaretPosition(document.getElementById("searchinput").id, document.getElementById("searchinput").value.length);