2016-03-29 11 views
4

Lassen Sie uns sagen, ich habe dies in meinem HTML-Seite:Wie funktioniert der Click-Handler, wenn auf ein beliebiges "a" -Tag geklickt wird, unabhängig davon, um was es sich handelt?

<a href="/foo">bar</a> 

<a href="/"> 
    <div></div> 
</a> 

Und ich möchte einen Handler schreiben, wenn Griffe ANY "ein" Tag (mit jQuery) geklickt wird:

$(document).click((e) => { 
    const element = e.target; 
    if (element && element.nodeName === 'A') { 
    // Do something 
    e.preventDefault(); 
    } 
}); 

der obigen Code funktioniert nur für den oberen "a" -Tag, aber nicht für den unteren. Für das obere "a" -Tag entspricht element.nodeNameA. Für das untere "a" -Tag entspricht element.nodeNameDIV.

Wie schreibe ich einen Click-Handler, der immer dann reagiert, wenn auf ein beliebiges "a" -Tag geklickt wird, unabhängig davon, um was es sich handelt?

Antwort

6

Erfassen delegierte Ereignisse in einem übergeordneten Element. Das Dokument erhält alle Ereignisse, wenn Sie nicht preventDefault anrufen, bevor es während der sprudelnden Phase ankommt. Lesen Sie über Event-Phasen, es lohnt sich wirklich!

$(document).on("click", "a", function(event) { 

    // You have clicked an anchor 
    window.console.log ("You have clicked this anchor:", this," but you clicked maybe inside a div or a something inside the <a>", event.target); 

}); 

https://jsfiddle.net/7ttm4y8k/4/

Hinweis: Wie Sie die Ereignisse auf das Dokument delegieren, wird dies auch für Elemente arbeiten, die hinzugefügt wurden, nachdem der Handler gesetzt worden ist. Auf diese Weise können Sie Ihren delegierten Anchor-Handler einrichten und dann zu einem späteren Zeitpunkt möglicherweise Anker aus einer Ajax-Abfrage hinzufügen, ohne dass für jeden erstellten Anker Handler festgelegt werden müssen.

+0

Wow, vielen Dank für die Antwort und auch Ihre Erklärung, warum das funktioniert! Ich habe viel zu lesen auf – banhfun

0

An jedem Anker anbringen. Diese

document.getElementsByTagName('a').map(tag => tag.onClick = yourHandler); 
-1

ist, wie ich es tun (w/o jQuery):

document.body.addEventListener('click', function(ev) { 
    var targetElement = ev.target; 
    while(targetElement !== null && targetElement.nodeName.toUpperCase() !== "A") { 
     targetElement = targetElement.parentElement; 
    } 

    // Proceed only if an A element was found in the ev.target's ancestry 
    if (targetElement !== null) { 
     ev.preventDefault(); 
     // Your code here 
    } 
} 

Dies wird die Veranstaltung im body Tag fangen und ist blind für a Tags im Dokument hinzugefügt/entfernt werden. Es funktioniert so lange, wie die Weiterleitung des Ereignisses click durch keine Elemente in der DOM-Struktur vom Element zum body gestoppt wurde.

+0

Nur hier Problem ist, dass Sie für Browser berücksichtigen möchten, die nicht addEventListener unterstützen. Überprüfen Sie caniuse.com – CookieCoder

+0

"Browser, die addEventListener nicht unterstützen" alias Internet Explorer 8. – rupps

1

https://jsfiddle.net/82fpvwrL/

$("a").click(function(){ 
     alert('WOO HOO! I was clicked.'); 
    }); 

+1

Verwendung preventDefault(); um das Neuladen zu vermeiden ... es sei denn, es ist das, was Sie wollen ... '$ (document) .ready (function() {$ (" a "). click (function (e) {e.preventDefault(); alert (' WOO HOO! Ich wurde geklickt. ');});}); ' –

0

Verwendung so etwas wie dieses:

$(document).on("click","a", (e) => { 
    e.preventDefault(); 
    const element = e.target; 
    // Do something 
}); 
Verwandte Themen