Soy nuevo en jQuery, y estaba haciendo paneles con pestañas, siguiendo el tutorial en JavaScript y jQuery: The Missing Manual , existe esa primera línea cuando el autor hace esto:
var target = $(this);
Pero traté de hacerlo de esa manera
var target = evt.target;
y recibí ese error:
Uncaught TypeError: Object http://localhost/tabbedPanels/#panel1 has no method 'attr'
Y cuando evt.target
volví a cambiar $(this)
, funcionó a las mil maravillas.
Quiero saber cuál es la diferencia entre $(this)
y evt.target
?
Aquí está mi código en caso de que lo necesite:
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();
})
javascript-events
this
jquery
Rafael Adel
fuente
fuente
this
es una referencia al elemento DOM de JavaScript.$()
es el formato proporcionado por jQuery para convertir el elemento DOM en un objeto jQuery. utilizandoevt.target
está haciendo referencia a un elemento, mientras$(this)
que está haciendo referencia a un objeto con parámetros a los que tenemos acceso.$(evt.target)
y (en este caso) terminar con los mismos resultados también. El.attr()
método es proporcionado por el objeto jQuery, no por el elemento en sí mismoRespuestas:
No es una diferencia entre
$(this)
yevent.target
, y uno muy significativo. Si bienthis
(oevent.currentTarget
, ver más abajo) siempre se refiere al elemento DOM al que estaba conectado el oyente,event.target
es el elemento DOM real en el que se hizo clic. Recuerde que debido al evento burbujeante, si tieney adjunte click listener al div externo
entonces
handler
se invocará cuando haga clic dentro del div externo así como en el interno (a menos que tenga otro código que maneje el evento en el div interno y detenga la propagación).En este ejemplo, cuando hace clic dentro del div interno, luego en
handler
:this
se refiere al.outer
elemento DOM (porque ese es el objeto al que se adjuntó el controlador)event.currentTarget
también se refiere al.outer
elemento (porque ese es el elemento objetivo actual que maneja el evento)event.target
se refiere al.inner
elemento (esto le da el elemento donde se originó el evento)El contenedor jQuery
$(this)
solo envuelve el elemento DOM en un objeto jQuery para que pueda llamar a las funciones jQuery en él. Puedes hacer lo mismo con$(event.target)
.También tenga en cuenta que si vuelve a vincular el contexto de
this
(por ejemplo, si usa Backbone, se hace automáticamente), apuntará a otra cosa. Siempre puede obtener el elemento DOM real deevent.currentTarget
.fuente
currentTarget
siempre es el que tiene el controlador, es decir. el exteriorthis
es una referencia para el elemento DOM para el que se maneja el evento (el destino actual).event.target
se refiere al elemento que inició el evento. Eran los mismos en este caso, y a menudo pueden serlo, pero no siempre son necesariamente así.Puede tener una buena idea de esto al revisar los documentos de eventos de jQuery , pero en resumen:
Para obtener la funcionalidad deseada usando jQuery, debe envolverla en un objeto jQuery usando:
$(this)
o$(evt.target)
.El
.attr()
método solo funciona en un objeto jQuery, no en un elemento DOM.$(evt.target).attr('href')
o simplementeevt.target.href
te dará lo que quieres.fuente
Hay una diferencia significativa en cómo jQuery maneja esta variable con un método "on"
Si compara esto con: -
fuente
http://api.jquery.com/on/ afirma:
Si tenemos
Verifique la salida a continuación:
Tenga en cuenta que utilizo
$
para envolver el elemento dom para crear un objeto jQuery, que es como siempre lo hacemos.Se verá que para el primer caso,
this
,event.currentTarget
,event.target
son todos hace referencia al mismo elemento.Mientras que en el segundo caso, cuando el delegado de eventos a algún elemento envuelto se activan,
event.target
se hace referencia al elemento disparada, mientras quethis
yevent.currentTarget
están referidos a donde se entrega el evento.Para
this
yevent.currentTarget
, son exactamente lo mismo de acuerdo con http://api.jquery.com/event.currenttarget/fuente
Hay problemas de navegador cruzado aquí.
Un controlador de eventos típico que no sea jQuery sería algo como esto:
jQuery normaliza
evt
y hace que el destino esté disponible comothis
en los controladores de eventos, por lo que un controlador de eventos típico de jQuery sería algo como esto:Un controlador de eventos híbrido que utiliza jQuery's normalizado
evt
y un objetivo POJS sería algo como esto:fuente
Dentro de una función de controlador de eventos o método de objeto, una forma de acceder a las propiedades del "elemento contenedor" es usar la palabra clave especial this. La palabra clave this representa al propietario de la función o método que se está procesando actualmente. Entonces:
Para una función global, esto representa la ventana.
Para un método de objeto, esto representa la instancia del objeto.
Y en un controlador de eventos, esto representa el elemento que recibió el evento.
Por ejemplo:
El contenido de las ventanas de alerta después de representar este html respectivamente es:
Un objeto de evento está asociado con todos los eventos. Tiene propiedades que proporcionan información "sobre el evento", como la ubicación de un clic del mouse en la página web.
Por ejemplo:
El contenido de las ventanas de alerta después de representar este html respectivamente es:
fuente