Support scoped selection of jquery nodes; support cross-metalevel jquery

This commit is contained in:
Tony Garnock-Jones 2014-02-28 09:46:21 -05:00
parent 5f384f5d35
commit 0054254aed
1 changed files with 21 additions and 10 deletions

31
jquery-driver.js vendored
View File

@ -1,35 +1,46 @@
// JQuery event driver // JQuery event driver
function spawnJQueryDriver() { function spawnJQueryDriver(baseSelector, metaLevel) {
var d = new DemandMatcher(["jQuery", __, __, __]); metaLevel = metaLevel || 0;
var d = new DemandMatcher(["jQuery", __, __, __], metaLevel);
d.onDemandIncrease = function (r) { d.onDemandIncrease = function (r) {
var selector = r.pattern[1]; var selector = r.pattern[1];
var eventName = r.pattern[2]; var eventName = r.pattern[2];
World.spawn(new JQueryEventRouter(selector, eventName), World.spawn(new JQueryEventRouter(baseSelector, selector, eventName, metaLevel),
[pub(["jQuery", selector, eventName, __]), [pub(["jQuery", selector, eventName, __], metaLevel),
pub(["jQuery", selector, eventName, __], 0, 1)]); pub(["jQuery", selector, eventName, __], metaLevel, 1)]);
}; };
World.spawn(d); World.spawn(d);
} }
function JQueryEventRouter(selector, eventName) { function JQueryEventRouter(baseSelector, selector, eventName, metaLevel) {
var self = this; var self = this;
this.baseSelector = baseSelector || null;
this.selector = selector; this.selector = selector;
this.eventName = eventName; this.eventName = eventName;
this.metaLevel = metaLevel || 0;
this.preventDefault = (this.eventName.charAt(0) !== "+"); this.preventDefault = (this.eventName.charAt(0) !== "+");
this.handler = this.handler =
World.wrap(function (e) { 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(); if (self.preventDefault) e.preventDefault();
return !self.preventDefault; return !self.preventDefault;
}); });
$(this.selector).on(this.preventDefault ? this.eventName : this.eventName.substring(1), this.computeNodes().on(this.preventDefault ? this.eventName : this.eventName.substring(1),
this.handler); this.handler);
} }
JQueryEventRouter.prototype.handleEvent = function (e) { JQueryEventRouter.prototype.handleEvent = function (e) {
if (e.type === "routes" && e.routes.length === 0) { if (e.type === "routes" && e.routes.length === 0) {
$(this.selector).off(this.eventName, this.handler); this.computeNodes().off(this.eventName, this.handler);
World.exit(); World.exit();
} }
}; };
JQueryEventRouter.prototype.computeNodes = function () {
if (this.baseSelector) {
return $(this.baseSelector).children(this.selector).addBack(this.selector);
} else {
return $(this.selector);
}
};