Ho un gruppo di div posizionati assolutamente uno sopra l'altro. Quando lego un evento click a tutti, solo il div principale risponde. Come posso inviare l'evento a tutti i divs sotto il cursore?Come propagare un clic a tutte le div al cursore?
risposta
Prendendo il suggerimento di FelixKling utilizzare document.elementFromPoint()
e violino di Amberlamps, e impiegando jQuery per le interazioni DOM, ho finito con il seguente:
$divs = $("div").on('click.passThrough', function (e, ee) {
var $el = $(this).hide();
try {
console.log($el.text());//or console.log(...) or whatever
ee = ee || {
pageX: e.pageX,
pageY: e.pageY
};
var next = document.elementFromPoint(ee.pageX, ee.pageY);
next = (next.nodeType == 3) ? next.parentNode : next //Opera
$(next).trigger('click.passThrough', ee);
} catch (err) {
console.log("click.passThrough failed: " + err.message);
} finally {
$el.show();
}
});
try/catch/finally
viene utilizzato per garantire gli elementi sono mostrato di nuovo, anche se si verifica un errore.
Due meccanismi permettono l'evento click da passare attraverso o meno:
- fissare il conduttore di solo gli elementi selezionati (standard di jQuery).
- namespace l'evento click,
click.passThrough
analogo aevent.stopPropagation()
.
Separatamente o in combinazione, questi meccanismi offrono una certa flessibilità nel controllare l'attaccamento e la propagazione del comportamento "passThrough". Ad esempio, in DEMO, provare a rimuovere la classe p
dall'elemento "b" e vedere come è cambiato il comportamento di propagazione.
Così com'è, il codice deve essere modificato per ottenere un comportamento a livello di applicazione diverso. Una soluzione più generale sarebbe:
- permettere l'attacco di programmazione del comportamento specifica per l'applicazione
- consentono un'inibizione programmatica di propagazione "PassThrough", analogo a
event.stopPropagation()
.
Entrambe queste aspirazioni potrebbe essere ottenuto mediante un evento clickPassthrough
in jQuery, con sottostanti comportamento "PassThrough", ma più lavoro sarebbero coinvolti per conseguire tale. Forse qualcuno vorrebbe provare.
Quanto è cortese da parte tua concedere crediti laddove è dovuto il credito. :) – TheOne
I problemi sorgono quando l'elemento su cui si fa clic è un'ancora –
Se qualcun altro ha lo stesso problema di me: 'if ($ (successivo) .prop (" tagName ") === 'A') {window.location .href = $ (successivo) .attr ('href'); } ' –
Questo non è così facile come si potrebbe pensare. Questa è una soluzione che mi è venuta in mente. L'ho testato solo su Chrome e non ho utilizzato alcun framework.
Il seguente snippet è solo per aggiungere un evento click a ogni div
nel documento, che emette il nome della classe quando viene attivato.
var divs = document.getElementsByTagName("div");
for(var i = 0; i < divs.length; i++) {
divs[i].onclick = function() {
console.log("class clicked: " + this.className);
};
}
Collegamento di un evento click per l'elemento del corpo in modo che ogni singolo evento click viene notato dal nostro script.
if(document.addEventListener) {
document.body.addEventListener("click", countDivs);
} else if(document.attachEvent) {
document.attachEvent("onclick", countDivs);
}
scorrere tutti i div che si desidera controllare (si potrebbe desiderare di registrare qui al tuo campo preferito di div). Genera il loro stile calcolato e controlla se le coordinate del mouse si trovano nel raggio della posizione div più la sua larghezza e altezza. Non attivare l'evento click quando il div è il nostro elemento di origine perché l'evento click è già stato attivato da allora.
function countDivs(e) {
e = e || window.event;
for(var i = 0; i < divs.length; i++) {
var cStyle = window.getComputedStyle(divs[i]);
if(divs[i] !== e.target && e.pageX >= parseInt(cStyle.left) && e.pageX <= (parseInt(cStyle.left) + parseInt(cStyle.width)) && e.pageY >= parseInt(cStyle.top) && e.pageY <= (parseInt(cStyle.top) + parseInt(cStyle.height))) {
divs[i].click();
}
}
}
CSS:
.a, .b, .c {
position: absolute;
height: 100px;
width: 100px;
border: 1px #000 solid
}
.a {
top: 100px;
left: 100px;
}
.b {
top: 120px;
left: 120px;
}
.c {
top: 140px;
left: 140px;
}
HTML:
<div class="a"></div>
<div class="b"></div>
<div class="c"></div>
Ho anche aggiunto un jsFiddle
Come funziona la tua soluzione? Potresti spiegarlo invece di pubblicare semplicemente il codice? –
@FelixKling: ho aggiunto alcune spiegazioni. Penso che sia sufficiente, vero? – Amberlamps
Ottimo! Basta notare che 'e.srcElement' è solo IE (Chrome ha aggiunto alcune delle funzionalità di IEs). La proprietà ufficiale dell'elemento originario è 'e.target'. –
Un modo semplice potrebbe essere quella di utilizzare elementFromPoint():
var clicks = 0,cursorPosition={};
$('div').click(function (e) {
if(typeof cursorPosition.X === 'undefined') {
cursorPosition.X = e.pageX;
cursorPosition.Y = e.pageY;
}
clicks++;
e.stopPropagation();
$(this).addClass('hided');
var underELEM = document.elementFromPoint(cursorPosition.X, cursorPosition.Y);
if (underELEM.nodeName.toUpperCase() === "DIV") $(underELEM).click();
else {
$('#clicks').html("Clicks: " + clicks);
$('.hided').removeClass('hided');
clicks=0;
cursorPosition = {};
}
});
Questo dà il mio 'Clic: 3' quando clicco solo sulle due div inferiori. – Amberlamps
Mi spiace, vedere l'aggiornamento. –
Se vengono impilate elementi assolutamente potrebbe essere più semplice per impilare tutti in un contenitore posizionato, e gestire gli eventi di questo genitore. È quindi possibile manipolare i suoi bambini senza dover misurare nulla.
- 1. Aggiungere un div dinamico al clic
- 2. Rimozione di un pulsante div sul clic - problema: rimozione di tutte le div
- 3. div vicino cursore onclick jQuery
- 4. evento fuoco al clic su un div tranne un collegamento
- 5. Come impostare la posizione di cursore/cursore in un div in contentedabile tra due div.
- 6. Mostra div #id al clic con jQuery
- 7. Cambia altezza div al clic del pulsante
- 8. Cattura clic al di fuori di un div assoluta posizionato
- 9. Non sai come nascondere un div quando si fa clic al di fuori della div
- 10. Nascondi tutte le div con javascript
- 11. come aggiungere div a un div usando angularjs
- 12. jQuery - Rimuovi classe da tutte le div tranne quella su cui ho fatto clic su
- 13. jquery div quando tutte le immagini caricate
- 14. Interrompi un solo menu a discesa dalla chiusura al clic
- 15. Al clic inserire un altro modello
- 16. Come propagare un'eccezione in java
- 17. Al clic, nascondi div e rimuovi l'attributo richiesto
- 18. Non propagare le intestazioni sui reindirizzamenti HTTP
- 19. destinazione al clic
- 20. Doppio clic su un div con contenteditable inside e iframe disabilita div
- 21. Come disabilitare facendo clic all'interno di div
- 22. Come impedire a Python di propagare i segnali ai sottoprocessi?
- 23. Simula fai clic su DIV
- 24. Posiziona il cursore sopra il contenitore div evidenziando le div annidate singolarmente
- 25. Come creare un cursore img a scorrimento continuo?
- 26. Come ottengo tutte le caselle di testo all'interno di un dato div in base al suo nome di classe?
- 27. Come passare eventi click da un div a un altro?
- 28. Cursore IE 8 div e css
- 29. Propagare l'utente principale da REST al livello EJB
- 30. Come propagare il contesto di sicurezza primaverile a JMS?
È l'errore che non è possibile accedere per consolare il messaggio su cui si fa clic? – defau1t
@ defau1t: Vuole che il clic venga visualizzato tre volte nella console quando si fa clic una volta. – Amberlamps
http://jsfiddle.net/vA5WQ/23/ – TheOne