Skip to content

Commit 1fc75ba

Browse files
committed
spark efficiency hack
1 parent cbfad7f commit 1fc75ba

1 file changed

Lines changed: 22 additions & 6 deletions

File tree

packages/spark/spark.js

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -704,16 +704,32 @@ Spark.attachEvents = withRenderer(function (eventMap, html, _renderer) {
704704
var selector = handler.selector;
705705

706706
if (selector) {
707+
// Check if event.currentTarget matches `selector`,
708+
// scoped to `range`.
709+
// As an efficiency hack, give the node we are looking
710+
// for an id so the selector will match only it.
711+
var node = event.currentTarget;
712+
var tempId;
713+
if (! node.id)
714+
node.setAttribute('id', tempId = 'spark_currentTarget');
715+
var escapedNodeId = node.id.replace(/'/g, "\\$&");
716+
// XXX OLD COMMENT
707717
// This ends up doing O(n) findAllClipped calls when an
708718
// event bubbles up N level in the DOM. If this ends up
709719
// being too slow, we could memoize findAllClipped across
710720
// the processing of each event.
711-
var results = DomUtils.findAllClipped(
712-
range.containerNode(), selector, range.firstNode(), range.lastNode());
713-
// This is a linear search through what could be a large
714-
// result set.
715-
if (! _.contains(results, event.currentTarget))
716-
continue;
721+
try {
722+
var result = DomUtils.findClipped(
723+
range.containerNode(),
724+
selector + "[id='" + escapedNodeId + "']",
725+
range.firstNode(), range.lastNode());
726+
727+
if (result !== node)
728+
continue;
729+
} finally {
730+
if (tempId)
731+
node.removeAttribute('id');
732+
}
717733
} else {
718734
// if no selector, only match the event target
719735
if (event.currentTarget !== event.target)

0 commit comments

Comments
 (0)