4

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

我已经搜索并找到了将插入符号聚焦和定位在更新的输入内容末尾的方法,并且 chrome 和 IE 会自动滚动以在输入框的可见区域显示光标,但是当文本输入是full and overflows Firefox 3.0.7 将正确定位的插入符号放在右侧的视野之外(尽管如果您按键盘上的右箭头,您可以在不影响位置的情况下到达它)。

任何帮助表示赞赏。

4

3 回答 3

2

请参阅我对这个问题的回答。虽然它比较笨拙,但您可以在 FF 中触发按键事件,输入将滚动到末尾(在您希望看到的位置显示插入符号)。

于 2009-03-27T15:28:21.780 回答
1

我在滚动到 FireFox 的文本区域中的选择时遇到了类似的问题。我无法发送“空格”然后是“退格”字符,因为这会覆盖文本区域中的选择。所以我找到了一种更好的方法,即在选择后立即虚拟地重新输入字符,这将强制选择可见。

这是代码:

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);

    } 
}

希望这可以帮助任何一直在寻找这个的人。我浪费了很多时间试图弄清楚这一点。

于 2009-09-23T23:24:11.053 回答
0

谢谢,这对我有用。将其与现有脚本相结合以将插入符号移动到 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);
于 2009-03-28T10:37:31.660 回答