Skip to content

Commit 2146d93

Browse files
committed
Pass extraData to all events
Close mar10#114
1 parent 3c059c6 commit 2146d93

File tree

4 files changed

+30
-36
lines changed

4 files changed

+30
-36
lines changed

CHANGELOG.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
# 1.15.1-0 / Unreleased
1+
# 1.16.0-0 / Unreleased
22

3-
*
3+
* [FEATURE] #114: Pass `extraData` argument to `select` and other events.
4+
The same ui.extraData instance is passed to all events of a open-select-close
5+
sequence, so it can also be used to pass data between events.
46

57
# 1.15.0 / 2017-03-18
68

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ $("#container").contextmenu({
8686

8787
Alternatively we can
8888
<a href="https://github.com/mar10/jquery-ui-contextmenu/wiki#initialize-menu-from-an-existing-ul-element">
89-
initialaize the menu from embedded &lt;ul> markup</a>.
89+
initialize the menu from embedded &lt;ul> markup</a>.
9090

9191
For more information:
9292

jquery.ui-contextmenu.js

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ $.widget("moogle.contextmenu", {
3434
version: "@VERSION",
3535
options: {
3636
addClass: "ui-contextmenu", // Add this class to the outer <ul>
37-
autoFocus: false, // Set keyboard focus to first entry on open
37+
autoFocus: false, // Set keyboard focus to first entry on open
3838
autoTrigger: true, // open menu on browser's `contextmenu` event
3939
delegate: null, // selector
4040
hide: { effect: "fadeOut", duration: "fast" },
@@ -66,6 +66,7 @@ $.widget("moogle.contextmenu", {
6666
this.$menu = null;
6767
this.menuIsTemp = false;
6868
this.currentTarget = null;
69+
this.extraData = {};
6970
this.previousFocus = null;
7071

7172
if (opts.preventSelect) {
@@ -120,16 +121,18 @@ $.widget("moogle.contextmenu", {
120121
},
121122
/** (Re)Create jQuery UI Menu. */
122123
_createUiMenu: function(menuDef) {
123-
var ct,
124+
var ct, ed,
124125
opts = this.options;
125126

126127
// Remove temporary <ul> if any
127128
if (this.isOpen()) {
128129
// #58: 'replaceMenu' in beforeOpen causing select: to lose ui.target
129130
ct = this.currentTarget;
131+
ed = this.extraData;
130132
// close without animation, to force async mode
131133
this._closeMenu(true);
132134
this.currentTarget = ct;
135+
this.extraData = ed;
133136
}
134137
if (this.menuIsTemp) {
135138
this.$menu.remove(); // this will also destroy ui.menu
@@ -171,6 +174,7 @@ $.widget("moogle.contextmenu", {
171174

172175
ui.cmd = ui.item.attr("data-command");
173176
ui.target = $(this.currentTarget);
177+
ui.extraData = this.extraData;
174178
// ignore clicks, if they only open a sub-menu
175179
if ( !isParent || !opts.ignoreParentSelect) {
176180
retval = this._trigger.call(this, "select", event, ui);
@@ -187,24 +191,24 @@ $.widget("moogle.contextmenu", {
187191
},
188192
/** Open popup (called on 'contextmenu' event). */
189193
_openMenu: function(event, recursive) {
190-
var res, promise,
194+
var res, promise, ui,
191195
opts = this.options,
192196
posOption = opts.position,
193197
self = this,
194-
manualTrigger = !!event.isTrigger,
195-
ui = { menu: this.$menu, target: $(event.target),
196-
extraData: event._extraData, originalEvent: event,
197-
result: null };
198+
manualTrigger = !!event.isTrigger;
198199

199200
if ( !opts.autoTrigger && !manualTrigger ) {
200201
// ignore browser's `contextmenu` events
201202
return;
202203
}
203-
204204
// Prevent browser from opening the system context menu
205205
event.preventDefault();
206206

207207
this.currentTarget = event.target;
208+
this.extraData = event._extraData || {};
209+
210+
ui = { menu: this.$menu, target: $(this.currentTarget), extraData: this.extraData,
211+
originalEvent: event, result: null };
208212

209213
if ( !recursive ) {
210214
res = this._trigger("beforeOpen", event, ui);
@@ -280,7 +284,7 @@ $.widget("moogle.contextmenu", {
280284
_closeMenu: function(immediately) {
281285
var self = this,
282286
hideOpts = immediately ? false : this.options.hide,
283-
ui = { menu: this.$menu, target: $(this.currentTarget) };
287+
ui = { menu: this.$menu, target: $(this.currentTarget), extraData: this.extraData };
284288

285289
// Note: we don't want to unbind the 'contextmenu' event
286290
$(document)
@@ -289,6 +293,7 @@ $.widget("moogle.contextmenu", {
289293
.unbind("keydown" + this.eventNamespace);
290294

291295
self.currentTarget = null; // issue #44 after hide animation is too late
296+
self.extraData = {};
292297
if ( this.$menu ) { // #88: widget might have been destroyed already
293298
this.$menu
294299
.unbind("contextmenu" + this.eventNamespace);

test/tests.js

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ function _clickTest(menu, assert) {
293293
var $ctx, $popup,
294294
done = assert.async();
295295

296-
assert.expect(6);
296+
assert.expect(13);
297297

298298
$("#container").contextmenu({
299299
delegate: ".hasmenu",
@@ -303,6 +303,8 @@ function _clickTest(menu, assert) {
303303
beforeOpen: function(event, ui) {
304304
log("beforeOpen(" + ui.target.text() + ")");
305305
assert.equal( ui.target.text(), "AAA", "beforeOpen: ui.target is set" );
306+
assert.equal( ui.extraData.foo, "bar", "beforeOpen: ui.extraData is set" );
307+
ui.extraData.helloFromBO = true;
306308
},
307309
create: function(event, ui) {
308310
log("create");
@@ -330,18 +332,24 @@ function _clickTest(menu, assert) {
330332
log("select(" + t + ")");
331333
assert.equal( ui.cmd, "cut", "select: ui.cmd is set" );
332334
assert.equal( ui.target.text(), "AAA", "select: ui.target is set" );
335+
assert.equal( ui.extraData.foo, "bar", "select: ui.extraData is set" );
336+
assert.equal( ui.extraData.helloFromBO, true, "select: ui.extraData is maintained" );
333337
},
334338
open: function(event, ui) {
335339
log("open");
336340
assert.equal( ui.target.text(), "AAA", "open: ui.target is set" );
341+
assert.equal( ui.extraData.foo, "bar", "open: ui.extraData is set" );
342+
assert.equal( ui.extraData.helloFromBO, true, "open: ui.extraData is maintained" );
337343
setTimeout(function() {
338344
entryEvent($popup, 0, "mouseenter");
339345
click($popup, 0);
340346
}, 10);
341347
},
342348
close: function(event, ui) {
343349
log("close");
344-
assert.equal( ui.target.text(), "AAA", "open: ui.target is set" );
350+
assert.equal( ui.target.text(), "AAA", "close: ui.target is set" );
351+
assert.equal( ui.extraData.foo, "bar", "close: ui.extraData is set" );
352+
assert.equal( ui.extraData.helloFromBO, true, "close: ui.extraData is maintained" );
345353
assert.equal(logOutput(),
346354
"createMenu,create,open(),beforeOpen(AAA),after open(),open,select(cut),close",
347355
"Event sequence OK.");
@@ -353,16 +361,8 @@ function _clickTest(menu, assert) {
353361
$popup = $ctx.contextmenu("getMenu");
354362

355363
log("open()");
356-
$ctx.contextmenu("open", $("span.hasmenu:first"));
364+
$ctx.contextmenu("open", $("span.hasmenu:first"), { foo: "bar" });
357365
log("after open()");
358-
359-
// setTimeout(function() {
360-
// // TODO: why is focus() called twice?
361-
// assert.equal(logOutput(),
362-
// "createMenu,create,open(),beforeOpen(AAA),after open(),open,select(cut),close",
363-
// "Event sequence OK.");
364-
// done();
365-
// }, 500);
366366
}
367367

368368
QUnit.test("Array menu", function(assert) {
@@ -428,12 +428,6 @@ QUnit.test("Array menu", function(assert) {
428428
log("open()");
429429
$ctx.contextmenu("open", $("span.hasmenu:first"));
430430
log("after open()");
431-
432-
// setTimeout(function() {
433-
// assert.equal(logOutput(), "open(),after open(),open,select(cut),cut action,close",
434-
// "Event sequence OK.");
435-
// done();
436-
// }, 500);
437431
});
438432

439433
// ****************************************************************************
@@ -506,13 +500,6 @@ QUnit.test("modify on open", function(assert) {
506500
log("open()");
507501
$ctx.contextmenu("open", $("span.hasmenu:first"));
508502
log("after open()");
509-
510-
// setTimeout(function() {
511-
// assert.equal(logOutput(), "open(),beforeOpen,after open(),open,select(cut),close",
512-
// "Event sequence OK.");
513-
// done();
514-
// }, 1500);
515-
516503
});
517504

518505
});

0 commit comments

Comments
 (0)