TextFlow 内的链接:rollOver/rollOut 冒泡,不应该冒泡,并且无法避免

发布于 2024-11-08 22:36:34 字数 4398 浏览 2 评论 0原文

我有一个奇怪的行为。我在 TextFlow 中有一个 HTML 链接。当我设置其 linkHoverFormat 时,它开始向链上发送 rollOver/rollOut 事件。这些事件表明它们不会冒泡,但不知何故它们确实发生了。我似乎无法阻止他们这样做。

下面是一个示例:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication 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:Declarations>
    <s:TextLayoutFormat id="linkNormal" textDecoration="none" color="0x556677"/>  
    <s:TextLayoutFormat id="linkHover" textDecoration="underline" color="0x0000FF"/>
    <s:TextFlow id="textFlow1" 
                linkActiveFormat="{linkHover}" 
                linkHoverFormat="{linkHover}"
                linkNormalFormat="{linkNormal}">
      <s:p> <s:a href="http://projects.nunogodinho.com">hover</s:a> </s:p>
    </s:TextFlow>
  </fx:Declarations>

  <fx:Script>
    <![CDATA[

      // This pair of handlers is triggered by the panel
      protected function rollOverHandler(e:MouseEvent):void {
        panel.title = "over";
      }
      protected function rollOutHandler(e:MouseEvent):void {
        panel.title = "out";
      }

    ]]>
  </fx:Script>

  <s:Panel left="10" top="10" id="panel" mouseOver="rollOverHandler(event)" mouseOut="rollOutHandler(event)">
    <s:RichEditableText id="ret1"
                        top="10"
                        editable="false"
                        textFlow="{textFlow1}" />
  </s:Panel>

</s:WindowedApplication>

如果您运行此应用程序并将鼠标在链接上移动几次而不移出面板,您将看到它仍然会更改文本。

所以我决定尝试阻止这个奇怪的事件冒泡:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication 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:Declarations>
    <s:TextLayoutFormat id="linkNormal" textDecoration="none" color="0x556677"/>  
    <s:TextLayoutFormat id="linkHover" textDecoration="underline" color="0x0000FF"/>
    <s:TextFlow id="textFlow2" 
                linkActiveFormat="{linkHover}" 
                linkHoverFormat="{linkHover}"
                linkNormalFormat="{linkNormal}">
      <s:p> <s:a rollOver="linkelement2_rollOverHandler(event)" rollOut="linkelement2_rollOutHandler(event)" href="http://projects.nunogodinho.com">hover</s:a> </s:p>
    </s:TextFlow>
  </fx:Declarations>

  <fx:Script>
    <![CDATA[
      import flashx.textLayout.events.FlowElementMouseEvent;

      // This pair of handlers is triggered by the panel
      protected function rollOverHandler(e:MouseEvent):void {
        panel.title = "over";
      }
      protected function rollOutHandler(e:MouseEvent):void {
        panel.title = "out";
      }

      // This pair of handlers is triggered by the <A> element inside textFlow2
      // and I hoped it would stop the event from bubbling up to the panel
      protected function linkelement2_rollOverHandler(e:FlowElementMouseEvent):void {
        e.preventDefault();
        e.stopImmediatePropagation();
        e.stopPropagation()
      }
      protected function linkelement2_rollOutHandler(e:FlowElementMouseEvent):void {
        e.preventDefault();
        e.stopImmediatePropagation();
        e.stopPropagation()
      }

      // I also tried to intercept the event in the RichEditableText but got the same weird
      // behavior: the event triggers the panel's rollOver/rollOut intermittently


    ]]>
  </fx:Script>

  <s:Panel left="10" top="10" id="panel" mouseOver="rollOverHandler(event)" mouseOut="rollOutHandler(event)">
    <s:RichEditableText top="10" left="55"
                        editable="false"
                        textFlow="{textFlow2}" />
  </s:Panel>

</s:WindowedApplication>

我尝试了 preventDefaultstopImmediatePropagationstopPropagation 的所有组合。它确实改变了事件的行为,但也破坏了链接上的悬停效果。

然后我尝试在 RichEditableText 处拦截该事件,但得到了相同的结果。

有一次我遇到了类似的问题,但我了解到这是因为我使用了 mouseOver/mouseOut 事件而不是 rollOver/rollOut。自从我切换到 rollOver/rollOut 后,它工作得很好。到目前为止。

而现在我却一无所知。

请帮忙。

谢谢。

I'm having a weird behavior. I have an HTML link inside a TextFlow. When I set its linkHoverFormat, it starts sending rollOver/rollOut events up the chain. These events say the don't bubble but somehow they do. And I can't seem to stop them from doing so.

Here's an example:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication 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:Declarations>
    <s:TextLayoutFormat id="linkNormal" textDecoration="none" color="0x556677"/>  
    <s:TextLayoutFormat id="linkHover" textDecoration="underline" color="0x0000FF"/>
    <s:TextFlow id="textFlow1" 
                linkActiveFormat="{linkHover}" 
                linkHoverFormat="{linkHover}"
                linkNormalFormat="{linkNormal}">
      <s:p> <s:a href="http://projects.nunogodinho.com">hover</s:a> </s:p>
    </s:TextFlow>
  </fx:Declarations>

  <fx:Script>
    <![CDATA[

      // This pair of handlers is triggered by the panel
      protected function rollOverHandler(e:MouseEvent):void {
        panel.title = "over";
      }
      protected function rollOutHandler(e:MouseEvent):void {
        panel.title = "out";
      }

    ]]>
  </fx:Script>

  <s:Panel left="10" top="10" id="panel" mouseOver="rollOverHandler(event)" mouseOut="rollOutHandler(event)">
    <s:RichEditableText id="ret1"
                        top="10"
                        editable="false"
                        textFlow="{textFlow1}" />
  </s:Panel>

</s:WindowedApplication>

If you run this app and move the mouse over the link several times without moving out of the panel you'll see that it still changes the text.

So I decided to try to stop this strange event from bubbling:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication 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:Declarations>
    <s:TextLayoutFormat id="linkNormal" textDecoration="none" color="0x556677"/>  
    <s:TextLayoutFormat id="linkHover" textDecoration="underline" color="0x0000FF"/>
    <s:TextFlow id="textFlow2" 
                linkActiveFormat="{linkHover}" 
                linkHoverFormat="{linkHover}"
                linkNormalFormat="{linkNormal}">
      <s:p> <s:a rollOver="linkelement2_rollOverHandler(event)" rollOut="linkelement2_rollOutHandler(event)" href="http://projects.nunogodinho.com">hover</s:a> </s:p>
    </s:TextFlow>
  </fx:Declarations>

  <fx:Script>
    <![CDATA[
      import flashx.textLayout.events.FlowElementMouseEvent;

      // This pair of handlers is triggered by the panel
      protected function rollOverHandler(e:MouseEvent):void {
        panel.title = "over";
      }
      protected function rollOutHandler(e:MouseEvent):void {
        panel.title = "out";
      }

      // This pair of handlers is triggered by the <A> element inside textFlow2
      // and I hoped it would stop the event from bubbling up to the panel
      protected function linkelement2_rollOverHandler(e:FlowElementMouseEvent):void {
        e.preventDefault();
        e.stopImmediatePropagation();
        e.stopPropagation()
      }
      protected function linkelement2_rollOutHandler(e:FlowElementMouseEvent):void {
        e.preventDefault();
        e.stopImmediatePropagation();
        e.stopPropagation()
      }

      // I also tried to intercept the event in the RichEditableText but got the same weird
      // behavior: the event triggers the panel's rollOver/rollOut intermittently


    ]]>
  </fx:Script>

  <s:Panel left="10" top="10" id="panel" mouseOver="rollOverHandler(event)" mouseOut="rollOutHandler(event)">
    <s:RichEditableText top="10" left="55"
                        editable="false"
                        textFlow="{textFlow2}" />
  </s:Panel>

</s:WindowedApplication>

I tried all combinations of preventDefault, stopImmediatePropagation and stopPropagation. It does change the event's behavior but it also ruins the hovering effect on the link.

Then I tried to intercept the event at the RichEditableText but I got the same kind of results.

Once I had a similar problem but I learned that it was because I was using mouseOver/mouseOut events instead of rollOver/rollOut. Since I switched to rollOver/rollOut it worked fine. Until now.

And now I'm clueless.

Please help.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文