Skip to content
Permalink
Browse files

Fixes #8722. Remove try/catch used by #3533 to fix the IE Table Colon…

… Blow bug, and instead check for colon in the event name. Thanks to daguej for scoping this out -- a colonoscopy you might say.
  • Loading branch information...
dmethvin committed Apr 8, 2011
1 parent c470db6 commit 98d83ef85f41fefb40a14eec24c6804c088bbeeb
Showing with 26 additions and 13 deletions.
  1. +13 −13 src/event.js
  2. +13 −0 test/unit/event.js
@@ -280,9 +280,7 @@ jQuery.event = {
trigger: function( event, data, elem ) {
// Event object or event type
var type = event.type || event,
ontype = "on" + type,
namespaces = [],
cur = elem;
namespaces = [];

event = typeof event === "object" ?
// jQuery.Event object
@@ -342,6 +340,10 @@ jQuery.event = {
data = jQuery.makeArray( data );
data.unshift( event );

var cur = elem,
// IE doesn't like method names with a colon (#3533, #8272)
ontype = type.indexOf(":") < 0? "on" + type : "";

// Fire event on the current element, then bubble up the DOM tree
do {
var handle = jQuery._data( cur, "handle" );
@@ -351,13 +353,11 @@ jQuery.event = {
handle.apply( cur, data );
}

// Trigger an inline bound script; IE<9 dies on special-char event name
try {
if ( jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
event.result = false;
event.preventDefault();
}
} catch ( ieError1 ) {}
// Trigger an inline bound script
if ( ontype &&jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
event.result = false;
event.preventDefault();
}

// Bubble up to document, then to window
cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
@@ -373,9 +373,9 @@ jQuery.event = {

// Call a native DOM method on the target with the same name name as the event.
// Can't use an .isFunction)() check here because IE6/7 fails that test.
// Use try/catch so IE<9 won't die on special-char event name or hidden element (#3533).
// IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
try {
if ( elem[ type ] ) {
if ( ontype && elem[ type ] ) {
// Don't re-trigger an onFOO event when we call its FOO() method
old = elem[ ontype ];

@@ -386,7 +386,7 @@ jQuery.event = {
jQuery.event.triggered = type;
elem[ type ]();
}
} catch ( ieError2 ) {}
} catch ( ieError ) {}

if ( old ) {
elem[ ontype ] = old;
@@ -2055,6 +2055,19 @@ test("focusin bubbles", function() {
jQuery( "body" ).unbind( "focusin.focusinBubblesTest" );
});

test("custom events with colons (#3533, #8272)", function() {
expect(1);

var tab = jQuery("<table><tr><td>trigger</td></tr></table>").appendTo("body");
try {
tab.trigger("back:forth");
ok( true, "colon events don't throw" );
} catch ( e ) {
ok( false, "colon events die" );
};
tab.remove();

});

(function(){
// This code must be run before DOM ready!

1 comment on commit 98d83ef

@pdokas

This comment has been minimized.

Copy link

pdokas commented on 98d83ef Apr 8, 2011

This has to be one of the best commit messages in the repo!

Please sign in to comment.
You can’t perform that action at this time.