问题描述:
项目使用FlashMX作为前台开发,后台使用JavaServlet,通过XML传递数据的。其中A画面中有一个ComboBox实例,该组件每次改变后都要求画面重新计算,同时为方便客户键盘操作,项目中所有ComboBox实例在focusIn时均自动调用open方法展开下拉。问题是,每次focusIn后使用上下键控制选项,选中后直接Tab键提交,此时,ComboBox中的选择内容变化了,但却非常遗憾并未触发change事件。
演示代码(异常):
新建一个FlashDocument文档,拖入ComboBox组件,并命名为cmb1,用于测试;拖入一个TextArea并命名为txt1,用于记录log信息;在第一帧加入:
this.cmb1.addEventListener("focusIn", this);
this.cmb1.addEventListener("change",this);
function change(evt){
this.txt1.text = this.cmb1.selectedIndex + " has been selected./r" + this.txt1.text;
}
function focusIn(evt) {
this.cmb1.open();
this.cmb1.addEventListener("change",this);
function change(evt){
this.txt1.text = this.cmb1.selectedIndex + " has been selected./r" + this.txt1.text;
}
function focusIn(evt) {
this.cmb1.open();
}
Ctrl+F10发布,通过html文件测试,焦点进入cmb1后下拉打开,上下键变化选择项后直接按Tab键后发现选项改变了,但txt1中并无log(change事件未被触发)。
解决方法:
将代码作如下修改:
/***************************
* 杨国清@上海
* 2005/06/21
***************************/
setComboBoxStyle(this.cmb1);
this.cmb1.addEventListener("change",this);
function change(evt){
this.txt1.text = this.cmb1.selectedIndex + " has been selected./r" + this.txt1.text;
_menIndex = this.cmb1.selectedIndex;
}
function setComboBoxStyle(objBox:Object):Void {
var objListener : Object = new Object();
objBox.addEventListener("focusIn",objListener);
objBox.addEventListener("change",objListener);
objBox.addEventListener("focusOut",objListener);
objListener.focusIn = function(evt) {
evt.target.open();
objListener["memSelected"] = evt.target.selectedIndex;
}
objListener.change = function(evt) {
objListener["memSelected"] = evt.target.selectedIndex;
}
objListener.focusOut = function(evt) {
if(evt.target.selectedIndex != objListener["memSelected"]){
evt.target.dispatchEvent({type:"change",target:evt.target});
}
}
}
setComboBoxStyle(this.cmb1);
this.cmb1.addEventListener("change",this);
function change(evt){
this.txt1.text = this.cmb1.selectedIndex + " has been selected./r" + this.txt1.text;
_menIndex = this.cmb1.selectedIndex;
}
function setComboBoxStyle(objBox:Object):Void {
var objListener : Object = new Object();
objBox.addEventListener("focusIn",objListener);
objBox.addEventListener("change",objListener);
objBox.addEventListener("focusOut",objListener);
objListener.focusIn = function(evt) {
evt.target.open();
objListener["memSelected"] = evt.target.selectedIndex;
}
objListener.change = function(evt) {
objListener["memSelected"] = evt.target.selectedIndex;
}
objListener.focusOut = function(evt) {
if(evt.target.selectedIndex != objListener["memSelected"]){
evt.target.dispatchEvent({type:"change",target:evt.target});
}
}
}