css alternativa alla proprietà 'pointer-events' per IE


155

Ho un menu di navigazione a discesa in cui parte del titolo non dovrebbe passare ad un'altra pagina quando viene cliccato (questi titoli aprono un menu a discesa quando si fa clic) mentre altri dovrebbero navigare (questi non hanno menu a discesa e navigare direttamente). i tipi li hanno hrefdefiniti

Per risolvere questo ho aggiunto i seguenti css per il precedente tipo di titoli

pointer-events: none;

e funziona benissimo. Ma poiché questa proprietà non è supportata da IE, sto cercando qualche soluzione. La cosa fastidiosa è che non ho accesso e privilegio per cambiare completamente il codice HTML e JavaScript .

Qualche idea?


2
C'è un modo per accedere all'HTML e agli script? Prova a parlare con chiunque ti abbia affidato il compito.
Kyle,

@Kyle Non è esattamente un problema di privilegio, ci sono alcune difficoltà tecniche anche per modificare il codice html / javascript
anupam



3
Si noti che pointer-eventsora è in IE11 +
David Storey il

Risposte:


88

Pointer-events è un hack di Mozilla e dove è stato implementato nei browser Webkit, non puoi aspettarti di vederlo nei browser IE per un altro milione di anni.

C'è comunque una soluzione che ho trovato:

Inoltro di eventi del mouse tramite livelli

Questo utilizza un plugin che utilizza alcune proprietà non ben note / comprese di Javascript per prendere l'evento del mouse e inviarlo a un altro elemento.

C'è anche un'altra soluzione Javascript qui .

Aggiornamento per ottobre 2013 : apparentemente arriverà a IE nella v11. Fonte . Grazie Tim.


4
La documentazione di ie9 dice che supporta questa proprietà (non ho ancora provato ie9). Comunque, avevo già in mente idee che sono date nei link ma mentre cercavo una soluzione specifica per i CSS non posso usarle. Cercherò di modificare il codice html / js piuttosto dedicando tempo a questo problema.Grazie mille per il tuo tempo e aiuto
anupam

11
Al W3C, questo problema è stato oggetto di dibattito a causa del click-hijacking . Regola empirica: non appena il W3C pubblica la raccomandazione del candidato, il team di IE la implementerà e c'è sempre una lezione di fretta che fa sprecare . Inoltre, Mozilla ha detto tutto " Avvertenza: l'uso di eventi puntatore in CSS per elementi non SVG è sperimentale. La funzione faceva parte della specifica della bozza dell'interfaccia utente CSS3 ma, a causa di molti problemi aperti, è stata posticipata a CSS4 . "
corvo vulcanico,

8
Secondo caniuse.com, gli eventi dei puntatori CSS stanno arrivando a IE 11. caniuse.com/#feat=pointer-events
Tim

4
Questo non è un motivo per sottovalutare una risposta @eyurdakul
scumah

14
"you can't expect to see it in IE browsers for another million years."Ci sono voluti solo 3 anni ...
ProblemsOfSumit

20

Ecco un'altra soluzione che è molto facile da implementare con 5 righe di codice:

  1. Cattura l'evento 'mousedown' per l'elemento superiore (l'elemento che desideri disattivare gli eventi puntatore).
  2. Nel 'mousedown' nascondi l'elemento in alto.
  3. Utilizzare 'document.elementFromPoint ()' per ottenere l'elemento sottostante.
  4. Scopri l'elemento in alto.
  5. Eseguire l'evento desiderato per l'elemento sottostante.

Esempio:

//This is an IE fix because pointer-events does not work in IE
$(document).on('mousedown', '.TopElement', function (e) {

    $(this).hide();
    var BottomElement = document.elementFromPoint(e.clientX, e.clientY);
    $(this).show();
    $(BottomElement).mousedown(); //Manually fire the event for desired underlying element

    return false;

});

2
Questo ha funzionato per me. Preferisco piccole correzioni che posso inserire nel mio codice js invece di aggiungere molti polyfill;)
dippas

Questa è una soluzione creativa, mi piace. L'unico problema è questo aggiunge l'elaborazione inutile browser dove gli eventi puntuali fanno il lavoro. Sarebbe bello che esegua solo i browser IE condizionatamente.
Trevor,

Sono d'accordo, è rapidamente implementabile per un problema sconcertante, ma in effetti nella mia implementazione, lo applico solo se il browser è IE, lo metti dentro questo controllo: if (navigator.appName == 'Microsoft Internet Explorer' ) {... la logica va qui ..}
MarzSocks

3
funziona molto bene! da quando 11 presumibilmente hanno iniziato a supportare gli eventi puntatore, lo inserisco semplicemente in questa clausola: if (navigator.userAgent.toLowerCase (). indexOf ('msie')> 0) GRAZIE!
Hank


10

Vale la pena ricordare che specificamente per IE, disabled=disabledfunziona per i tag di ancoraggio:

<a href="contact.html" onclick="unleashTheDragon();" disabled="disabled">Contact</a>

IE considera questo come un disabledelemento e non attiva un evento clic. Tuttavia, disablednon è un attributo valido su un tag anchor. Quindi questo non funzionerà in altri browser. Per loro pointer-events:noneè richiesto nella progettazione.

UPDATE 1 : Così l'aggiunta seguente regola si sente come una soluzione cross-browser per me

Update 2 : Per ulteriori compatibilità, perché IE non si formerà stili per tag di ancoraggio con disabled='disabled', in modo che sarà ancora guardare attiva. Pertanto, a:hover{}regola e stile sono una buona idea:

a[disabled="disabled"] {
        pointer-events: none; /* this is enough for non-IE browsers */
        color: darkgrey;      /* IE */
    }
        /* IE - disable hover effects */   
        a[disabled="disabled"]:hover {
            cursor:default;
            color: darkgrey;
            text-decoration:none;
        }

Funziona su Chrome, IE11 e IE8.
Naturalmente, sopra CSS si presuppone che i tag di ancoraggio siano resi condisabled="disabled"


1
Questo non ha funzionato per me. In IE9-10 le funzioni onclick continuano a essere eseguite.
sicuramente il


4

Coprire gli elementi offensivi con un blocco invisibile, usando uno pseudo elemento: :beforeo:after

a:before {
//IE No click hack by covering the element.
  display:block;
  position:absolute;
  height:100%;
  width:100%;
  content:' ';
}

In questo modo il tuo clic atterra sull'elemento principale. Non va bene, se il genitore è cliccabile, ma funziona bene altrimenti.


1
Ho usato un'idea simile con l'attributo disabilitato. In IE l'aggiunta dell'attributo disabilitato impedisce gli eventi di clic, ma se sono presenti figli, essi attiveranno comunque il clic. coprire i bambini in modo che non siano cliccabili è un'ottima soluzione a questo. Ho dovuto usare un colore di sfondo con opacità 0 per avere il registro IE lì c'era un elemento reale.
Blake Plumb,

4

Ho trascorso quasi due giorni a trovare la soluzione a questo problema e alla fine l'ho trovato.

Questo utilizza javascript e jquery.

(GitHub) pointer_events_polyfill

Questo potrebbe utilizzare un plug-in javascript per essere scaricato / copiato. Basta copiare / scaricare i codici da quel sito e salvarlo come pointer_events_polyfill.js. Includi quel javascript sul tuo sito.

<script src="JS/pointer_events_polyfill.js></script>

Aggiungi questi script jquery al tuo sito

$(document).ready(function(){
    PointerEventsPolyfill.initialize({});
});

E non dimenticare di includere il plug-in jquery.

Funziona! Posso fare clic sugli elementi sotto l'elemento trasparente. Sto usando IE 10. Spero che possa funzionare anche in IE 9 e versioni precedenti.

MODIFICA: l' utilizzo di questa soluzione non funziona quando si fa clic sulle caselle di testo sotto l'elemento trasparente. Per risolvere questo problema, utilizzo lo stato attivo quando l'utente fa clic sulla casella di testo.

Javascript:

document.getElementById("theTextbox").focus();

JQuery:

$("#theTextbox").focus();

Ciò consente di digitare il testo nella casella di testo.


1

Ho trovato un'altra soluzione per risolvere questo problema. Uso jQuery per impostare href-attribute su javascript:;(non '', oppure il browser ricaricherà la pagina) se la larghezza della finestra del browser è maggiore di 1'000px. Devi aggiungere un ID al tuo link. Ecco cosa sto facendo:

// get current browser width
var width = $(window).width();
if (width >= 1001) {

    // refer link to nothing
    $("a#linkID").attr('href', 'javascript:;'); 
}

Forse è utile per te.



0

Puoi anche "non" aggiungere un URL all'interno del <a>tag, lo faccio anche per i menu che sono <a>guidati da tag con menu a discesa. Se non è presente il menu a discesa, aggiungo l'URL, ma se ci sono dei menu a discesa con un <ul> <li>elenco, lo rimuovo.


0

Ho affrontato problemi simili:

  1. Ho affrontato questo problema in una direttiva, l'ho risolto aggiungendo a come elemento padre e creando eventi puntatore: nessuno per quello

  2. La correzione precedente non ha funzionato per il tag select, quindi ho aggiunto il cursore: text (che era quello che volevo) e ha funzionato per me

Se è necessario un cursore normale, è possibile aggiungere il cursore: impostazione predefinita


-1

Soluzione migliore:

.disabled{filter: alpha(opacity=50);opacity: 0.5;z-index: 1;pointer-events: none;}

Funziona perfettamente su tutti i browser


3
Ad eccezione della versione IE <11, in cui gli eventi del puntatore non sono supportati. Penso che tu abbia perso il punto.
prigione-microfono
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.