代码之家  ›  专栏  ›  技术社区  ›  smfoote

如何防止光标/插入符号在输入文本元素中移动?

  •  2
  • smfoote  · 技术社区  · 16 年前

    我正在尝试构建一个表单,它的工作方式类似于Google搜索页面,以及Gmail和其他几个页面(包括this页面——请参阅Ask-Question页面上的“Tags”输入)。当输入文本时,将出现一个选项列表,用户可以使用上下箭头选择所需的选项。

    我遇到的问题是,向上箭头将光标/插入符号放在字段的0位置,向下箭头将光标/插入符号放在末尾。有没有一种简单的方法来防止它移到开头/结尾,或者我需要在函数运行之前找到插入符号的位置,然后将其重新定位到该位置?

    这是在输入元素(onkeyup)中输入文本时运行的函数的开头。

    var keycode = checkKeycode (event);   // returns the keycode of the key pressed.
    if (keycode == 38) {         // up arrow
        var selection = $(".optionsSelected").attr("id");
        var selId = parseInt(selection.replace('briefOption', ''));
        if (selId != 0) {
            $(".optionsSelected").removeClass("optionsSelected");
            var newSelId = selId - 1;
            $("#briefOption"+newSelId).addClass("optionsSelected");
        }
    }
    else if (keycode == 40) {     // down arrow
        var selection = $(".optionsSelected").attr("id");
        var selId = parseInt(selection.replace('briefOption', ''));
        if (selId != numAvEmps && numAvEmps != 0) {
            $(".optionsSelected").removeClass("optionsSelected");
            var newSelId = selId + 1;
            $("#briefOption"+newSelId).addClass("optionsSelected");
        }
    }
    else if (keycode == 27) {    // Escape
        $("#docDropDown").css("display","none");
    }
    else if (keycode == 9 || keycode == 13) {     //tab or enter
        /* Fill form */
    }
    

    让我知道如果有更多的代码将是有用的。谢谢你的帮助。

    2 回复  |  直到 16 年前
        1
  •  3
  •   TheCloudlessSky    16 年前

    您可能希望在之前存储插入符号,然后在完成操作后将其放回原位。

    像这样:

    <input type="text" id="mytextbox" style="border: 1px solid black" />
    

    Javascript代码:

    function getCaretPosition(ctrl)
    {
        var caretPos = 0;    
        // IE
        if (document.selection)
        {
            ctrl.focus ();
            var sel = document.selection.createRange();
            sel.moveStart ('character', -ctrl.value.length);
            caretPos = sel.text.length;
        }
        // Firefox
        else if (ctrl.selectionStart || ctrl.selectionStart == '0')
        {
            caretPos = ctrl.selectionStart;
        }
    
        return caretPos;
    }
    
    function setCaretPosition(ctrl, pos)
    {
        if(ctrl.setSelectionRange)
        {
            ctrl.focus();
            ctrl.setSelectionRange(pos,pos);
        }
        else if (ctrl.createTextRange)
        {
            var range = ctrl.createTextRange();
            range.collapse(true);
            range.moveEnd('character', pos);
            range.moveStart('character', pos);
            range.select();
        }
    }
    
    
    
    $(document).ready(function ()
    {
    
        $("#mytextbox").keydown(function (e)
        {
            // Up
            if(e.which == 38)
            {
                var pos = getCaretPosition(this);
    
                // Do stuff here that changes the value/caret?
    
                setCaretPosition(this, pos);
            }
            // Down
            else if(e.which == 40)
            {
                var pos = getCaretPosition(this);
    
                // Do stuff here that changes the value/caret?
    
                setCaretPosition(this, pos);
            }
    
        });
    
    });
    
        2
  •  1
  •   Tim Down    16 年前

    只是阻止事件的默认操作。你可以通过返回 false addEventListener / attachEvent

    var input = document.getElementById("your_input");
    var suppressKeypress = false;
    
    input.onkeydown = function(evt) {
        evt = evt || window.event;
        var keyCode = evt.keyCode;
        if (keyCode == 38) {
            // Do your stuff here
            suppressKeypress = true; // For Opera; see below
            return false;
        }
        // Other cases here
    };
    
    // This bit is for Opera, which only allows you to suppress the default
    // action of a keypress in the keypress event (not keydown)
    input.onkeypress = function() {
        if (suppressKeypress) {
            suppressKeypress = false;
            return false;
        }
    };
    
    推荐文章