之前弄的一个报告在线编辑器是支持 Markdown 的代码块的,但是我在写的时候有个很不爽的情况: 在编辑器里如果按下 Tab 会执行预设事件,也就是 focus 或 unfocus ,但是我只是想要让它空四格啊 QAQ ,所以我这个时候就上网找了点解决方案

首先,我们要先知道 Tab (为了方便,暂时用 4 个空格取代)是在现在的位置插入 4 个空格,所以首先我们要先找出如何让 JS 定位现在的光表位置並插入指令字串:

function insertAtCursor(myValue) {
	myField = document.getElementById("textarea");
	//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;
	}
}

有这个核心代码 ,剩下就简单啦,只要挂上一个 event listener 监听键盘,遇到 Tab 时就插入空格, Tab 的 KeyCode 是 9 ,所以用如下代码即可

document.getElementById('textarea').onkeydown = function(e){
	if (e.keyCode == 9) {
		insertAtCursor('    ');
		return false;
	}
}

现在在 id='textarea' 的编辑器里面按下 Tab ,应该会自己空四格了