您可以在 keypress 和 keydown 上收听文档击键。
// handle "printable" keys by listening for keypress
$(document).on('keypress',(function(e){ ... }));
// handle control keys like backspace by listening for keydown
$(document).on('keydown',(function(e){ ... }));
然后在描边时将每个可打印键添加到 Kinetic.Text 对象。
您还可以在退格时删除最后一个字符。
这是示例代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Prototype</title>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script src="http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v4.7.2.min.js"></script>
<style>
body{padding:20px;}
#container{
border:solid 1px #ccc;
margin-top: 10px;
width:350px;
height:350px;
}
</style>
<script>
$(function(){
var stage = new Kinetic.Stage({
container: 'container',
width: 350,
height: 350
});
var layer = new Kinetic.Layer();
stage.add(layer);
// this variable holds the current text
var typedText="";
// create a text object
var text = new Kinetic.Text({
x: 20,
y: 30,
fontSize: 30,
text: "",
fontFamily: 'Calibri',
fill: 'green'
});
layer.add(text);
layer.draw();
// listen for keys
// get the usual "printable" keys
$(document).on('keypress',(function(e){
// get the key
key=e.which;
// let keydown handle control keys
if(key<32){return;}
// add the typed character
typedText+=String.fromCharCode(e.charCode);
text.setText(typedText);;
layer.drawScene();
}));
// handle control keys like backspace
$(document).on('keydown',(function(e){
// get the key
var key=event.which;
// Let keypress handle displayable characters
if(key>46){ return; }
// handle the backspace
// (and any other control keys you want to program)
switch(key){
case 8: //backspace:
if(typedText.length>0){
typedText=typedText.slice(0,-1);
text.setText(typedText);;
layer.drawScene();
}
break;
default:
break;
}
}));
}); // end $(function(){});
</script>
</head>
<body>
<p>Type...(and use the backspace)!</p>
<div id="container"></div>
</body>
</html>
[这里是如何将基本文本编辑器添加到 html 画布的概述]
虽然这可行(我在几个项目中都有),但当您需要基本的文本编辑器时,我建议您在画布上浮动一个 html 文本区域。
所以......根据我更好的判断,这里是如何将画布变成文本编辑器......
定义一些与文本相关的变量:
- theText(字符串):当前文本,
- tabLength(数字):标签中的空格数,
- cursorIndex(数字):光标在文本中的字符位置,
在按键处理程序中侦听用户的“可打印”击键:
- Event.which 有数字键码
- 如果 Event.which >= 32,则 key 是可打印的,所以将它添加到 theText
- 如果文本已添加字符,则前进 cursorIndex++
在 keydown 中监听用户的命令击键并做出相应的响应:
- 退格:删除文本中的最后一个字符,
- 制表符:将空格*tabLength 附加到文本,
- 结束:cursorIndex=theText.length,
- 主页:cursorIndex=0,
- 左:cursorIndex--,
- 右:cursorIndex++,
- 删除:删除光标索引处的字符
管理游标:
- 使用 context.measureText 获取 theText 中 cursorIndex 处的 XY,
- 响应用户输入的可打印字符,推进 cursorIndex,
- 重新定位 cursorIndex 以响应用户输入的命令键,
- 使用 requestAnimationFrame 在 cursorIndex 处绘制闪烁的光标,