Come fare clic sull'elemento (per l'intero documento)?


150

Vorrei ottenere l'elemento corrente (qualunque sia l'elemento) in un documento HTML su cui ho fatto clic. Sto usando:

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

Ma molto stranamente, ottengo il testo dell'intero documento (!), Non l'elemento cliccato.

Come ottenere solo l'elemento su cui ho cliccato?

Esempio

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

Se clicco sul testo "test", vorrei poter leggere l'attributo con $(this).attr("myclass") in jQuery.


2
La funzione del gestore viene eseguita nell'ambito dell'elemento a cui viene aggiunta, qui il documento. Dovrai ottenere la targetproprietà dell'oggetto evento.
— Bergi,

Risposte:


238

È necessario utilizzare event.targetquale è l'elemento che ha originariamente attivato l'evento. Il thiscodice nel tuo esempio si riferisce a document.

In jQuery, questo è ...

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

Senza jQuery ...

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

Inoltre, assicurati di dover supportare <IE9 che usi attachEvent()invece di addEventListener().


1
Ho scoperto che l'elemento che era di ritorno era leggermente diverso in qualche modo, quindi non if(event.target === myjQueryDivElement)potevo fare che dovevo fare: if(event.target.hasClass('mydivclass'))dove mydivclass era una classe che aveva il mio elemento.
— Redfox05

Ho cercato un lavoro in Safari per 3 giorni e alla fine mi sono imbattuto in questo post. Ragazzi, grazie rock
— Raymond Feliciano,

3
@alex hey, dovrebbe essere || target.innerText?
— Jevgeni Smirnov,

30

event.target prendere il element

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

per ottenere il testo dall'elemento cliccato

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

26

utilizzare quanto segue all'interno del tag body

<body onclick="theFunction(event)">

quindi utilizza in javascript la seguente funzione per ottenere l'ID

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



3

Usa delegatee event.target. delegatesfrutta il gorgoglio degli eventi lasciando che un elemento ascolti e gestisca gli eventi sugli elementi figlio. targetè la proprietà normalizzata jQ eventdell'oggetto che rappresenta l'oggetto da cui ha avuto origine l'evento.

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

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


2
Dovrebbe essere menzionato in questo giorno ed età che on()dovrebbero essere raccomandati sopra delegate(). Inoltre, documentè probabilmente l'unica eccezione a non utilizzare delegate()/ on()poiché stanno comunque ribollendo al punto più alto di manipolazione.
— alex

Ottima scelta. Non ho eseguito l'aggiornamento al jQuery più recente nel mio lavoro quotidiano, quindi onmi viene in mente.
— JAAulde,

1
@alex, dato che gli eventi sono comunque gorgoglianti, e dato che il gestore deve funzionare indipendentemente, non è davvero un'eccezione, vero? Non è poi così diverso. Immagino delegateabbia il sovraccarico del filtro da considerare, però ...
— JAAulde,

2

So che questo post è davvero vecchio ma, per ottenere il contenuto di un elemento in riferimento al suo ID, questo è quello che vorrei fare:

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

Ecco una soluzione che utilizza un selettore jQuery in modo da poter targetizzare facilmente tag di qualsiasi classe, ID, tipo ecc.

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 );
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.