stopEventPropagation超出当前组件

时间:2011-03-29 16:14:35

标签: flex actionscript-3 flex3 flex4

我在spark Item Renderer中有一个TextInput。我需要通过对TextInput的mouseDown和mouseUp事件的stopPropagation来撤消我正在使用的库中的某些行为。但是,我希望TextInput本身能够正常处理这些事件 - 否则似乎没有正确处理光标转换的插入符号。我很惭愧地承认,我不知道该怎么做 - 看起来很简单,但我已经坚持了一段时间。

谢谢你!


编辑:好的,这里有一些代码可以解释发生了什么(尽管它与我正在做的完全无关,所以它并不是我具体情况的准确描述)。正如我上面提到的,我需要能够阻止mouseDown和mouseUp从TextInput传播到食物链中的组件 - mouseDown中的event.stopPropagation()和TextInput中的mouseUp。但是,它会弄乱TextInput本身的插入符/游标处理。无论有没有event.stopPropagation(),请尝试以下代码,你应该明白我的意思。

主要

<?xml version="1.0" encoding="utf-8"?>
<!-- http://blog.flexexamples.com/2009/03/19/using-a-custom-item-renderer-function-with-the-fxlist-control-in-flex-gumbo/ -->
<s:Application name="Spark_List_itemRendererFunction_test"
               xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx">

    <fx:Script>
        <![CDATA[
            import mx.core.ClassFactory;
            import spark.skins.spark.DefaultItemRenderer;

            private function list_itemRendererFunc(item:Object):ClassFactory {
                var cla:Class = DefaultItemRenderer;
                switch (item.type) {
                    case "employee":
                    case "manager":
                        cla = EmployeeItemRenderer;
                        break;
                    default:
                        break;
                }
                return new ClassFactory(cla);
            }
        ]]>
    </fx:Script>

    <s:List id="list"
            labelField="name"
            itemRendererFunction="list_itemRendererFunc"
            horizontalCenter="0" verticalCenter="0">
        <s:dataProvider>
            <s:ArrayList>
                <fx:Object name="Employee 1" type="employee" />
                <fx:Object name="Employee 2" type="employee" />
                <fx:Object name="Employee 3" type="employee" />
                <fx:Object name="Employee 4" type="employee" />
                <fx:Object name="Manager 1" type="manager" />
                <fx:Object name="Manager 2" type="manager" />
                <fx:Object name="Employee 5" type="employee" />
                <fx:Object name="Manager 3" type="manager" />
                <fx:Object name="Consultant 1" type="consultant" />
            </s:ArrayList>
        </s:dataProvider>
    </s:List>

</s:Application>

和EmployeeItemRenderer.mxml

<?xml version="1.0" encoding="utf-8"?>
<!-- http://blog.flexexamples.com/2009/03/19/using-a-custom-item-renderer-function-with-the-fxlist-control-in-flex-gumbo/ -->
<s:ItemRenderer name="EmployeeItemRenderer"
                xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark" 
                xmlns:mx="library://ns.adobe.com/flex/mx" 
                autoDrawBackground="true">

    <fx:Script>
        <![CDATA[
            protected function TI_mouseDownHandler(event:MouseEvent):void
            {
                event.stopPropagation();
            }

            protected function TI_mouseUpHandler(event:MouseEvent):void
            {
                event.stopPropagation();
            }

        ]]>
    </fx:Script>


    <s:HGroup>
        <s:Label id="labelDisplay" left="4" right="4" top="4" bottom="4" />
        <s:TextInput id="TI" mouseDown="TI_mouseDownHandler(event)" mouseUp="TI_mouseUpHandler(event)"/>
    </s:HGroup>

</s:ItemRenderer>

2 个答案:

答案 0 :(得分:0)

你能发布到目前为止你尝试过的内容吗?

我认为您需要做的就是为mouseDown,mouseUp和click事件注册监听器,然后使用http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/events/Event.html#stopPropagation()来阻止事件从currentTarget向父母进一步冒泡,stopImmediatePropagation将停止事件触发当前对象的侦听器。

肖恩

PS我会编辑,如果你发布一些代码,我可以澄清。

答案 1 :(得分:0)

好的,听起来这只是Flex 4.01的一个问题(谢谢JAX)。在这种情况下,我通过在mousedown事件上停止传播而不是在mouseUp上获得我想要的东西。这是一个非常具体的情况适用于我的代码,所以我不确定它是否对其他人真的有用。我想这里有趣的教训是,mouseUp是与插入符/系统游标管理相关的事件。