@@ -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