|  | // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | // @dart = 2.9 | 
|  |  | 
|  |  | 
|  | part of touch; | 
|  |  | 
|  | /** | 
|  | * Common events related helpers. | 
|  | */ | 
|  | class EventUtil { | 
|  | /** | 
|  | * Add an event listener to an element. | 
|  | * The event callback is specified by [handler]. | 
|  | * If [capture] is true, the listener gets events on the capture phase. | 
|  | * If [removeHandlerOnFocus] is true the handler is removed when there is any | 
|  | * focus event, and added back on blur events. | 
|  | */ | 
|  | static void observe( | 
|  | /*Element or Document*/ element, Stream stream, Function handler, | 
|  | [bool removeHandlerOnFocus = false]) { | 
|  | var subscription = stream.listen(handler); | 
|  | // TODO(jacobr): this remove on focus behavior seems really ugly. | 
|  | if (removeHandlerOnFocus) { | 
|  | element.onFocus.listen((e) { | 
|  | subscription.cancel(); | 
|  | }); | 
|  | element.onBlur.listen((e) { | 
|  | subscription.cancel(); | 
|  | }); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Clear the keyboard focus of the currently focused element (if there is | 
|  | * one). If there is no currently focused element then this function will do | 
|  | * nothing. For most browsers this will cause the keyboard to be dismissed. | 
|  | */ | 
|  | static void blurFocusedElement() { | 
|  | Element focusedEl = document.querySelector("*:focus"); | 
|  | if (focusedEl != null) { | 
|  | focusedEl.blur(); | 
|  | } | 
|  | } | 
|  | } |