182 lines
5.5 KiB
JavaScript
182 lines
5.5 KiB
JavaScript
// Copyright 2007 The Closure Library Authors. All Rights Reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
/**
|
|
* @fileoverview This file contains a class to provide a unified mechanism for
|
|
* CLICK and enter KEYDOWN events. This provides better accessibility by
|
|
* providing the given functionality to a keyboard user which is otherwise
|
|
* would be available only via a mouse click.
|
|
*
|
|
* If there is an existing CLICK listener or planning to be added as below -
|
|
*
|
|
* <code>this.eventHandler_.listen(el, CLICK, this.onClick_);<code>
|
|
*
|
|
* it can be replaced with an ACTION listener as follows:
|
|
*
|
|
* <code>this.eventHandler_.listen(
|
|
* new goog.events.ActionHandler(el),
|
|
* ACTION,
|
|
* this.onAction_);<code>
|
|
*
|
|
*/
|
|
|
|
goog.provide('goog.events.ActionEvent');
|
|
goog.provide('goog.events.ActionHandler');
|
|
goog.provide('goog.events.ActionHandler.EventType');
|
|
goog.provide('goog.events.BeforeActionEvent');
|
|
|
|
goog.require('goog.events');
|
|
goog.require('goog.events.BrowserEvent');
|
|
goog.require('goog.events.EventTarget');
|
|
goog.require('goog.events.EventType');
|
|
goog.require('goog.events.KeyCodes');
|
|
goog.require('goog.userAgent');
|
|
|
|
|
|
|
|
/**
|
|
* A wrapper around an element that you want to listen to ACTION events on.
|
|
* @param {Element|Document} element The element or document to listen on.
|
|
* @constructor
|
|
* @extends {goog.events.EventTarget}
|
|
*/
|
|
goog.events.ActionHandler = function(element) {
|
|
goog.events.EventTarget.call(this);
|
|
|
|
/**
|
|
* This is the element that we will listen to events on.
|
|
* @type {Element|Document}
|
|
* @private
|
|
*/
|
|
this.element_ = element;
|
|
|
|
goog.events.listen(element, goog.events.ActionHandler.KEY_EVENT_TYPE_,
|
|
this.handleKeyDown_, false, this);
|
|
goog.events.listen(element, goog.events.EventType.CLICK,
|
|
this.handleClick_, false, this);
|
|
};
|
|
goog.inherits(goog.events.ActionHandler, goog.events.EventTarget);
|
|
|
|
|
|
/**
|
|
* Enum type for the events fired by the action handler
|
|
* @enum {string}
|
|
*/
|
|
goog.events.ActionHandler.EventType = {
|
|
ACTION: 'action',
|
|
BEFOREACTION: 'beforeaction'
|
|
};
|
|
|
|
|
|
/**
|
|
* Key event type to listen for.
|
|
* @type {string}
|
|
* @private
|
|
*/
|
|
goog.events.ActionHandler.KEY_EVENT_TYPE_ = goog.userAgent.GECKO ?
|
|
goog.events.EventType.KEYPRESS :
|
|
goog.events.EventType.KEYDOWN;
|
|
|
|
|
|
/**
|
|
* Handles key press events.
|
|
* @param {!goog.events.BrowserEvent} e The key press event.
|
|
* @private
|
|
*/
|
|
goog.events.ActionHandler.prototype.handleKeyDown_ = function(e) {
|
|
if (e.keyCode == goog.events.KeyCodes.ENTER ||
|
|
goog.userAgent.WEBKIT && e.keyCode == goog.events.KeyCodes.MAC_ENTER) {
|
|
this.dispatchEvents_(e);
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* Handles mouse events.
|
|
* @param {!goog.events.BrowserEvent} e The click event.
|
|
* @private
|
|
*/
|
|
goog.events.ActionHandler.prototype.handleClick_ = function(e) {
|
|
this.dispatchEvents_(e);
|
|
};
|
|
|
|
|
|
/**
|
|
* Dispatches BeforeAction and Action events to the element
|
|
* @param {!goog.events.BrowserEvent} e The event causing dispatches.
|
|
* @private
|
|
*/
|
|
goog.events.ActionHandler.prototype.dispatchEvents_ = function(e) {
|
|
var beforeActionEvent = new goog.events.BeforeActionEvent(e);
|
|
|
|
// Allow application specific logic here before the ACTION event.
|
|
// For example, Gmail uses this event to restore keyboard focus
|
|
if (!this.dispatchEvent(beforeActionEvent)) {
|
|
// If the listener swallowed the BEFOREACTION event, don't dispatch the
|
|
// ACTION event.
|
|
return;
|
|
}
|
|
|
|
|
|
// Wrap up original event and send it off
|
|
var actionEvent = new goog.events.ActionEvent(e);
|
|
try {
|
|
this.dispatchEvent(actionEvent);
|
|
} finally {
|
|
// Stop propagating the event
|
|
e.stopPropagation();
|
|
}
|
|
};
|
|
|
|
|
|
/** @override */
|
|
goog.events.ActionHandler.prototype.disposeInternal = function() {
|
|
goog.events.ActionHandler.superClass_.disposeInternal.call(this);
|
|
goog.events.unlisten(this.element_, goog.events.ActionHandler.KEY_EVENT_TYPE_,
|
|
this.handleKeyDown_, false, this);
|
|
goog.events.unlisten(this.element_, goog.events.EventType.CLICK,
|
|
this.handleClick_, false, this);
|
|
delete this.element_;
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
* This class is used for the goog.events.ActionHandler.EventType.ACTION event.
|
|
* @param {!goog.events.BrowserEvent} browserEvent Browser event object.
|
|
* @constructor
|
|
* @extends {goog.events.BrowserEvent}
|
|
*/
|
|
goog.events.ActionEvent = function(browserEvent) {
|
|
goog.events.BrowserEvent.call(this, browserEvent.getBrowserEvent());
|
|
this.type = goog.events.ActionHandler.EventType.ACTION;
|
|
};
|
|
goog.inherits(goog.events.ActionEvent, goog.events.BrowserEvent);
|
|
|
|
|
|
|
|
/**
|
|
* This class is used for the goog.events.ActionHandler.EventType.BEFOREACTION
|
|
* event. BEFOREACTION gives a chance to the application so the keyboard focus
|
|
* can be restored back, if required.
|
|
* @param {!goog.events.BrowserEvent} browserEvent Browser event object.
|
|
* @constructor
|
|
* @extends {goog.events.BrowserEvent}
|
|
*/
|
|
goog.events.BeforeActionEvent = function(browserEvent) {
|
|
goog.events.BrowserEvent.call(this, browserEvent.getBrowserEvent());
|
|
this.type = goog.events.ActionHandler.EventType.BEFOREACTION;
|
|
};
|
|
goog.inherits(goog.events.BeforeActionEvent, goog.events.BrowserEvent);
|