Wie erhalte ich das aufrufende Objekt onclick?

70

Ich brauche einen Handler für das aufrufende Objekt des onclickEreignisses.

<a href="123.com" onclick="click123(event);">link</a>

<script>
  function click123(event) {
    //i need <a> so i can manipulate it with Jquery
  }
</script>

Ich möchte dies ohne die Verwendung von $().clickoder $().livevon jQuery tun, aber mit der oben beschriebenen Methode.

Konstantinos
quelle

Antworten:

141

Übergeben Sie thisden Inline-Click-Handler

<a href="123.com" onclick="click123(this);">link</a>

oder event.targetin der Funktion verwenden (gemäß dem W3C DOM Level 2 Event-Modell )

function click123(event)
{
    var a = event.target;
}

Aber natürlich ist IE anders , also ist die Vanille-JavaScript-Methode, um damit umzugehen

function doSomething(e) {
    var targ;
    if (!e) var e = window.event;
    if (e.target) targ = e.target;
    else if (e.srcElement) targ = e.srcElement;
    if (targ.nodeType == 3) // defeat Safari bug
        targ = targ.parentNode;
}

oder weniger ausführlich

function doSomething(e) {

    e = e || window.event;
    var targ = e.target || e.srcElement || e;
    if (targ.nodeType == 3) targ = targ.parentNode; // defeat Safari bug
}

Wo eist das event object, was in anderen Browsern als dem IE an die Funktion übergeben wird?

Wenn Sie jedoch jQuery verwenden, würde ich unauffälliges JavaScript dringend empfehlen und jQuery verwenden, um Ereignishandler an Elemente zu binden.

Russ Cam
quelle
3
if (!e) var e = window.event;ist etwas überflüssig - eist bereits deklariert, warum nochmal? ifkann auch insgesamt zugunsten eines kürzeren ternären - vermieden werden e = e || window.event. Das Gleiche gilt für e.target- diese 3 Zeilen können leicht durch - var target = e.target || e.srcElement;)
kangax
@kangax - Ich würde nicht sagen, dass dies e= e || window.eventein ternärer Operator ist, da es nicht drei Argumente gibt, sondern zwei, es ist ein logical-or/defaultOperator - javascript.crockford.com/survey.html . Aber ich nehme den Punkt, es sieht ordentlicher aus und ich benutze es normalerweise. Ich habe einfach den Code aus dem verlinkten Artikel eingefügt, werde aber jetzt meine Antwort veröffentlichen :)
Russ Cam
@ Russell Cam Seufz ... Das nächste Mal werde ich sicherstellen, dass ich morgens Kaffee trinke, bevor ich Kommentare hinterlasse :)
Kangax
1
@ Kangax - Kein Problem, Sie hatten einen gültigen Punkt für Prägnanz :)
Russ Cam
Könnte jemand Details über den "Safari-Fehler" angeben, insbesondere für welche Version dies gilt und wo / ob dies irgendwann "behoben" wird?
Axel Heider
10

Am einfachsten ist es, dies an die Funktion click123 zu übergeben, oder Sie können auch Folgendes tun (browserübergreifend):

function click123(e){
  e = e || window.event;
  var src = e.target || e.srcElement;
  //src element is the eventsource
}
jerjer
quelle
5

http://docs.jquery.com/Events/jQuery.Event

Versuche es mit event.target

Enthält das DOM-Element, das das Ereignis ausgegeben hat. Dies kann das Element sein, das für das Ereignis registriert wurde, oder ein untergeordnetes Element davon.

Svetlozar Angelov
quelle
5

Ich denke, der beste Weg ist, die currentTarget- Eigenschaft anstelle der target- Eigenschaft zu verwenden.

Die schreibgeschützte Eigenschaft currentTarget der Ereignisschnittstelle identifiziert das aktuelle Ziel für das Ereignis , wenn das Ereignis das DOM durchläuft. Es bezieht sich immer auf das Element, an das der Ereignishandler angehängt wurde, im Gegensatz zu Event.target, das das Element identifiziert, bei dem das Ereignis aufgetreten ist .


Zum Beispiel:

<a href="#"><span class="icon"></span> blah blah</a>

Javascript:

a.addEventListener('click', e => {
    e.currentTarget; // always returns "a" element
    e.target; // may return "a" or "span"
})
Az.Youness
quelle
es ist nicht. currentTarget ist in IE und Firefox nicht vorhanden. Sie müssen für diese Browser auf srcElement zurückgreifen. Falls Ihr Element keine Kinder hat, können Sie das Ziel immer sicher verwenden. Verwenden Sie e.currentTarget || e.srcElement nur für Divs und Sachen, die Kinder unten haben.
Vlatko Vlahek
! Nein , es ist gut unterstützt, current ist es nicht nur unterstützt , in (<= IE8), developer.mozilla.org/en-US/docs/Web/API/Event/...
Az.Youness
Danke für die Warnung! Könnte sein, dass React damals ein Problem in einer der Versionen hatte, da ich hier das Problem reproduziert habe.
Vlatko Vlahek
2
Diese Antwort identifiziert einen wichtigen Gotcha mit der akzeptierten Antwort (Ihr Ziel könnte jedes Kind des Onclick-Elternteils sein und nicht unbedingt das Elternelement iteslf) und sollte mehr positive Stimmen haben.
Kpup
Es ist null auf Chrom für mich
Verzeichnis
3

Die Sache mit Ihrer Methode ist, dass Sie Ihr HTML mit Javascript überladen. Wenn Sie Ihr Javascript in eine externe Datei einfügen, können Sie unauffällig auf Ihr HTML zugreifen, und das ist viel ordentlicher.

Später können Sie Ihren Code mit addEventListener / attackEvent (IE) erweitern, um Speicherverluste zu vermeiden.

Dies ist ohne jQuery

<a href="123.com" id="elementid">link</a>

window.onload = function () {
  var el = document.getElementById('elementid');
  el.onclick = function (e) {
    var ev = e || window.event;
    // here u can use this or el as the HTML node
  }
}

Sie sagen, Sie möchten es mit jQuery bearbeiten. Sie können also jQuery verwenden. Dann ist es noch besser, es so zu machen:

// this is the window.onload startup of your JS as in my previous example. The difference is 
// that you can add multiple onload functions
$(function () {
  $('a#elementid').bind('click', function (e) {
    // "this" points to the <a> element
    // "e" points to the event object
  });
});
Robert Cabri
quelle