Eu sou novo no jQuery e estava criando painéis com guias, seguindo o tutorial em JavaScript e jQuery: The Missing Manual , existe a primeira linha quando o autor faz isso:
var target = $(this);
Mas eu tentei fazer dessa maneira
var target = evt.target;
e eu recebi esse erro:
Uncaught TypeError: Object http://localhost/tabbedPanels/#panel1 has no method 'attr'
E quando eu mudei de evt.target
volta $(this)
, funcionou como um encanto.
Eu quero saber qual é a diferença entre $(this)
e evt.target
?
Aqui está o meu código, caso você precise:
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
fonte
fonte
this
é uma referência ao elemento DOM do JavaScript.$()
é o formato fornecido pelo jQuery para transformar o elemento DOM em um objeto jQuery. usandoevt.target
você está fazendo referência a um elemento, enquanto que$(this)
você está fazendo referência a um objeto com parâmetros aos quais temos acesso.$(evt.target)
e (neste caso) também obter os mesmos resultados. O.attr()
método é fornecido pelo objeto jQuery, não o próprio elementoRespostas:
Não é uma diferença entre
$(this)
eevent.target
, e bastante significativa. Emborathis
(ouevent.currentTarget
veja abaixo) sempre se refira ao elemento DOM ao qual o ouvinte foi anexado,event.target
é o elemento DOM real que foi clicado. Lembre-se de que, devido ao borbulhamento do evento, se você tivere anexar o ouvinte de clique à div externa
então
handler
, será invocado quando você clicar dentro da div externa e na interna (a menos que você tenha outro código que lide com o evento na div interna e interrompa a propagação).Neste exemplo, quando você clica dentro da div interna, em
handler
:this
refere-se ao.outer
elemento DOM (porque esse é o objeto ao qual o manipulador foi anexado)event.currentTarget
também se refere ao.outer
elemento (porque esse é o elemento de destino atual que manipula o evento)event.target
refere-se ao.inner
elemento (isso fornece o elemento onde o evento se originou)O wrapper jQuery
$(this)
envolve apenas o elemento DOM em um objeto jQuery para que você possa chamar funções jQuery nele. Você pode fazer o mesmo com$(event.target)
.Observe também que, se você religar o contexto de
this
(por exemplo, se você usar o Backbone, ele será feito automaticamente), ele apontará para outra coisa. Você sempre pode obter o elemento DOM realevent.currentTarget
.fonte
currentTarget
é sempre aquele com o manipulador, ie. o externothis
é uma referência para o elemento DOM para o qual o evento está sendo tratado (o destino atual).event.target
refere-se ao elemento que iniciou o evento. Eles eram os mesmos nesse caso e geralmente podem ser, mas nem sempre são necessariamente assim.Você pode ter uma boa noção disso revisando os documentos do evento jQuery , mas em resumo:
Para obter a funcionalidade desejada usando o jQuery, você deve envolvê-lo em um objeto jQuery usando:
$(this)
ou$(evt.target)
.O
.attr()
método funciona apenas em um objeto jQuery, não em um elemento DOM.$(evt.target).attr('href')
ou simplesmenteevt.target.href
lhe dará o que você deseja.fonte
Existe uma diferença significativa na maneira como o jQuery lida com essa variável com um método "on"
Se você comparar isso com: -
fonte
http://api.jquery.com/on/ afirma:
Se tiver-mos
Verifique a saída abaixo:
Observe que eu uso
$
para envolver o elemento dom para criar um objeto jQuery, que é como sempre fazemos.Você teria que encontrar para o primeiro caso,
this
,event.currentTarget
,event.target
estão todos referenciados ao mesmo elemento.Enquanto no segundo caso, quando o delegado do evento para algum elemento encapsulado for acionado,
event.target
ele será referenciado ao elemento acionado, enquantothis
eevent.currentTarget
são referenciados ao local onde o evento seja entregue.Para
this
eevent.currentTarget
, eles são exatamente a mesma coisa de acordo com http://api.jquery.com/event.currenttarget/fonte
Há problemas entre navegadores aqui.
Um manipulador de eventos não-jQuery típico seria algo assim:
O jQuery normaliza
evt
e disponibiliza o destino comothis
nos manipuladores de eventos; portanto, um manipulador de eventos típico do jQuery seria algo como isto:Um manipulador de eventos híbrido que usa o
evt
alvo normalizado e um POJS do jQuery seria algo como isto:fonte
Dentro de uma função de manipulador de eventos ou método de objeto, uma maneira de acessar as propriedades "do elemento que contém" é usar a palavra-chave especial this. A palavra-chave this representa o proprietário da função ou método atualmente sendo processado. Assim:
Para uma função global, isso representa a janela.
Para um método de objeto, isso representa a instância do objeto.
E em um manipulador de eventos, isso representa o elemento que recebeu o evento.
Por exemplo:
O conteúdo das janelas de alerta após renderizar este html, respectivamente, é:
Um objeto Event está associado a todos os eventos. Possui propriedades que fornecem informações "sobre o evento", como a localização de um clique do mouse na página da web.
Por exemplo:
O conteúdo das janelas de alerta após renderizar este html, respectivamente, é:
fonte