Skip to content

Instantly share code, notes, and snippets.

@jackysee
Created January 7, 2010 05:44
Show Gist options
  • Save jackysee/271025 to your computer and use it in GitHub Desktop.
Save jackysee/271025 to your computer and use it in GitHub Desktop.
/*
Add live('change') ability on IE with jQuery 1.3.2
Should use with conditional comment. e.g.
<!--[if IE]>
<script type="text/javascript" src="jquery.live.change.js"></script>
<![endif]-->
*/
(function(){
jQuery.event.special.change = {
filters: {
click: function( e ) {
var elem = e.target;
if ( elem.nodeName.toLowerCase() === "input" && elem.type === "checkbox" ) {
return trigger( "change", this, arguments );
}
return changeFilters.keyup.call( this, e );
},
keyup: function( e ) {
var elem = e.target, data, index = elem.selectedIndex + "";
if ( elem.nodeName.toLowerCase() === "select" ) {
data = jQuery.data( elem, "_change_data" );
jQuery.data( elem, "_change_data", index );
if ( (elem.type === "select-multiple" || data != null) && data !== index ) {
return trigger( "change", this, arguments );
}
}
},
beforeactivate: function( e ) {
var elem = e.target;
if ( elem.nodeName.toLowerCase() === "input" && elem.type === "radio" && !elem.checked ) {
return trigger( "change", this, arguments );
}
},
blur: function( e ) {
var elem = e.target, nodeName = elem.nodeName.toLowerCase();
if ( (nodeName === "textarea" || (nodeName === "input" && (elem.type === "text" || elem.type === "password")))
&& jQuery.data(elem, "_change_data") !== elem.value ) {
return trigger( "change", this, arguments );
}
},
focus: function( e ) {
var elem = e.target, nodeName = elem.nodeName.toLowerCase();
if ( nodeName === "textarea" || (nodeName === "input" && (elem.type === "text" || elem.type === "password" ) ) ) {
jQuery.data( elem, "_change_data", elem.value );
}
}
},
setup: function( data, namespaces, fn ) {
for ( var type in changeFilters ) {
jQuery.event.add( this, type + ".specialChange." + (fn? "."+fn.guid : ""), changeFilters[type] );
}
// always want to listen for change for trigger
return false;
},
teardown: function( namespaces, fn ) {
for ( var type in changeFilters ) {
jQuery.event.remove( this, type + ".specialChange" + (fn ? "."+fn.guid : ""), changeFilters[type] );
}
}
};
function trigger( type, elem, args ) {
args[0].type = type;
return jQuery.event.handle.apply( elem, args );
}
var changeFilters = jQuery.event.special.change.filters;
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment