In this post I'll show how to expand jQuery core functions, as an example I will demonstrate how to add addClass and removeClass events to each jQuery element.
Let's start by creating a closure to avoid variable conflicts:
(function(){
// code goes here...
})();
Now, before the core functions override, we need to save them in order to call them later inside the expanded function
(function(){
// saving the core functions
var coreAddClass = jQuery.fn.addClass;
var coreRemoveClass = jQuery.fn.removeClass;
})();
Core functions saved, now we can override them
(function(){
// saving the core functions
var coreAddClass = jQuery.fn.addClass;
var coreRemoveClass = jQuery.fn.removeClass;
// overriding the addClass function
jQuery.fn.addClass = function(){
}
// overriding the removeClass function
jQuery.fn.removeClass = function(){
}
})();
If you will run the code we wrote so far and try to $().addClass() or $().removeClass() nothing will happen. The next step is to add our new logic to the functions and then to call the core functions so we will keep the original behaviors
(function(){
// saving the core functions
var coreAddClass = jQuery.fn.addClass;
var coreRemoveClass = jQuery.fn.removeClass;
// overriding the addClass function
jQuery.fn.addClass = function(){
// every time the addClass function is called
// for this $element, trigger the addClass event
$(this).trigger('addClass', arguments);
// calling the core function
coreAddClass.apply(this, arguments);
}
// overriding the removeClass function
jQuery.fn.removeClass = function(){
// every time the removeClass function is called
// for this $element, trigger the removeClass event
$(this).trigger('removeClass', arguments);
// calling the core function
coreRemoveClass.apply(this, arguments);
}
})();
By applying the core function at the end of the function we are able to keep the original behavior of the core.
Simple client to test the code:
Simple client to test the code:
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery.events.js"></script>
<script type="text/javascript">
$(function(){
// add event listener to the element addClass event
$('.cube').on('addClass', function(e, className){
console.log(e);
console.log(className);
});
// add event listener to the element removeClass event
$('.cube').on('removeClass', function(e, className){
console.log(e);
console.log(className);
});
$('button').on('click', function(){
// toggle a class on the element, the events are fired
$('.cube').toggleClass('color');
});
});
</script>
<style type="text/css">
.cube{width:100px;height:100px;background:yellow;}
.color{background:red !important;}
</style>
</head>
<body>
<div class="cube"></div>
<button>toggle red</button>
</body>
</html>