HTML文本区域选项卡支持

时间:2012-05-04 21:15:36

标签: javascript html

我正在制作一个基于Web的代码编辑器,并使用textarea进行文本编辑。我想为textarea添加制表符支持,以便按Tab键不会使元素散焦。 我的textarea定义如下:

<textarea id="codeEdit_txt" rows="50" cols="80" onkeydown="return codeEdit_keyDown(event);">

和函数codeEdit_keyDown定义为:

function codeEdit_keyDown(e) {
    if (e.keyCode == 9) {
        return false;
    }
}

这可以防止Tab键按下使textarea失焦,尽管它不会留下Tab键。虽然我最初试图让它工作,但我注意到如果我将函数定义如下,它会在光标位置放置一个制表符。

function codeEdit_keyDown(e) {
    if (e.keyCode == 9) {
        alert("");
        return false;
    }
}

我的两个问题是:

  1. 为什么添加警报会导致添加标签?
  2. 有没有办法在光标处添加标签而无需找到光标 位置,拆分texarea中的文本并手动添加选项卡 字符(每次用户按下标签时都不需要提醒)?
  3. 由于

    编辑:这似乎只适用于Chrome,而不适用于IE,Safari或Firefox

2 个答案:

答案 0 :(得分:2)

看到这个问题:

https://stackoverflow.com/a/13130/420001

您正在寻找.preventDefault();

编辑fiddle

编辑2:感谢fiddle更好rainecc

答案 1 :(得分:0)

另一个答案很好,但是它在选项卡末尾结束。 我查看了如何在光标位置添加选项卡,并将其添加到解决方案中。

您可以在这里找到工作代码:http://jsfiddle.net/felixc/o2ptfd5z/9/

内联代码作为保障:

		function insertAtCursor(myField, myValue) {
			//IE support
			if (document.selection) {
				myField.focus();
				sel = document.selection.createRange();
				sel.text = myValue;
			}
			//MOZILLA and others
			else if (myField.selectionStart || myField.selectionStart == '0') {
				var startPos = myField.selectionStart;
				var endPos = myField.selectionEnd;
				myField.value = myField.value.substring(0, startPos)
					+ myValue
					+ myField.value.substring(endPos, myField.value.length);
				myField.selectionStart = startPos + myValue.length;
				myField.selectionEnd = startPos + myValue.length;
			} else {
				myField.value += myValue;
			}
		}	

		function addTabSupport(elementID, tabString) {
			// Get textarea element
			var myInput = document.getElementById(elementID);

			// At keydown: Add tab character at cursor location
			function keyHandler(e) {
				var TABKEY = 9;
				if(e.keyCode == TABKEY) {
					insertAtCursor(myInput, tabString);
					if(e.preventDefault) {
						e.preventDefault();
					}
					return false;
				}
			}			

			// Add keydown listener
			if(myInput.addEventListener ) {
				myInput.addEventListener('keydown',keyHandler,false);
			} else if(myInput.attachEvent ) {
				myInput.attachEvent('onkeydown',this.keyHandler); /* damn IE hack */
			}
		}
    
    // easily add tab support to any textarea you like
    addTabSupport("input", "\t");
<h1>Click in the text and hit tab</h1>

<textarea id="input" rows=10 cols=50>function custom(data){
	return data;
}</textarea>