十一月 25th, 2009

为TextField添加上tab缩进功能

JAse, as、flex, by army8735.

今天尝试为JAse的代码输入框添加tab缩进功能,华丽地失败了。仔细查阅下手册:

指定此对象是否遵循 Tab 键顺序。 如果该对象遵循 Tab 键顺序,值为 true;否则值为 false。 默认情况下,值为 false,但以下情况除外:

  • 对于 SimpleButton 对象,值为 true。
  • 对于具有 type = “input” 的 TextField 对象,值为 true。
  • 对于具有 buttonMode = true 的 Sprite 对象或 MovieClip 对象,值为 true。

原来如此,侦听TextField的按键事件,根本就判断不到是否是tab键,因为默认系统就屏蔽了。这样就无法改写默认响应方法,tab键变成了在按钮之间切换选择状态。

得儿,得罪不起你,去请你的上司吧。直接侦听stage的按键事件,改写其默认行为搞定。唯一有点不友好的地方是聚焦会先出现在按钮上,然后由改写的行为迅速回到输入框上并进行缩进。没办法,也只好这样了。

//全局侦听tag键,改变默认行为
addEventListener(Event.ADDED_TO_STAGE, function() {
	stage.addEventListener(KeyboardEvent.KEY_DOWN, function(event:KeyboardEvent):void {
		if (stage.focus == tf && event.keyCode == Keyboard.TAB) {
			saveInput();
			getSelection();
			//如果鼠标为选择区域,则先保存删除命令链
			if (left != right) {
				saveDelete();
			}
			//增加2个全角空格,增加输入命令链
			commandList.addCommand(new InputCommand(tf, tf.caretIndex, "\u3000\u3000"));
			tf.replaceSelectedText("\u3000\u3000");
			setIndex();
			focus();
		}
	});
	stage.addEventListener(KeyboardEvent.KEY_UP, function(event:KeyboardEvent):void {
		if (event.keyCode == Keyboard.TAB) {
			focus();
		}
	});
});

Back Top

回复自“为TextField添加上tab缩进功能”

  1. 有点疑问啊,第二次按tab键之后,焦点会从输入框直接回到之前输入代码的光标处吗?

  2. 啥意思?没看懂。

  3. @army8735: 好吧。。。我就随便问问。。

  4. 作者的功能我非常喜欢, 不过改变tab默认键序,对可参与性还是有影响的(accessiblity),default tab在导航也可提升可用性。所以权衡之下,才把缩进的功能给抹了吧(它对输入 可读性 的代码很有用)
    是不是可以考虑用组合键触发模式改变:
    1. 用一个状态变量控制当前tab键的模式
    2. 当focus 到 textfield or richeditor,添加监听器,监听组合控制
    3. 触发相应模式,based on combination input

    overall, nice job!

  5. @路人甲: 普通的textfield自然改变默认行为不大好,对于ide来说,基本上tab来表示代码缩进已经成为公约了,所以对于ide来说还是很必要的。

  1. 没有任何引用。

发表回复

Back Top