Apache flex Flex选项卡导航器选项卡按钮未触发单击事件

Apache flex Flex选项卡导航器选项卡按钮未触发单击事件,apache-flex,event-listener,tabnavigator,Apache Flex,Event Listener,Tabnavigator,我有一个TabNavigator,我正试图让它像Firefox一样工作,因为最后一个选项卡是一个特殊的+选项卡,它向控件添加了一个新选项卡。为此,我向第一个选项卡的按钮添加了一个事件处理程序,我使用tabNavigator.getTabAt0.AddEventListenerMouseeEvent.CLICK、clickFunction、false、int.MAX_VALUE、false获取该按钮。我将优先级设置为int.MAX_值,这样我的方法应该是第一个被调用的方法,然后可以使用stopIm

我有一个TabNavigator,我正试图让它像Firefox一样工作,因为最后一个选项卡是一个特殊的+选项卡,它向控件添加了一个新选项卡。为此,我向第一个选项卡的按钮添加了一个事件处理程序,我使用tabNavigator.getTabAt0.AddEventListenerMouseeEvent.CLICK、clickFunction、false、int.MAX_VALUE、false获取该按钮。我将优先级设置为int.MAX_值,这样我的方法应该是第一个被调用的方法,然后可以使用stopImmediatePropagation阻止其他处理程序被调用

我的问题是,我的点击处理程序没有被调用,而是正常的逻辑运行,+选项卡切换到

CustomTab的代码我删除了很多专有代码:

private var addTab:Function = null;
private var tabCreationAllowed:Boolean = true;

private function onCreationCompleted():void {
    var tabButton:Button = getTab(0);
    Container(getChildAt(0)).setStyle("closable", false);
    tabButton.addEventListener(MouseEvent.CLICK, clickFunction, false, int.MAX_VALUE, false);
    tabButton.addEventListener(MouseEvent.DOUBLE_CLICK, function(event:MouseEvent):void {event.stopImmediatePropagation(); }, false, int.MAX_VALUE, false);
}

private function clickFunction(event:MouseEvent):void {
    event.stopImmediatePropagation();
    if (this.tabCreationAllowed && (this.addTab != null) && (event.eventPhase == EventPhase.AT_TARGET)) {
        this.tabCreationAllowed = false;
        this.addTab();
        var $this:CustomTab = this;
        setTimeout(function ():void {
            $this.tabCreationAllowed = true;
        }, 1500);
    }
}

在尝试了许多不同的方法之后,我能说的最好的问题是,TabNavigator用来创建选项卡按钮的TabBar可以切换按钮的功能,甚至可以删除和添加,但只有在添加或删除选项卡时。为了解决这个问题,我将+按钮存储在一个类变量中。然后我重写所有的add和remove方法。在每个选项卡上,我调用一个方法,该方法从按钮中删除所有事件侦听器,如果有,将变量设置为最后一个选项卡的按钮,即+选项卡,然后重新添加侦听器

最终代码的精简版本:

private var addTab:Function = null;  
private var tabCreationAllowed:Boolean = true;  
private var addTabButton:Button = null;

private function prerAddTabButton():void {
    if (addTabButton != null) {
        addTabButton.removeEventListener(MouseEvent.CLICK, clickFunction);
        addTabButton.removeEventListener(MouseEvent.DOUBLE_CLICK, doubleClickFunction);
    }
    addTabButton = getTabAt(numChildren - 1);
    addTabButton.addEventListener(MouseEvent.CLICK, clickFunction, false, int.MAX_VALUE, false);  
    addTabButton.addEventListener(MouseEvent.DOUBLE_CLICK, doubleClickFunction, false, int.MAX_VALUE, false);  
}

private function onCreationCompleted():void {  
    var tabButton:Button = getTab(0);  
    Container(getChildAt(0)).setStyle("closable", false);
    prerAddTabButton();
}  

private function doubleClickFunction(event:MouseEvent):void {
    event.stopImmediatePropagation(); 
}

private function clickFunction(event:MouseEvent):void {  
    event.stopImmediatePropagation();  
    if (this.tabCreationAllowed && (this.addTab != null) && (event.eventPhase == EventPhase.AT_TARGET)) {  
        this.tabCreationAllowed = false;  
        this.addTab();  
        var $this:CustomTab = this;  
        setTimeout(function ():void {  
            $this.tabCreationAllowed = true;  
        }, 1500);  
    }  
}

如果它像Firefox一样工作,那么选项卡将添加到+选项卡之前的左侧,这可能会增加tabNavigator中该选项卡的索引。现在,要获得+选项卡,必须使用tabNavigator.gettab1。有可能是这样吗?如果没有,你能发布一些源代码吗?我的代码不应该有这个问题,尽管这是我的想法。问题是,如果是这样的话,这将永远不会起作用,现在它有时会起作用。我已经发布了更完整的代码。如何将切换到事件侦听器添加到选项卡?与其依赖于停止事件,不如不要将该事件侦听器添加到+选项卡。切换到事件是TabNavgator的一部分,所以它添加了它,而不是我,而TabNavigator是Flex附带的mx库的一部分。哦,糟了。很抱歉尝试添加event.preventDefault;事件发生后。停止立即复制;。