From 323de7085bdb520d856daab856c26fbbe6655a28 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Fri, 29 Feb 2008 07:30:34 +0000 Subject: [PATCH] The click and hover handlers need to take care that the event they are handling doesn't get modified before the delayed listeners get called. Appears to only be a problem in IE. Thanks for the catch madair. r=crschmidt (closes #1393) git-svn-id: http://svn.openlayers.org/trunk/openlayers@6414 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- lib/OpenLayers/Handler/Click.js | 5 ++++- lib/OpenLayers/Handler/Hover.js | 3 +++ tests/Handler/test_Click.html | 6 +++--- tests/Handler/test_Hover.html | 16 ++++++++-------- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/OpenLayers/Handler/Click.js b/lib/OpenLayers/Handler/Click.js index a149bc0ca0..62a3baad10 100644 --- a/lib/OpenLayers/Handler/Click.js +++ b/lib/OpenLayers/Handler/Click.js @@ -159,7 +159,10 @@ OpenLayers.Handler.Click = OpenLayers.Class(OpenLayers.Handler, { this.clearTimer(); } else { // set the timer, send evt only if single is true - var clickEvent = this.single ? evt : null; + //use a clone of the event object because it will no longer + //be a valid event object in IE in the timer callback + var clickEvent = this.single ? + OpenLayers.Util.extend({}, evt) : null; this.timerId = window.setTimeout( OpenLayers.Function.bind(this.delayedCall, this, clickEvent), this.delay diff --git a/lib/OpenLayers/Handler/Hover.js b/lib/OpenLayers/Handler/Hover.js index 1d04e2708a..28644ea6ab 100644 --- a/lib/OpenLayers/Handler/Hover.js +++ b/lib/OpenLayers/Handler/Hover.js @@ -86,6 +86,9 @@ OpenLayers.Handler.Hover = OpenLayers.Class(OpenLayers.Handler, { this.clearTimer(); this.callback('move', [evt]); this.px = evt.xy; + // clone the evt so original properties can be accessed even + // if the browser deletes them during the delay + evt = OpenLayers.Util.extend({}, evt); this.timerId = window.setTimeout( OpenLayers.Function.bind(this.delayedCall, this, evt), this.delay diff --git a/tests/Handler/test_Click.html b/tests/Handler/test_Click.html index c0fe4a30b5..65197dff1f 100644 --- a/tests/Handler/test_Click.html +++ b/tests/Handler/test_Click.html @@ -129,10 +129,10 @@ t.fail("clearTimeout called with non-existent timerId"); } } - var testEvt = Math.random(); + var testEvt = {id: Math.random()}; handler.callbacks = { "click": function(evt) { - t.eq(evt, testEvt, + t.eq(evt.id, testEvt.id, "(click w/ single true) click callback called with correct evt"); }, "dblclick": function(evt) { @@ -203,7 +203,7 @@ // mouse moves one pixel, click should be called handler.callbacks = { "click": function(evt) { - t.ok(evt == clickEvt, "(pixelTolerance met) click called"); + t.ok(evt.xy == clickEvt.xy, "(pixelTolerance met) click called"); } }; map.events.triggerEvent("click", clickEvt); diff --git a/tests/Handler/test_Hover.html b/tests/Handler/test_Hover.html index 630b9123e0..075aa14f71 100644 --- a/tests/Handler/test_Hover.html +++ b/tests/Handler/test_Hover.html @@ -78,16 +78,16 @@ var testEvt; // test pause and move callbacks - four tests here (2 from setTimeout above) - testEvt = Math.random(); + testEvt = {id: Math.random()}; handler.callbacks = { "pause": function(evt) { - t.eq(evt, testEvt, + t.eq(evt.id, testEvt.id, "pause callback called with correct evt"); - }, - "move": function(evt) { - t.eq(evt, testEvt, - "move callback called with correct evt"); - } + }, + "move": function(evt) { + t.eq(evt.id, testEvt.id, + "move callback called with correct evt"); + } }; map.events.triggerEvent("mousemove", testEvt); handler.clearTimer(); @@ -116,7 +116,7 @@ // mouse moves 3x3 pixels, callbacks should be called handler.callbacks = { "pause": function(evt) { - t.ok(evt == testEvt, "(pixelTolerance unmet) pause callback called"); + t.ok(evt.xy == testEvt.xy, "(pixelTolerance unmet) pause callback called"); }, "move": function(evt) { t.ok(evt == testEvt, "(pixelTolerance unmet) move callback called");