在不改变焦点的情况下,在文本区域内选项卡,jQuery

时间:2010-12-07 17:18:09

标签: javascript jquery

鉴于textarea,有没有办法使用jQuery来启用人们使用“tab”键的能力,实际上..插入一个标签,而不是将焦点跳到页面上的下一个表单元素?

我已经关注Capturing TAB key in text box虽然这确实有效,但我希望尝试将其包装成一个jQuery插件,以使特定的文本框可以列表。问题是,我并不完全理解如何将这些“监听器”的概念应用于与jQuery相反的对象。

有没有人在我可以开始的地方有一些线索?

5 个答案:

答案 0 :(得分:20)

我刚刚编写了一个jQuery插件,可以在所有主流浏览器中使用。它使用keydownkeypress将事件侦听器绑定到一组元素。事件侦听器会阻止 Tab 键的默认行为,而keydown侦听器也会在插入符/选择处手动插入制表符。

这里有效:http://www.jsfiddle.net/8segz/

以下是一个使用示例:

$(function() {
    $("textarea").allowTabChar();
});

这是插件代码:

(function($) {
    function pasteIntoInput(el, text) {
        el.focus();
        if (typeof el.selectionStart == "number") {
            var val = el.value;
            var selStart = el.selectionStart;
            el.value = val.slice(0, selStart) + text + val.slice(el.selectionEnd);
            el.selectionEnd = el.selectionStart = selStart + text.length;
        } else if (typeof document.selection != "undefined") {
            var textRange = document.selection.createRange();
            textRange.text = text;
            textRange.collapse(false);
            textRange.select();
        }
    }

    function allowTabChar(el) {
        $(el).keydown(function(e) {
            if (e.which == 9) {
                pasteIntoInput(this, "\t");
                return false;
            }
        });

        // For Opera, which only allows suppression of keypress events, not keydown
        $(el).keypress(function(e) {
            if (e.which == 9) {
                return false;
            }
        });
    }

    $.fn.allowTabChar = function() {
        if (this.jquery) {
            this.each(function() {
                if (this.nodeType == 1) {
                    var nodeName = this.nodeName.toLowerCase();
                    if (nodeName == "textarea" || (nodeName == "input" && this.type == "text")) {
                        allowTabChar(this);
                    }
                }
            })
        }
        return this;
    }
})(jQuery);

答案 1 :(得分:4)

尝试这个简单的jQuery函数:

$.fn.getTab = function () {
    this.keydown(function (e) {
        if (e.keyCode === 9) {
            var val = this.value,
                start = this.selectionStart,
                end = this.selectionEnd;
            this.value = val.substring(0, start) + '\t' + val.substring(end);
            this.selectionStart = this.selectionEnd = start + 1;
            return false;
        }
        return true;
    });
    return this;
};

$("textarea").getTab();
// You can also use $("input").getTab();

答案 2 :(得分:3)

让你的插件做这样的事情:

$(inputElementSelector).keypress(function(event) {
    if (event.keyCode == 9) {
        //enter your tab behavior here
    }
}

答案 3 :(得分:2)

将此函数传递给jQuery选择器,该选择器匹配要启用Tab字符的元素。例如:BindTabKeyAsCharacter(“。about_us textarea”);

function BindTabKeyAsCharacter(selector) {
    $(document).ready(function () {
        $(selector).each(function () {
            $(this).keydown(function () {
                var e = (window.event) ? event : e;
                if (e.keyCode == 9) { // Tab
                    if (window.event) {
                        window.event.returnValue = false;
                    }
                    else {
                        if (e.cancelable) { e.preventDefault(); }
                    }
                    var before, after;
                    if (document.selection) {
                        this.selection = document.selection.createRange();
                        this.selection.text = String.fromCharCode(9);
                    } else {
                        before = this.value.substring(0, this.selectionStart);
                        after = this.value.substring(this.selectionEnd,     this.value.length);
                        this.value = before + String.fromCharCode(9) + after;
                    }
                    var newCursorPos = before.length + String.fromCharCode(9).length;
                    if (this.setSelectionRange) {
                        this.focus();
                        this.setSelectionRange(newCursorPos, newCursorPos);
                    } else if (this.createTextRange) {
                        var range = this.createTextRange();
                        range.collapse(true);
                        range.moveEnd('character', newCursorPos);
                        range.moveStart('character', newCursorPos);
                        range.select();
                    }
                }
            });
        });
    });
}

答案 4 :(得分:0)

来自 Tim Down 的代码:我在我的项目中使用它并得到一个奇怪的错误。当我在行的开头插入一个简单空格时,内容在提交后不会更新。我在textareas项目中获得了很多jQuery和Ajax代码。但是preventDefault()解决了我的错误:

...
function allowTabChar(el) {
    $(el).keydown(function(e) {
        if (e.which == 9) {
            pasteIntoInput(this, \"\t\");
            e.preventDefault();  // <- I had to add this
            $(el).change();      // To fire change event for my Ajax Code
            return false;
        }
    });
 ...