Jestem nowy w jQuery i robiłem panele z zakładkami, postępując zgodnie z samouczkiem w JavaScript i jQuery: The Missing Manual , jest ta pierwsza linia, gdy autor to robi:
var target = $(this);
Ale próbowałem to zrobić w ten sposób
var target = evt.target;
i mam ten błąd:
Uncaught TypeError: Object http://localhost/tabbedPanels/#panel1 has no method 'attr'
A kiedy evt.target
wróciłem do $(this)
, działało jak urok.
Chcę wiedzieć, jaka jest różnica między $(this)
i evt.target
?
Oto mój kod na wypadek, gdybyś go potrzebował:
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
źródło
źródło
this
jest odniesieniem do elementu JavaScript DOM.$()
to format dostarczany przez jQuery do przekształcania elementu DOM w obiekt jQuery. używającevt.target
odwołujesz się do elementu, podczas$(this)
gdy odwołujesz się do obiektu z parametrami, do których mamy dostęp.$(evt.target)
i (w tym przypadku) również skończyć z takimi samymi wynikami..attr()
Sposób jest zapewnione przez obiekt jQuery, a nie samego elementuOdpowiedzi:
Jest to różnica między
$(this)
aevent.target
i dość znacząca. Podczas gdythis
(lubevent.currentTarget
patrz poniżej) zawsze odnosi się do elementu DOM, do którego został dołączony detektor,event.target
jest to rzeczywisty kliknięty element DOM. Pamiętaj, że z powodu bulgotania wydarzeń, jeśli maszi dołącz odbiornik kliknięć do zewnętrznego elementu div
wtedy
handler
zostanie wywołany po kliknięciu wewnątrz zewnętrznego i wewnętrznego div (chyba że masz inny kod, który obsługuje zdarzenie w wewnętrznym div i zatrzymuje propagację).W tym przykładzie po kliknięciu wewnątrz wewnętrznego elementu div, a następnie w
handler
:this
odwołuje się do.outer
elementu DOM (ponieważ jest to obiekt, do którego został dołączony program obsługi)event.currentTarget
odnosi się również do.outer
elementu (ponieważ jest to bieżący element docelowy obsługujący zdarzenie)event.target
odwołuje się do.inner
elementu (daje to element, z którego pochodzi zdarzenie)Opakowanie jQuery opakowuje
$(this)
element DOM tylko w obiekt jQuery, dzięki czemu można na nim wywoływać funkcje jQuery. Możesz zrobić to samo z$(event.target)
.Zauważ również, że jeśli zmienisz kontekst
this
(np. Jeśli używasz Backbone, zrobisz to automatycznie), wskaże coś innego. Zawsze możesz pobrać rzeczywisty element DOM zevent.currentTarget
.źródło
currentTarget
to zawsze ten z przewodnikiem, tj. zewnętrznythis
jest odniesieniem do elementu DOM, dla którego zdarzenie jest obsługiwane (bieżący cel).event.target
odnosi się do elementu, który zainicjował zdarzenie. W tym przypadku były takie same i często mogą, ale niekoniecznie zawsze tak jest.Możesz to dobrze zrozumieć, przeglądając dokumenty zdarzeń jQuery , ale podsumowując:
Aby uzyskać pożądaną funkcjonalność przy użyciu jQuery, należy opakować ją w obiekt jQuery za pomocą:
$(this)
lub$(evt.target)
.Ta
.attr()
metoda działa tylko na obiekcie jQuery, a nie na elemencie DOM.$(evt.target).attr('href')
lub po prostuevt.target.href
da ci to, czego chcesz.źródło
Istnieje znacząca różnica w sposobie, w jaki jQuery obsługuje zmienną this za pomocą metody „on”
Jeśli porównasz to z: -
źródło
http://api.jquery.com/on/ stwierdza:
Jeśli mamy
Sprawdź poniższe dane wyjściowe:
Zauważ, że używam
$
do zawijania elementu dom w celu utworzenia obiektu jQuery, co zawsze robimy.Można by stwierdzić, że w pierwszym przypadku
this
,event.currentTarget
,event.target
są odwołania do tego samego elementu.Podczas gdy w drugim przypadku, gdy zostanie wyzwolony delegat zdarzenia do jakiegoś opakowanego elementu,
event.target
będzie odwoływał się do wyzwalanego elementu, podczas gdythis
ievent.currentTarget
są odwoływane do miejsca dostarczenia zdarzenia.Ponieważ
this
ievent.currentTarget
są dokładnie tym samym, zgodnie z http://api.jquery.com/event.currenttarget/źródło
Występują problemy z różnymi przeglądarkami.
Typowy program obsługi zdarzeń inny niż jQuery wyglądałby tak:
jQuery normalizuje
evt
i udostępnia element docelowy tak, jakthis
w programach obsługi zdarzeń, więc typowa procedura obsługi zdarzeń jQuery wyglądałaby tak:Hybrydowa procedura obsługi zdarzeń, która używa znormalizowanej
evt
metody jQuery i celu POJS wyglądałaby tak:źródło
W ramach funkcji obsługi zdarzeń lub metody obiektu jednym ze sposobów uzyskania dostępu do właściwości „elementu zawierającego” jest użycie specjalnego słowa kluczowego this. Słowo kluczowe this reprezentuje właściciela aktualnie przetwarzanej funkcji lub metody. Więc:
W przypadku funkcji globalnej reprezentuje okno.
W przypadku metody obiektowej reprezentuje instancję obiektu.
A w programie obsługi zdarzeń reprezentuje element, który odebrał zdarzenie.
Na przykład:
Zawartość okien alertów po wyrenderowaniu tego html to odpowiednio:
Obiekt Event jest powiązany ze wszystkimi zdarzeniami. Posiada właściwości, które dostarczają informacji „o zdarzeniu”, takie jak lokalizacja kliknięcia myszą na stronie internetowej.
Na przykład:
Zawartość okien alertów po wyrenderowaniu tego html to odpowiednio:
źródło