github
Advanced Search
  • Home
  • Pricing and Signup
  • Explore GitHub
  • Blog
  • Login

jquery / jquery

  • Admin
  • Watch Unwatch
  • Fork
  • Your Fork
  • Pull Request
  • Download Source
    • 1,856
    • 174
  • Source
  • Commits
  • Network (174)
  • Graphs
  • Tree: f68b46d

click here to add a description

click here to add a homepage

  • Switch Branches (3)
    • master
    • mobile
    • omgrequire
  • Switch Tags (41)
    • 1.4rc1
    • 1.4a2
    • 1.4a1
    • 1.4.2
    • 1.4.1
    • 1.4
    • 1.3rc1
    • 1.3b2
    • 1.3b1
    • 1.3.2
    • 1.3.1rc1
    • 1.3.1
    • 1.3
    • 1.2.6
    • 1.2.5
    • 1.2.4b
    • 1.2.4a
    • 1.2.4
    • 1.2.3b
    • 1.2.3a
    • 1.2.3
    • 1.2.2b2
    • 1.2.2b
    • 1.2.2
    • 1.2.1
    • 1.2
    • 1.1b
    • 1.1a
    • 1.1.4
    • 1.1.3a
    • 1.1.3.1
    • 1.1.3
    • 1.1.2
    • 1.1.1
    • 1.1
    • 1.0a
    • 1.0.4
    • 1.0.3
    • 1.0.2
    • 1.0.1
    • 1.0
  • Comments
Sending Request…

jQuery JavaScript Library — Read more

  Cancel

http://jquery.com/

  Cancel
  • Private
  • Read-Only
  • HTTP Read-Only

This URL has Read+Write access

Make sure that special remove and teardown events get called when .die() 
is used. Additionally made sure that default actions are triggered when 
namespaced events are used. Fixes #6202 and #6250.
jeresig (author)
Tue Mar 09 09:22:25 -0800 2010
commit  f68b46d7abb54cdcd3d1ce1713bc989f992d1448
tree    78f4ea689ea94e0f3e122d5f75e5759ee959a3a4
parent  2fbe3fbf681b65426868920d00085f1fa56034c7
M src/event.js 48 ••••
M src/manipulation.js 2 ••
M test/unit/event.js 80 ••••
0
src/event.js
...
90
91
92
93
 
 
 
94
95
96
...
335
336
337
338
339
340
 
 
 
341
342
343
344
345
346
 
347
348
 
349
350
351
 
352
353
354
355
 
356
357
358
359
360
361
362
 
363
364
365
...
381
382
383
384
385
386
 
 
387
388
389
...
495
496
497
498
 
 
 
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
 
515
516
517
518
519
...
983
984
985
986
 
987
988
989
990
991
992
 
993
994
995
...
1077
1078
1079
1080
 
1081
1082
1083
...
90
91
92
 
93
94
95
96
97
98
...
337
338
339
 
 
 
340
341
342
343
344
345
346
347
 
348
349
 
350
351
352
 
353
354
355
356
 
357
358
359
360
361
362
363
 
364
365
366
367
...
383
384
385
 
386
387
388
389
390
391
392
...
498
499
500
 
501
502
503
504
505
506
 
 
 
 
 
 
 
 
 
 
 
 
 
507
508
 
509
510
511
...
975
976
977
 
978
979
980
981
982
983
 
984
985
986
987
...
1069
1070
1071
 
1072
1073
1074
1075
0
@@ -90,7 +90,9 @@ jQuery.event = {
0
       }
0
 
0
       handleObj.type = type;
0
-      handleObj.guid = handler.guid;
0
+      if ( !handleObj.guid ) {
0
+        handleObj.guid = handler.guid;
0
+      }
0
 
0
       // Get the current list of functions bound to this event
0
       var handlers = events[ type ],
0
@@ -335,31 +337,31 @@ jQuery.event = {
0
       jQuery.event.trigger( event, data, parent, true );
0
 
0
     } else if ( !event.isDefaultPrevented() ) {
0
-      var target = event.target, old,
0
-        isClick = jQuery.nodeName(target, "a") && type === "click",
0
-        special = jQuery.event.special[ type ] || {};
0
+      var target = event.target, old, targetType = type.replace(/\..*$/, ""),
0
+        isClick = jQuery.nodeName(target, "a") && targetType === "click",
0
+        special = jQuery.event.special[ targetType ] || {};
0
 
0
       if ( (!special._default || special._default.call( elem, event ) === false) && 
0
         !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
0
 
0
         try {
0
-          if ( target[ type ] ) {
0
+          if ( target[ targetType ] ) {
0
             // Make sure that we don't accidentally re-trigger the onFOO events
0
-            old = target[ "on" + type ];
0
+            old = target[ "on" + targetType ];
0
 
0
             if ( old ) {
0
-              target[ "on" + type ] = null;
0
+              target[ "on" + targetType ] = null;
0
             }
0
 
0
             jQuery.event.triggered = true;
0
-            target[ type ]();
0
+            target[ targetType ]();
0
           }
0
 
0
         // prevent IE from throwing an error for some elements with some event types, see #3533
0
         } catch (triggerError) {}
0
 
0
         if ( old ) {
0
-          target[ "on" + type ] = old;
0
+          target[ "on" + targetType ] = old;
0
         }
0
 
0
         jQuery.event.triggered = false;
0
@@ -381,9 +383,10 @@ jQuery.event = {
0
       event.type = namespaces.shift();
0
       namespace_sort = namespaces.slice(0).sort();
0
       namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");
0
-      event.namespace = namespace_sort.join(".");
0
     }
0
 
0
+    event.namespace = event.namespace || namespace_sort.join(".");
0
+
0
     events = jQuery.data(this, "events");
0
     handlers = (events || {})[ event.type ];
0
 
0
@@ -495,25 +498,14 @@ jQuery.event = {
0
 
0
     live: {
0
       add: function( handleObj ) {
0
-        jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); 
0
+        jQuery.event.add( this,
0
+          liveConvert( handleObj.origType, handleObj.selector ),
0
+          jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); 
0
       },
0
 
0
       remove: function( handleObj ) {
0
-        var remove = true,
0
-          type = handleObj.origType.replace(rnamespaces, "");
0
-        
0
-        jQuery.each( jQuery.data(this, "events").live || [], function() {
0
-          if ( type === this.origType.replace(rnamespaces, "") ) {
0
-            remove = false;
0
-            return false;
0
-          }
0
-        });
0
-
0
-        if ( remove ) {
0
-          jQuery.event.remove( this, handleObj.origType, liveHandler );
0
-        }
0
+        jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
0
       }
0
-
0
     },
0
 
0
     beforeunload: {
0
@@ -983,13 +975,13 @@ jQuery.each(["live", "die"], function( i, name ) {
0
       if ( name === "live" ) {
0
         // bind live handler
0
         for ( var j = 0, l = context.length; j < l; j++ ) {
0
-          jQuery.event.add( context[j], liveConvert( type, selector ),
0
+          jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
0
             { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
0
         }
0
 
0
       } else {
0
         // unbind live handler
0
-        context.unbind( liveConvert( type, selector ), fn );
0
+        context.unbind( "live." + liveConvert( type, selector ), fn );
0
       }
0
     }
0
     
0
@@ -1077,7 +1069,7 @@ function liveHandler( event ) {
0
 }
0
 
0
 function liveConvert( type, selector ) {
0
-  return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&");
0
+  return (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&");
0
 }
0
 
0
 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
0
src/manipulation.js
...
561
562
563
564
 
565
566
567
...
561
562
563
 
564
565
566
567
0
@@ -561,7 +561,7 @@ jQuery.extend({
0
       if ( id ) {
0
         data = cache[ id ];
0
         
0
-        if ( data.events ) {
0
+        if ( data && data.events ) {
0
           for ( var type in data.events ) {
0
             if ( special[ type ] ) {
0
               jQuery.event.remove( elem, type );
0
test/unit/event.js
...
978
979
980
 
981
982
 
983
984
985
986
 
987
988
 
989
 
990
991
 
992
993
994
...
997
998
999
 
1000
1001
 
1002
 
1003
1004
 
1005
1006
1007
...
1307
1308
1309
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1310
1311
1312
...
1460
1461
1462
 
1463
1464
 
1465
1466
1467
1468
 
1469
1470
 
1471
 
1472
1473
 
1474
1475
1476
...
1479
1480
1481
 
1482
1483
 
1484
 
1485
1486
 
1487
1488
1489
...
978
979
980
981
982
 
983
984
985
986
987
988
989
 
990
991
992
993
 
994
995
996
997
...
1000
1001
1002
1003
1004
 
1005
1006
1007
1008
 
1009
1010
1011
1012
...
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
...
1515
1516
1517
1518
1519
 
1520
1521
1522
1523
1524
1525
1526
 
1527
1528
1529
1530
 
1531
1532
1533
1534
...
1537
1538
1539
1540
1541
 
1542
1543
1544
1545
 
1546
1547
1548
1549
0
@@ -978,17 +978,20 @@ test(".live()/.die()", function() {
0
   jQuery("#nothiddendiv").trigger("click");
0
   equals( called, 1, "Verify that only one click occurred." );
0
 
0
+  called = 0;
0
   jQuery("#anchor2").trigger("click");
0
-  equals( called, 2, "Verify that only one click occurred." );
0
+  equals( called, 1, "Verify that only one click occurred." );
0
 
0
   // Make sure that only one callback is removed
0
   jQuery("#anchor2").die("click", callback);
0
 
0
+  called = 0;
0
   jQuery("#nothiddendiv").trigger("click");
0
-  equals( called, 3, "Verify that only one click occurred." );
0
+  equals( called, 1, "Verify that only one click occurred." );
0
 
0
+  called = 0;
0
   jQuery("#anchor2").trigger("click");
0
-  equals( called, 3, "Verify that no click occurred." );
0
+  equals( called, 0, "Verify that no click occurred." );
0
 
0
   // Make sure that it still works if the selector is the same,
0
   // but the event type is different
0
@@ -997,11 +1000,13 @@ test(".live()/.die()", function() {
0
   // Cleanup
0
   jQuery("#nothiddendiv").die("click", callback);
0
 
0
+  called = 0;
0
   jQuery("#nothiddendiv").trigger("click");
0
-  equals( called, 3, "Verify that no click occurred." );
0
+  equals( called, 0, "Verify that no click occurred." );
0
 
0
+  called = 0;
0
   jQuery("#nothiddendiv").trigger("foo");
0
-  equals( called, 4, "Verify that one foo occurred." );
0
+  equals( called, 1, "Verify that one foo occurred." );
0
 
0
   // Cleanup
0
   jQuery("#nothiddendiv").die("foo", callback);
0
@@ -1307,6 +1312,56 @@ test("live with submit", function() {
0
   jQuery("body").die("submit");
0
 });
0
 
0
+test("live with special events", function() {
0
+  expect(13);
0
+
0
+  jQuery.event.special.foo = {
0
+    setup: function( data, namespaces, handler ) {
0
+      ok( true, "Setup run." );
0
+    },
0
+    teardown: function( namespaces ) {
0
+      ok( true, "Teardown run." );
0
+    },
0
+    add: function( handleObj ) {
0
+      ok( true, "Add run." );
0
+    },
0
+    remove: function( handleObj ) {
0
+      ok( true, "Remove run." );
0
+    },
0
+    _default: function( event ) {
0
+      ok( true, "Default run." );
0
+    }
0
+  };
0
+
0
+  // Run: setup, add
0
+  jQuery("#liveSpan1").live("foo.a", function(e){
0
+    ok( true, "Handler 1 run." );
0
+  });
0
+
0
+  // Run: add
0
+  jQuery("#liveSpan1").live("foo.b", function(e){
0
+    ok( true, "Handler 2 run." );
0
+  });
0
+
0
+  // Run: Handler 1, Handler 2, Default
0
+  jQuery("#liveSpan1").trigger("foo");
0
+
0
+  // Run: Handler 1, Default
0
+  // TODO: Namespace doesn't trigger default (?)
0
+  jQuery("#liveSpan1").trigger("foo.a");
0
+
0
+  // Run: remove
0
+  jQuery("#liveSpan1").die("foo.a");
0
+
0
+  // Run: Handler 2, Default
0
+  jQuery("#liveSpan1").trigger("foo");
0
+
0
+  // Run: remove, teardown
0
+  jQuery("#liveSpan1").die("foo");
0
+
0
+  delete jQuery.event.special.foo;
0
+});
0
+
0
 test(".delegate()/.undelegate()", function() {
0
   expect(65);
0
 
0
@@ -1460,17 +1515,20 @@ test(".delegate()/.undelegate()", function() {
0
   jQuery("#nothiddendiv").trigger("click");
0
   equals( called, 1, "Verify that only one click occurred." );
0
 
0
+  called = 0;
0
   jQuery("#anchor2").trigger("click");
0
-  equals( called, 2, "Verify that only one click occurred." );
0
+  equals( called, 1, "Verify that only one click occurred." );
0
 
0
   // Make sure that only one callback is removed
0
   jQuery("#body").undelegate("#anchor2", "click", callback);
0
 
0
+  called = 0;
0
   jQuery("#nothiddendiv").trigger("click");
0
-  equals( called, 3, "Verify that only one click occurred." );
0
+  equals( called, 1, "Verify that only one click occurred." );
0
 
0
+  called = 0;
0
   jQuery("#anchor2").trigger("click");
0
-  equals( called, 3, "Verify that no click occurred." );
0
+  equals( called, 0, "Verify that no click occurred." );
0
 
0
   // Make sure that it still works if the selector is the same,
0
   // but the event type is different
0
@@ -1479,11 +1537,13 @@ test(".delegate()/.undelegate()", function() {
0
   // Cleanup
0
   jQuery("#body").undelegate("#nothiddendiv", "click", callback);
0
 
0
+  called = 0;
0
   jQuery("#nothiddendiv").trigger("click");
0
-  equals( called, 3, "Verify that no click occurred." );
0
+  equals( called, 0, "Verify that no click occurred." );
0
 
0
+  called = 0;
0
   jQuery("#nothiddendiv").trigger("foo");
0
-  equals( called, 4, "Verify that one foo occurred." );
0
+  equals( called, 1, "Verify that one foo occurred." );
0
 
0
   // Cleanup
0
   jQuery("#body").undelegate("#nothiddendiv", "foo", callback);

Comments

Please log in to comment.
Blog | Support | Training | Contact | API | Status | Twitter | Help | Security
© 2010 GitHub Inc. All rights reserved. | Terms of Service | Privacy Policy
Powered by the Dedicated Servers and
Cloud Computing of Rackspace Hosting®
Dedicated Server