From 0054254aed8b6a188fb42b8c08224c85cd029b96 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Fri, 28 Feb 2014 09:46:21 -0500 Subject: [PATCH] Support scoped selection of jquery nodes; support cross-metalevel jquery --- jquery-driver.js | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/jquery-driver.js b/jquery-driver.js index aeee847..85eb9a8 100644 --- a/jquery-driver.js +++ b/jquery-driver.js @@ -1,35 +1,46 @@ // JQuery event driver -function spawnJQueryDriver() { - var d = new DemandMatcher(["jQuery", __, __, __]); +function spawnJQueryDriver(baseSelector, metaLevel) { + metaLevel = metaLevel || 0; + var d = new DemandMatcher(["jQuery", __, __, __], metaLevel); d.onDemandIncrease = function (r) { var selector = r.pattern[1]; var eventName = r.pattern[2]; - World.spawn(new JQueryEventRouter(selector, eventName), - [pub(["jQuery", selector, eventName, __]), - pub(["jQuery", selector, eventName, __], 0, 1)]); + World.spawn(new JQueryEventRouter(baseSelector, selector, eventName, metaLevel), + [pub(["jQuery", selector, eventName, __], metaLevel), + pub(["jQuery", selector, eventName, __], metaLevel, 1)]); }; World.spawn(d); } -function JQueryEventRouter(selector, eventName) { +function JQueryEventRouter(baseSelector, selector, eventName, metaLevel) { var self = this; + this.baseSelector = baseSelector || null; this.selector = selector; this.eventName = eventName; + this.metaLevel = metaLevel || 0; this.preventDefault = (this.eventName.charAt(0) !== "+"); this.handler = World.wrap(function (e) { - World.send(["jQuery", self.selector, self.eventName, e]); + World.send(["jQuery", self.selector, self.eventName, e], self.metaLevel); if (self.preventDefault) e.preventDefault(); return !self.preventDefault; }); - $(this.selector).on(this.preventDefault ? this.eventName : this.eventName.substring(1), - this.handler); + this.computeNodes().on(this.preventDefault ? this.eventName : this.eventName.substring(1), + this.handler); } JQueryEventRouter.prototype.handleEvent = function (e) { if (e.type === "routes" && e.routes.length === 0) { - $(this.selector).off(this.eventName, this.handler); + this.computeNodes().off(this.eventName, this.handler); World.exit(); } }; + +JQueryEventRouter.prototype.computeNodes = function () { + if (this.baseSelector) { + return $(this.baseSelector).children(this.selector).addBack(this.selector); + } else { + return $(this.selector); + } +};