159

I have a drop down navigation menu in which some of the title should not navigate to other page when clicked(these title open a drop down menu when clicked on) while others should navigate (these dont have dropdown and navigate directly).However, both types have href defined to them

To solve this i added the following css for the former type of titles

pointer-events: none;

and it is working fine.But since this property is not supported by IE, i am looking for some work-around. The annoying thing is that i don't have access and privilege to change the HTML and JavaScript code completely.

Any ideas?

7
  • 2
    Is there a way to gain access to the HTML and scripts? Try talking to whoever gave you the task. Commented May 2, 2011 at 8:55
  • @Kyle Its not exactly a problem of privilege,there are some technical difficulties also to modify the html/javascript code Commented May 2, 2011 at 8:57
  • 2
    Here is the answer stackoverflow.com/questions/3680429/… Commented May 11, 2012 at 8:49
  • stackoverflow.com/questions/3680429/… Commented May 11, 2012 at 8:50
  • 3
    Note that pointer-events is now in IE11+ Commented Sep 18, 2014 at 7:33

12 Answers 12

89

Pointer-events is a Mozilla hack and where it has been implemented in Webkit browsers, you can't expect to see it in IE browsers for another million years.

There is however a solution I found:

Forwarding Mouse Events Through Layers

This uses a plugin that uses some not well known/understood properties of Javascript to take the mouse event and send it to another element.

There is also another Javascript solution here.

Update for October 2013: apparently it's coming to IE in v11. Source. Thanks Tim.

Sign up to request clarification or add additional context in comments.

13 Comments

Documentation of ie9 says it supports this property(i've not tried ie9 yet however).Anyway, i already had ideas in my mind which are given in the links but as i was looking for some css specific solution i cannot use them. I will try to modify the html/js code rather spending time on this problem.Thanks a lot for your time and help
At W3C, this issue went under debate due to click-hijacking. Rule of thumb: as soon as W3C publish the candidate recommendation, IE team will implement it & there's always a lesson in haste makes waste. Besides, Mozilla said it all "Warning: The use of pointer-events in CSS for non-SVG elements is experimental. The feature used to be part of the CSS3 UI draft specification but, due to many open issues, has been postponed to CSS4."
According to caniuse.com, CSS pointer events are coming to IE 11. caniuse.com/#feat=pointer-events
"you can't expect to see it in IE browsers for another million years." Took only 3 years...
@KyleSevenoaks i guess everyone underestimated Microsoft. Current IE development is awesome, especially status.modern.ie. They only need to kill IE8 and 9 ASAP and we're good to go into sweet heaven of modern development!
|
20

Here is another solution that is very easy to implement with 5 lines of code:

  1. Capture the 'mousedown' event for the top element (the element you want to turn off pointer events).
  2. In the 'mousedown' hide the top element.
  3. Use 'document.elementFromPoint()' to get the underlying element.
  4. Unhide the top element.
  5. Execute the desired event for the underlying element.

Example:

//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;

});

4 Comments

This worked for me. I prefer small fixes that I can put into my js code instead adding a lot of polyfills ;)
This is a creative solution, I like it. The only problem is this adds unnecessary processing to browsers where the point-events do work. It would be great to make this execute conditionally IE browsers only.
I agree, its a quickly implementable to a perplexing issue, but in fact in my implementation of it, I only apply it if the browser is IE, you place it inside this check: if (navigator.appName == 'Microsoft Internet Explorer') { ... logic goes here .. }
this works very well! since ie 11 supposedly started supporting pointer-events, I just wrap it inside this clause: if (navigator.userAgent.toLowerCase().indexOf('msie') > 0) THANKS!
17

There's a workaround for IE - use inline SVG and set pointer-events="none" in SVG. See my answer in How to make Internet Explorer emulate pointer-events:none?

Comments

11

It's worth mentioning that specifically for IE, disabled=disabled works for anchor tags:

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

IE treats this as an disabled element and does not trigger click event. However, disabled is not a valid attribute on an anchor tag. Hence this won't work in other browsers. For them pointer-events:none is required in the styling.

UPDATE 1: So adding following rule feels like a cross-browser solution to me

UPDATE 2: For further compatibility, because IE will not form styles for anchor tags with disabled='disabled', so they will still look active. Thus, a:hover{} rule and styling is a good 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;
        }

Working on Chrome, IE11, and IE8.
Of course, above CSS assumes anchor tags are rendered with disabled="disabled"

1 Comment

This didn't work for me. In IE9-10 onclick functions still do execute.
6

Here's a small script implementing this feature (inspired by the Shea Frederick blog article that Kyle mentions):

1 Comment

This doesn't work if the elements are anchor tags, I believe. At least, it didn't work for me.
4

Cover the offending elements with an invisible block, using a pseudo element: :before or :after

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

Thus you're click lands on the parent element. No good, if the parent is clickable, but works well otherwise.

1 Comment

I used a similar idea with the disabled attribute. In IE adding the disabled attribute prevents click events, but if there are children they will still trigger the click. covering the children so they are not clickable is a great solution to this. I had to use a background color with opacity 0 to have IE register there was an actual element there.
4

I spent almost two days on finding the solution for this problem and I found this at last.

This uses javascript and jquery.

(GitHub) pointer_events_polyfill

This could use a javascript plug-in to be downloaded/copied. Just copy/download the codes from that site and save it as pointer_events_polyfill.js. Include that javascript to your site.

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

Add this jquery scripts to your site

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

And don't forget to include your jquery plug-in.

It works! I can click elements under the transparent element. I'm using IE 10. I hope this can also work in IE 9 and below.

EDIT: Using this solution does not work when you click the textboxes below the transparent element. To solve this problem, I use focus when the user clicks on the textbox.

Javascript:

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

JQuery:

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

This lets you type the text into the textbox.

Comments

1

I've found another solution to solve this problem. I use jQuery to set the href-attribute to javascript:; (not ' ', or the browser will reload the page) if the browser window width is greater than 1'000px. You need to add an ID to your link. Here's what I'm doing:

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

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

Maybe it's useful for you.

Comments

0

Use OnClientClick = "return false;"

Comments

0

You can also just "not" add a url inside the <a> tag, i do this for menus that are <a> tag driven with drop downs as well. If there is not drop down then i add the url but if there are drop downs with a <ul> <li> list i just remove it.

Comments

0

I faced similar issues:

  1. I faced this issue in a directive, i fixed it adding a as its parent element and making pointer-events:none for that

  2. The above fix did not work for select tag, then i added cursor:text (which was what i wanted) and it worked for me

If a normal cursor is needed you could add cursor:default

Comments

-2

Best solution:

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

Runs perfectly on all browsers

1 Comment

Except for IE version < 11, where pointer events isn't supported. I think you missed the point.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.