<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate...</p>
Ich möchte ein Click-Event nur auf das Pseudo-Element (das rote Bit) auslösen. Das heißt, ich möchte nicht, dass das Click-Ereignis auf dem blauen Bit ausgelöst wird.
Wie wäre es mit der Überprüfung angeklickter Positionen? stackoverflow.com/questions/3234977/…
– Benutzer3080276
8. Dezember 2013 um 16:51 Uhr
Bitte lesen Sie meine zuvor gepostete Lösung hier.
– Amr
22. März 2017 um 13:48 Uhr
Möglicherweise ein guter Workaround HIER.
– Reza Mamun
4. Juli 2018 um 15:05 Uhr
Versuchen $('p').before().click(function...)
– Mladen B.
27. August 2020 um 5:13 Uhr
@RezaMamun Kannst du das überprüfen und mir vorschlagen, wie ich es erreichen kann. stackoverflow.com/questions/66923436/…
– Husna
3. April 2021 um 18:42 Uhr
Das ist nicht möglich; Pseudoelemente sind überhaupt kein Teil des DOM, sodass Sie keine Ereignisse direkt an sie binden können, sondern nur an ihre übergeordneten Elemente.
Wenn Sie einen Click-Handler nur im roten Bereich haben müssen, müssen Sie ein untergeordnetes Element wie a erstellen spanplatzieren Sie es direkt nach der Öffnung <p> Tag, Stile anwenden auf p span anstatt p:beforeund daran binden.
Es scheint, dass dies in modernen Browsern mit unterschiedlichen möglich ist pointer-events Werte für das Element selbst und sein Pseudoelement: jsfiddle.net/ZWw3Z/70
– Ilja Streltsyn
24. August 2014 um 13:16 Uhr
@Ilya Streltsyn erstaunlich – nicht die “richtige” Antwort (würde nicht funktionieren, wenn Sie auch auf das Element klicken müssten), funktioniert aber hervorragend für eine “Schließen-Schaltfläche” bei Divs
– RozzA
9. Januar 2015 um 4:28 Uhr
pointer-events scheinen laut dem jsfiddel, das Ilya gepostet hat, nicht für IE9 geeignet zu sein.
– Matt Sgarlata
5. August 2015 um 14:32 Uhr
@user393274: IE9 unterstützt keine Zeigerereignisse außerhalb von SVG.
– BoltClock
5. August 2015 um 16:22 Uhr
@theyuv nein, auf dieser Seite ist die gesamte Zeile anklickbar, sowohl links als auch rechts vom Link. Nur der Link selbst hat einen anderen Klick-Handler, sodass das Klicken darauf kein Ein-/Ausklappen des Teilbaums auslöst.
– Ilja Streltsyn
18. Juli 2017 um 16:21 Uhr
Linus Unnebäck
Eigentlich ist es möglich. Sie können überprüfen, ob die angeklickte Position außerhalb des Elements war, da dies nur dann der Fall ist, wenn ::before oder ::after geklickt wurde.
Dieses Beispiel überprüft nur das Element auf der rechten Seite, aber das sollte in Ihrem Fall funktionieren.
span = document.querySelector('span');
span.addEventListener('click', function (e) {
if (e.offsetX > span.offsetWidth) {
span.className="c2";
} else {
span.className="c1";
}
});
Es funktioniert bei mir nicht, der Text wird hervorgehoben, wenn ich auf entweder klicke. Mit Firefox, wenn es darauf ankommt (sollte nicht).
– Flacher
23. April 2014 um 12:59 Uhr
für Firefox: jsfiddle.net/wC2p7/16 . Wenn Sie mit verschachtelten Elementen arbeiten, müssen Sie gegebenenfalls verschachtelte Offsets berechnen (z. B. jQuery: $(e.target).offset().left ).
– bebi
1. Juli 2014 um 15:38 Uhr
Super Mann, danke, es funktioniert. Aber in Firefox und anderen standardkonformen Browsern zum Testen, wenn die Maus darüber fährt :after musst du prüfen if (e.clientX > span.offsetLeft + span.offsetHeight) da diese Browser das nicht haben e.offsetX Eigentum. Geige: jsfiddle.net/Noitidart/wC2p7/18
– Noitidart
16. Juli 2014 um 6:25 Uhr
Noch cooler wäre es, wenn sich jQuery für die Unterstützung entscheiden würde $('a:after').on('click', fn) aber ich sehe das nicht wirklich passieren :p
– Linus Unnebäck
21. Juli 2014 um 7:43 Uhr
Dies wird tatsächlich nicht funktionieren, wenn ::before oder ::after wird innerhalb des Elements positioniert.
– Lakonbass
8. Januar 2015 um 17:19 Uhr
Fasoeu
An moderne Browser Sie können es mit der CSS-Eigenschaft pointer-events versuchen (aber es führt dazu, dass Mausereignisse auf dem übergeordneten Knoten nicht erkannt werden):
Wenn das Ereignisziel Ihr „p“-Element ist, wissen Sie, dass es Ihr „p:before“ ist.
Wenn Sie immer noch Mausereignisse auf dem Haupt-P erkennen müssen, sollten Sie die Möglichkeit in Betracht ziehen, Ihre HTML-Struktur zu ändern. Sie können eine hinzufügen Spanne -Tag und den folgenden Stil:
p span {
background:#393;
padding:0px 10px;
pointer-events:auto;
}
Die Ereignisziele sind jetzt sowohl das “span”- als auch das “p:before”-Element.
Ich weiß nicht, warum der übergeordnete Knoten ist. Willst du damit sagen, dass wenn ich das Click-Event auf so etwas wie .box:before, die .box dann keinen Klick erkennen kann?
– Hochverehrter Herr
10. Juli 2017 um 0:21 Uhr
Das stimmt teilweise: Wenn Ihr CSS so etwas wie .box{pointer-events:none;} .box:before{pointer-events:auto;} enthält, dann ist das einzige Element, das noch Events unterstützt, p:before. Denken Sie trotzdem daran, dass js Ihnen das .box-Hauptelement zurückgibt, da .box:before nicht wirklich in The DOM lebt.
– Fasoeu
11. Juli 2017 um 6:05 Uhr
Sie können tatsächlich immer noch Mausereignisse auf dem ursprünglichen Element erkennen. Sie müssen diesen Regelsatz nicht immer haben, Sie können einfach die Zeit festlegen, zu der überprüft wird, ob das Element noch bewegt wird, selbst wenn nur seine Pseudoelemente Zeigerereignisse empfangen: jsfiddle.net/0z8p5ret Dies führt jedoch zu einer großen Anzahl von Rückflüssen, daher wäre jeder andere Weg wahrscheinlich besser.
– Kaiido
5. April 2021 um 6:02 Uhr
Kurze Antwort:
Ich tat es. Ich habe eine Funktion für die dynamische Nutzung für all die kleinen Leute da draußen geschrieben …
Ich habe eine Weile dafür gebraucht, da ein Pseudo-Element nicht wirklich auf der Seite ist. Während einige der obigen Antworten in EINIGEN Szenarien funktionieren, sind sie ALLE nicht dynamisch und funktionieren in einem Szenario, in dem ein Element sowohl in Größe als auch in Position unerwartet ist (z. B. absolut positionierte Elemente, die einen Teil des übergeordneten Elements überlagern). Meine nicht.
Verwendungszweck:
//some element selector and a click event...plain js works here too
$("div").click(function() {
//returns an object {before: true/false, after: true/false}
psuedoClick(this);
//returns true/false
psuedoClick(this).before;
//returns true/false
psuedoClick(this).after;
});
Wie es funktioniert:
Es erfasst die Höhe, Breite, obere und linke Position (basierend auf der Position weg vom Rand des Fensters) des übergeordneten Elements und erfasst die Höhe, Breite, obere und linke Position (basierend auf der Kante des übergeordneten Containers). ) und vergleicht diese Werte, um zu bestimmen, wo sich das Pseudoelement auf dem Bildschirm befindet.
Es vergleicht dann, wo sich die Maus befindet. Solange sich die Maus im neu erstellten Variablenbereich befindet, gibt sie true zurück.
Notiz:
Es ist ratsam, das übergeordnete Element RELATIVE zu positionieren. Wenn Sie ein absolut positioniertes Pseudo-Element haben, funktioniert diese Funktion nur, wenn es basierend auf den Abmessungen des übergeordneten Elements positioniert ist (das übergeordnete Element muss also relativ sein … vielleicht würde Sticky oder Fixed auch funktionieren …. Ich weiß es nicht).
Ich weiß nicht … es sieht so aus, als wäre ie dumm und gibt manchmal gerne auto als berechneten Wert zurück. ES SCHEINT IN ALLEN BROWSERN GUT ZU FUNKTIONIEREN, WENN ABMESSUNGEN IN CSS EINGESTELLT WERDEN. Also … stellen Sie Ihre Höhe und Breite auf Ihren Pseudo-Elementen ein und verschieben Sie sie nur mit oben und links. Ich empfehle, es für Dinge zu verwenden, bei denen Sie damit einverstanden sind, dass es nicht funktioniert. Wie eine Animation oder so. Chrome funktioniert … wie gewohnt.
Meine Antwort funktioniert für alle, die auf einen bestimmten Bereich der Seite klicken möchten. Das hat bei mir auf meinem funktioniert absolut positioniert :nach
Danke dafür Artikelerkannte ich (mit jQuery), dass ich verwenden kann e.pageY und e.pageX anstatt sich Sorgen zu machen e.offsetY/X und e.clientY/X Problem zwischen Browsern.
Durch mein Ausprobieren habe ich begonnen, die Mauskoordinaten clientX und clientY im jQuery-Ereignisobjekt zu verwenden. Diese Koordinaten gaben mir den X- und Y-Offset der Maus relativ zur oberen linken Ecke des Ansichtsfensters des Browsers. Als ich jedoch das jQuery 1.4 Reference Guide von Karl Swedberg und Jonathan Chaffer las, sah ich, dass sie sich oft auf die Koordinaten pageX und pageY bezogen. Nachdem ich die aktualisierte jQuery-Dokumentation überprüft hatte, sah ich, dass dies die von jQuery standardisierten Koordinaten waren; und ich sah, dass sie mir den X- und Y-Offset der Maus relativ zum gesamten Dokument gaben (nicht nur zum Ansichtsfenster).
ich mochte das event.pageY Idee, weil es immer so sein würde, wie es war bezogen auf das Dokument. Ich kann es mit dem übergeordneten Element meines :afters vergleichen, indem ich offset() verwende, das sein X und Y auch relativ zum Dokument zurückgibt.
Daher kann ich auf der gesamten Seite eine Reihe von “anklickbaren” Bereichen finden, die sich nie ändern.
oder wenn Sie zu faul für Codepen sind, hier ist das JS:
* Ich habe mich bei meinem Beispiel nur um die Y-Werte gekümmert.
var box = $('.box');
// clickable range - never changes
var max = box.offset().top + box.outerHeight();
var min = max - 30; // 30 is the height of the :after
var checkRange = function(y) {
return (y >= min && y <= max);
}
box.click(function(e){
if ( checkRange(e.pageY) ) {
// do click action
box.toggleClass('toggle');
}
});
Rick
Das funktioniert bei mir:
$('#element').click(function (e) {
if (e.offsetX > e.target.offsetLeft) {
// click on element
}
else{
// click on ::before element
}
});
Abdennour TOUMI
Fügen Sie dem Click-Ereignis eine Bedingung hinzu, um den anklickbaren Bereich einzuschränken.
$('#thing').click(function(e) {
if (e.clientX > $(this).offset().left + 90 &&
e.clientY < $(this).offset().top + 10) {
// action when clicking on after-element
// your code here
}
});
Wie wäre es mit der Überprüfung angeklickter Positionen? stackoverflow.com/questions/3234977/…
– Benutzer3080276
8. Dezember 2013 um 16:51 Uhr
Bitte lesen Sie meine zuvor gepostete Lösung hier.
– Amr
22. März 2017 um 13:48 Uhr
Möglicherweise ein guter Workaround HIER.
– Reza Mamun
4. Juli 2018 um 15:05 Uhr
Versuchen
$('p').before().click(function...)
– Mladen B.
27. August 2020 um 5:13 Uhr
@RezaMamun Kannst du das überprüfen und mir vorschlagen, wie ich es erreichen kann. stackoverflow.com/questions/66923436/…
– Husna
3. April 2021 um 18:42 Uhr