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.targetvolví 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

thises una referencia al elemento DOM de JavaScript.$()es el formato proporcionado por jQuery para convertir el elemento DOM en un objeto jQuery. utilizandoevt.targetestá 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.targetes 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
handlerse 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:thisse refiere al.outerelemento DOM (porque ese es el objeto al que se adjuntó el controlador)event.currentTargettambién se refiere al.outerelemento (porque ese es el elemento objetivo actual que maneja el evento)event.targetse refiere al.innerelemento (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
currentTargetsiempre es el que tiene el controlador, es decir. el exteriorthises una referencia para el elemento DOM para el que se maneja el evento (el destino actual).event.targetse 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.hrefte 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.targetson 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.targetse hace referencia al elemento disparada, mientras quethisyevent.currentTargetestán referidos a donde se entrega el evento.Para
thisyevent.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
evty hace que el destino esté disponible comothisen 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
evty 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