【问题标题】:stopEventPropagation beyond current componentstopEventPropagation 超出当前组件
【发布时间】:2011-03-30 01:09:08
【问题描述】:

我在 Spark 项目渲染器中有一个 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>

【问题讨论】:

  • 提供一些代码。如果您不向我们展示您想要的东西,我们不能认为它简单或困难。
  • JAX,如下所述,这是难以从项目中提取代码的情况之一。会尝试制造一些东西并发布它 - 我知道拥有代码会让事情变得更简单......
  • 好的,已发布代码。感谢您的帮助!
  • 对我来说工作正常。在 Windows 7 机器上尝试使用 Flex 4.1 和 4.5。你在 Mac 上?
  • Windows 7,Flex 4.01。就破坏性而言,迁移到 4.1 或 4.5 是否存在重大风险?

标签: apache-flex actionscript-3 flex3 flex4


【解决方案1】:

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

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

肖恩

PS 如果您发布一些代码,我会进行编辑,我可以澄清一下。

【讨论】:

  • 肖恩,感谢您的回复。我的代码完全符合您的要求,即我在此类处理程序中为 TextInput 和 event.stopPropagation() 提供了 mouseDown 和 mouseUp 处理程序。我认为这会阻止 TextInput 处理事件,从而阻止奇怪的插入符号行为(基本上,当悬停在 TextInput 之外时插入符号不会变成标准系统光标),但是由于您的澄清,我现在知道 TextInput实际上是正确处理事件。我现在完全不知道为什么这会产生如此有趣的插入符号行为。
  • 嘿 Fred 1) 多花一点时间回复:事件生命周期。 2)通过 mxml 在冒泡阶段(发布 uitextField 和发布 TextInput 以及当事件正在进行时)添加 eventListener 的方法是将 mouseDown 内联侦听器放在 HGroup 中。这不是我喜欢的方式:把它移到那里应该可以完成你想要的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-06
    • 2015-03-16
    • 2021-09-01
    • 1970-01-01
    • 2018-12-20
    • 2021-10-10
    • 2021-04-18
    • 1970-01-01
    相关资源
    最近更新 更多