Wie wird das Element angeklickt (für das gesamte Dokument)?


149

Ich möchte das aktuelle Element (egal welches Element) in einem HTML-Dokument abrufen, auf das ich geklickt habe. Ich benutze:

$(document).click(function () {
    alert($(this).text());
});

Aber sehr seltsamerweise erhalte ich den Text des gesamten (!) Dokuments, nicht das angeklickte Element.

Wie bekomme ich nur das Element, auf das ich geklickt habe?

Beispiel

<body>
    <div class="myclass">test</div>
    <p>asdfasfasf</p>
</body>

Wenn ich auf den Text "test" klicke, möchte ich das Attribut mit $(this).attr("myclass") in jQuery lesen können .


2
Die Handlerfunktion wird im Bereich des Elements ausgeführt, zu dem sie hinzugefügt wurde, hier das Dokument. Sie müssen die targetEigenschaft des Ereignisobjekts abrufen.
— Bergi

Antworten:


237

Sie müssen event.targetdas Element verwenden, das das Ereignis ursprünglich ausgelöst hat. Der thisin Ihrem Beispielcode bezieht sich auf document.

In jQuery ist das ...

$(document).click(function(event) {
    var text = $(event.target).text();
});

Ohne jQuery ...

document.addEventListener('click', function(e) {
    e = e || window.event;
    var target = e.target || e.srcElement,
        text = target.textContent || target.innerText;   
}, false);

Stellen Sie außerdem sicher, dass Sie <IE9 unterstützen müssen, das Sie attachEvent()anstelle von verwenden addEventListener().


1
Ich fand, dass das Element, das zurückgegeben wurde, irgendwie etwas anders war, also konnte ich nicht tun, was if(event.target === myjQueryDivElement)ich tun musste: if(event.target.hasClass('mydivclass'))wo mydivclass eine Klasse war, die mein Element hatte.
— Redfox05

Ich habe 3 Tage lang nach einer Lösung in Safari gesucht und bin schließlich auf diesen Beitrag gestoßen. Ihr rockt danke
— Raymond Feliciano

3
@alex hey, sollte es sein || target.innerText?
— Jevgeni Smirnov

30

event.target um das zu bekommen element

window.onclick = e => {
    console.log(e.target);  // to get the element
    console.log(e.target.tagName);  // to get the element tag name alone
} 

um den Text vom angeklickten Element zu erhalten

window.onclick = e => {
    console.log(e.target.innerText);
} 

26

Verwenden Sie im Body-Tag Folgendes

<body onclick="theFunction(event)">

Verwenden Sie dann in Javascript die folgende Funktion, um die ID zu erhalten

<script>
function theFunction(e)
{ alert(e.target.id);}



3

Verwenden Sie delegateund event.target. delegatenutzt das Sprudeln von Ereignissen, indem ein Element Ereignisse auf untergeordnete Elemente abhört und behandelt. targetist die jQ-normalisierten Eigenschaft des eventObjekts , von dem das Objekt, das das Ereignis stammte.

$(document).delegate('*', 'click', function (event) {
    // event.target is the element
    // $(event.target).text() gets its text
});

Demo: http://jsfiddle.net/xXTbP/


2
Sollte in der heutigen Zeit erwähnt on()werden, die über empfohlen werden sollte delegate(). Auch documentist wahrscheinlich die einzige Ausnahme, um delegate()/ nicht zu verwenden, on()da sie ohnehin bis zum höchsten Punkt der Handhabung sprudeln.
— alex

Guter Anruf. Wir haben in meinem Tagesjob noch kein Upgrade auf die neueste jQuery durchgeführt on.
— JAAulde

1
@alex, da die Ereignisse sowieso sprudeln und der Handler trotzdem ausgeführt werden muss, ist das nicht wirklich eine Ausnahme, oder? Es ist einfach nicht so anders ist alles. Ich denke, delegatehat den
— Filteraufwand

2

Ich weiß, dass dieser Beitrag wirklich alt ist, aber um den Inhalt eines Elements in Bezug auf seine ID zu erhalten, würde ich Folgendes tun:

window.onclick = e => {
    console.log(e.target);
    console.log(e.target.id, ' -->', e.target.innerHTML);
}

1
$(document).click(function (e) {
    alert($(e.target).text());
});

-2

Hier ist eine Lösung, die einen jQuery-Selektor verwendet, mit dem Sie problemlos Tags jeder Klasse, ID, jedes Typs usw. anvisieren können.

jQuery('div').on('click', function(){
    var node = jQuery(this).get(0);
    var range = document.createRange();
    range.selectNodeContents( node );
    window.getSelection().removeAllRanges();
    window.getSelection().addRange( range );
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.