【问题标题】:Adobe Flex Prevent Double ClickAdobe Flex 防止双击
【发布时间】:2010-05-11 15:44:11
【问题描述】:

我有一个 adobe flex 数据网格,其中一列中有一个简单的自定义标签 itemrenderer。单击 itemrenderer 会触发 cairngorm 事件,这会导致进行服务调用,并且来自服务调用的数据会填充 TitleWindow。

即使我已将 doubleClickedEnabled 属性设置为 false,有时仍然可以双击项目渲染器,导致进行两次服务调用,并显示两个 TitleWindows。在其他情况下,三次单击似乎也会触发不良结果。

有什么方法可以防止这种行为吗?

【问题讨论】:

    标签: apache-flex datagrid double-click


    【解决方案1】:

    跟踪您何时获得点击事件,如果您在一定时间内(250 毫秒)获得两个点击事件,则忽略第二个。

    var lastTime:Date = new Date(0);
    
    function OnClickHandler(event:Event):void {
        if ((new Date()).time - lastTime.time < 250) {
            return;
        }
        lastTime = new Date();
        ...
    }
    

    【讨论】:

    • 我非常喜欢这种方法,因为我可以将它扩展到所有服务调用。我创建了一个可绑定的 ServiceModel 单例,它在每次进行服务调用时存储 lastTime、方法和服务。然后我修改了 baseDelegate 以针对当前服务调用检查 ServiceModel 参数(lastTime、method、service) - 如果它的方法和服务名称相同,并且时间小于 500 毫秒,则不处理它。您认为这有什么问题吗?
    • @JonoB,如果有正当理由在循环中调用相同的服务方法,这可能是个问题。将此与有正当理由在 250 毫秒内多次单击链接的用户进行对比,似乎在事件处理程序上执行此操作会更好。
    • 在我的应用程序中没有发生在 250 或 500 毫秒内从同一客户端发出相同服务调用的情况。如果有,那么它可能是一个错误!循环中肯定没有服务调用。我在我的应用程序的很多地方也有这些单击链接,我真的不想去为每个链接创建一个事件处理程序。
    【解决方案2】:

    好的,我知道这是旧的,但防止双击事件的最简单方法是为按钮设置 doubleClickEnabled = "true" 并且不为 doubleClick 事件分配任何功能。因此,该按钮识别第二次点击,但不调度单次点击事件。希望这是有道理的 - 我已经对此进行了测试并为我工作:)

    【讨论】:

      【解决方案3】:
      // class variable section
      var lastTime:Date = null;
      
      ...
      
      function handler(evt:Event):void{
          var currentTime = new Date();
          if (lastTime === null){
               lastTime = currentTime;
          } else {
               var diff = currentTime.milliseconds() - lastTime.milliseconds();
               if (diff <= 250) // try some other intervals to get best result for you.
                   return;
               else 
                   lastTime = currentTime;
          }
          ... the rest of your code.
      }
      

      【讨论】:

      • 不。 首先,这是一个简单任务的大量代码。简化。 第二milliseconds会返回当前的毫秒分量,而不是总毫秒,不会达到要求的结果。 第三milliseconds是属性,不是方法,所以没有括号。
      【解决方案4】:

      最好的方法是在你的 itemRenderer 中设置一个标志,以表明它已经被点击过一次。这可以防止它发送另一个 cairngorm 事件,直到返回第一个事件的结果,此时您重置标志,使其能够再次被点击。

      为简洁起见,以下代码假定一切都在同一范围内发生。如果不是,您将不得不从其他上下文向 itemRender 发送和接收事件。

      [Bindable]
      var _clickEnabled:Boolean = true;
      
      private function doClickStuff() : void {
        if (_clickEnabled) {
          // fire your event
          _clickEnabled = false;
        } 
      }
      
      private function onEventReturnHandler(event:Event) : void {
        // do whatever it is you're going to do
        _clickEnabled = true;
      }
      

      【讨论】:

        【解决方案5】:

        防止双击发送两个服务调用的更简单的解决方案是启用双击并让双击事件调用与单击事件相同的处理程序。

        <s:Button label="Button"
                  click="clickHandler()"
                  doubleClick="clickHandler()"
                  doubleClickEnabled="true" />
        

        当然,这并不能阻止三次点击,但这是一个不太常见的问题。

        【讨论】:

          猜你喜欢
          • 2019-02-05
          • 2011-09-11
          • 2016-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-11
          • 2014-10-01
          • 2018-06-14
          相关资源
          最近更新 更多