| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- /* Copyright (c) 2006-2013 by OpenLayers Contributors (see authors.txt for
- * full list of contributors). Published under the 2-clause BSD license.
- * See license.txt in the OpenLayers distribution or repository for the
- * full text of the license. */
- /**
- * @requires OpenLayers/Events.js
- */
- /**
- * Class: OpenLayers.Events.buttonclick
- * Extension event type for handling buttons on top of a dom element. This
- * event type fires "buttonclick" on its <target> when a button was
- * clicked. Buttons are detected by the "olButton" class.
- *
- * This event type makes sure that button clicks do not interfere with other
- * events that are registered on the same <element>.
- *
- * Event types provided by this extension:
- * - *buttonclick* Triggered when a button is clicked. Listeners receive an
- * object with a *buttonElement* property referencing the dom element of
- * the clicked button, and an *buttonXY* property with the click position
- * relative to the button.
- */
- OpenLayers.Events.buttonclick = OpenLayers.Class({
-
- /**
- * Property: target
- * {<OpenLayers.Events>} The events instance that the buttonclick event will
- * be triggered on.
- */
- target: null,
-
- /**
- * Property: events
- * {Array} Events to observe and conditionally stop from propagating when
- * an element with the olButton class (or its olAlphaImg child) is
- * clicked.
- */
- events: [
- 'mousedown', 'mouseup', 'click', 'dblclick',
- 'touchstart', 'touchmove', 'touchend', 'keydown'
- ],
-
- /**
- * Property: startRegEx
- * {RegExp} Regular expression to test Event.type for events that start
- * a buttonclick sequence.
- */
- startRegEx: /^mousedown|touchstart$/,
- /**
- * Property: cancelRegEx
- * {RegExp} Regular expression to test Event.type for events that cancel
- * a buttonclick sequence.
- */
- cancelRegEx: /^touchmove$/,
- /**
- * Property: completeRegEx
- * {RegExp} Regular expression to test Event.type for events that complete
- * a buttonclick sequence.
- */
- completeRegEx: /^mouseup|touchend$/,
-
- /**
- * Property: startEvt
- * {Event} The event that started the click sequence
- */
-
- /**
- * Constructor: OpenLayers.Events.buttonclick
- * Construct a buttonclick event type. Applications are not supposed to
- * create instances of this class - they are created on demand by
- * <OpenLayers.Events> instances.
- *
- * Parameters:
- * target - {<OpenLayers.Events>} The events instance that the buttonclick
- * event will be triggered on.
- */
- initialize: function(target) {
- this.target = target;
- for (var i=this.events.length-1; i>=0; --i) {
- this.target.register(this.events[i], this, this.buttonClick, {
- extension: true
- });
- }
- },
-
- /**
- * Method: destroy
- */
- destroy: function() {
- for (var i=this.events.length-1; i>=0; --i) {
- this.target.unregister(this.events[i], this, this.buttonClick);
- }
- delete this.target;
- },
- /**
- * Method: getPressedButton
- * Get the pressed button, if any. Returns undefined if no button
- * was pressed.
- *
- * Arguments:
- * element - {DOMElement} The event target.
- *
- * Returns:
- * {DOMElement} The button element, or undefined.
- */
- getPressedButton: function(element) {
- var depth = 3, // limit the search depth
- button;
- do {
- if(OpenLayers.Element.hasClass(element, "olButton")) {
- // hit!
- button = element;
- break;
- }
- element = element.parentNode;
- } while(--depth > 0 && element);
- return button;
- },
-
- /**
- * Method: ignore
- * Check for event target elements that should be ignored by OpenLayers.
- *
- * Parameters:
- * element - {DOMElement} The event target.
- */
- ignore: function(element) {
- var depth = 3,
- ignore = false;
- do {
- if (element.nodeName.toLowerCase() === 'a') {
- ignore = true;
- break;
- }
- element = element.parentNode;
- } while (--depth > 0 && element);
- return ignore;
- },
- /**
- * Method: buttonClick
- * Check if a button was clicked, and fire the buttonclick event
- *
- * Parameters:
- * evt - {Event}
- */
- buttonClick: function(evt) {
- var propagate = true,
- element = OpenLayers.Event.element(evt);
- if (element && (OpenLayers.Event.isLeftClick(evt) || !~evt.type.indexOf("mouse"))) {
- // was a button pressed?
- var button = this.getPressedButton(element);
- if (button) {
- if (evt.type === "keydown") {
- switch (evt.keyCode) {
- case OpenLayers.Event.KEY_RETURN:
- case OpenLayers.Event.KEY_SPACE:
- this.target.triggerEvent("buttonclick", {
- buttonElement: button
- });
- OpenLayers.Event.stop(evt);
- propagate = false;
- break;
- }
- } else if (this.startEvt) {
- if (this.completeRegEx.test(evt.type)) {
- var pos = OpenLayers.Util.pagePosition(button);
- var viewportElement = OpenLayers.Util.getViewportElement();
- var scrollTop = window.pageYOffset || viewportElement.scrollTop;
- var scrollLeft = window.pageXOffset || viewportElement.scrollLeft;
- pos[0] = pos[0] - scrollLeft;
- pos[1] = pos[1] - scrollTop;
-
- this.target.triggerEvent("buttonclick", {
- buttonElement: button,
- buttonXY: {
- x: this.startEvt.clientX - pos[0],
- y: this.startEvt.clientY - pos[1]
- }
- });
- }
- if (this.cancelRegEx.test(evt.type)) {
- delete this.startEvt;
- }
- OpenLayers.Event.stop(evt);
- propagate = false;
- }
- if (this.startRegEx.test(evt.type)) {
- this.startEvt = evt;
- OpenLayers.Event.stop(evt);
- propagate = false;
- }
- } else {
- propagate = !this.ignore(OpenLayers.Event.element(evt));
- delete this.startEvt;
- }
- }
- return propagate;
- }
-
- });
|