鉴于textarea,有没有办法使用jQuery来启用人们使用“tab”键的能力,实际上..插入一个标签,而不是将焦点跳到页面上的下一个表单元素?
我已经关注Capturing TAB key in text box虽然这确实有效,但我希望尝试将其包装成一个jQuery插件,以使特定的文本框可以列表。问题是,我并不完全理解如何将这些“监听器”的概念应用于与jQuery相反的对象。
有没有人在我可以开始的地方有一些线索?
答案 0 :(得分:20)
我刚刚编写了一个jQuery插件,可以在所有主流浏览器中使用。它使用keydown和keypress将事件侦听器绑定到一组元素。事件侦听器会阻止 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;
}
});
...