I'm new to jQuery, and was making tabbed panels, following the tutorial in JavaScript and jQuery : The Missing Manual, there's that first line when the author does this :
var target = $(this);
But i tried to do it that way
var target = evt.target;
and i got that error :
Uncaught TypeError: Object http://localhost/tabbedPanels/#panel1 has no method 'attr'
And when i changed evt.target
back to $(this)
, it worked like a charm.
I want to know what's the difference between $(this)
and evt.target
?
Here's my code in case you needed it :
index.html :
<!DOCTYPE html>
<html>
<head>
<title>Tabbed Panel</title>
<style>
body {
width : 100%;
height: 100%;
}
#wrapper {
margin : auto;
width : 800px;
}
#tabsContainer {
overflow: hidden;
}
#tabs {
padding:0;
margin:0;
}
#tabs li {
float : left;
list-style:none;
}
#tabs a {
text-decoration:none;
padding : 3px 5px;
display : block;
}
#tabs a.active {
background-color : grey;
}
#panelsContainer {
clear: left;
}
#panel1 {
color : blue;
}
#panel2 {
color : yellow;
}
#panel3 {
color: green;
}
#panel4 {
color : black;
}
</style>
<script type="text/javascript" src="jquery-1.8.0.min.js"></script>
<script type="text/javascript" src="script.js"></script>
</head>
<body>
<div id="wrapper">
<div id="tabsContainer">
<ul id="tabs">
<li><a href="#panel1">Panel1</a></li>
<li><a href="#panel2">Panel2</a></li>
<li><a href="#panel3">Panel3</a></li>
<li><a href="#panel4">Panel4</a></li>
</ul>
</div>
<div id="panelsContainer">
<div id="panel1" class="panel">
this is panel1
</div>
<div id="panel2" class="panel">
this is panel2
</div>
<div id="panel3" class="panel">
this is panel3
</div>
<div id="panel4" class="panel">
this is panel4
</div>
</div>
</div>
</body>
</html>
script.js :
$(function(){
$("#tabs a").click(function(evt){
var target = evt.target,
targetPanel = target.attr("href");
$(".panel").hide();
$("#tabs a.active").removeClass("active");
target.addClass("active").blur();
$(targetPanel).fadeIn(300);
evt.preventDefault();
});
$("#tabs a:first").click();
})
Within an event handler function or object method, one way to access the properties of "the containing element" is to use the special this keyword. The this keyword represents the owner of the function or method currently being processed. So:
For a global function, this represents the window.
For an object method, this represents the object instance.
And in an event handler, this represents the element that received the event.
For example:
The content of alert windows after rendering this html respectively are:
An Event object is associated with all events. It has properties that provide information "about the event", such as the location of a mouse click in the web page.
For example:
The content of alert windows after rendering this html respectively are:
this
is a reference for the DOM element for which the event is being handled (the current target).event.target
refers to the element which initiated the event. They were the same in this case, and can often be, but they aren't necessarily always so.You can get a good sense of this by reviewing the jQuery event docs, but in summary:
To get the desired functionality using jQuery, you must wrap it in a jQuery object using either:
$(this)
or$(evt.target)
.The
.attr()
method only works on a jQuery object, not on a DOM element.$(evt.target).attr('href')
or simplyevt.target.href
will give you what you want.There are cross browser issues here.
A typical non-jQuery event handler would be something like this :
jQuery normalises
evt
and makes the target available asthis
in event handlers, so a typical jQuery event handler would be something like this :A hybrid event handler which uses jQuery's normalised
evt
and a POJS target would be something like this :http://api.jquery.com/on/ states:
If we have
Check the below output:
Note that I use
$
to wrap the dom element in order to create a jQuery object, which is how we always do.You would find that for the first case,
this
,event.currentTarget
,event.target
are all referenced to the same element.While in the second case, when the event delegate to some wrapped element are triggered,
event.target
would be referenced to the triggered element, whilethis
andevent.currentTarget
are referenced to where the event is delivered.For
this
andevent.currentTarget
, they are exactly the same thing according to http://api.jquery.com/event.currenttarget/There is a difference between
$(this)
andevent.target
, and quite a significant one. Whilethis
(orevent.currentTarget
, see below) always refers to the DOM element the listener was attached to,event.target
is the actual DOM element that was clicked. Remember that due to event bubbling, if you haveand attach click listener to the outer div
then the
handler
will be invoked when you click inside the outer div as well as the inner one (unless you have other code that handles the event on the inner div and stops propagation).In this example, when you click inside the inner div, then in the
handler
:this
refers to the.outer
DOM element (because that's the object to which the handler was attached)event.currentTarget
also refers to the.outer
element (because that's the current target element handling the event)event.target
refers to the.inner
element (this gives you the element where the event originated)The jQuery wrapper
$(this)
only wraps the DOM element in a jQuery object so you can call jQuery functions on it. You can do the same with$(event.target)
.Also note that if you rebind the context of
this
(e.g. if you use Backbone it's done automatically), it will point to something else. You can always get the actual DOM element fromevent.currentTarget
.There is a significant different in how jQuery handles the this variable with a "on" method
If you compare this with :-