diff --git a/lib/OpenLayers/Events/buttonclick.js b/lib/OpenLayers/Events/buttonclick.js index e2a3edad62..e0b2a87514 100644 --- a/lib/OpenLayers/Events/buttonclick.js +++ b/lib/OpenLayers/Events/buttonclick.js @@ -121,6 +121,26 @@ OpenLayers.Events.buttonclick = OpenLayers.Class({ } 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 @@ -170,6 +190,7 @@ OpenLayers.Events.buttonclick = OpenLayers.Class({ propagate = false; } } else { + propagate = !this.ignore(OpenLayers.Event.element(evt)); delete this.startEvt; } } diff --git a/tests/Events/buttonclick.html b/tests/Events/buttonclick.html index 35ebb81f8a..dadbd3a746 100644 --- a/tests/Events/buttonclick.html +++ b/tests/Events/buttonclick.html @@ -63,6 +63,40 @@ events.destroy(); } + function test_ignore(t) { + t.plan(5); + + // set up + + events = new OpenLayers.Events({}, element); + buttonClick = new OpenLayers.Events.buttonclick(events); + + var link = document.createElement('a'), + span1 = document.createElement('span'), + span2 = document.createElement('span'), + span3 = document.createElement('span'); + link.appendChild(span1); + span1.appendChild(span2); + span2.appendChild(span3); + + t.eq(buttonClick.ignore(link), true, + 'ignore returns true when element is a link'); + t.eq(buttonClick.ignore(span1), true, + 'ignore returns true when element is link descendant level 1'); + t.eq(buttonClick.ignore(span2), true, + 'ignore returns true when element is link descendant level 2'); + t.eq(buttonClick.ignore(span3), false, + 'ignore returns false when element is link descendant level 3'); + t.eq(buttonClick.ignore(element), false, + 'ignore returns false when element is not a link'); + + + // tear down + + buttonClick.destroy(); + events.destroy(); + } + function test_ButtonClick_buttonClick(t) { t.plan(27); events = new OpenLayers.Events({}, element);