CSS' pointer-events ' альтернатива свойств для IE
у меня есть выпадающее меню навигации, в котором некоторые из заголовков не должны перемещаться на другую страницу при нажатии(эти заголовки открывают выпадающее меню при нажатии), а другие должны перемещаться (у них нет раскрывающегося списка и навигации напрямую).Однако оба типа имеют href
определено им
чтобы решить эту проблему, я добавил следующий css для первого типа заголовков
pointer-events: none;
и он работает нормально.Но поскольку это свойство не поддерживается IE, я ищу для кое-какой работы. Раздражает то, что у меня нет доступа и привилегий для изменения кода HTML и JavaScript полностью.
какие идеи?
12 ответов
Pointer-events-это Mozilla hack, и где он был реализован в браузерах Webkit, вы не можете ожидать увидеть его в браузерах IE еще миллион лет.
однако есть решение, которое я нашел:
Переадресация Событий Мыши Через Слои
Это использует плагин, который использует некоторые не очень известные / понятные свойства Javascript, чтобы взять событие мыши и отправить его в другой элемент.
есть еще один Javascript решение здесь.
обновление за октябрь: по-видимому, он подходит к IE в v11. источник. Спасибо, Тим.
вот еще одно решение, которое очень легко реализовать с помощью 5 строк кода:
- захват события "mousedown" для верхнего элемента (элемент, который вы хотите отключить события указателя).
- в "mousedown" скрыть верхний элемент. использовать.elementFromPoint()' для получения базового элемента.
- отобразить верхний элемент.
- выполнить желаемое событие для базового элемент.
пример:
//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;
});
существует обходной путь для IE-используйте встроенный SVG и установите указатель-события= " нет " в SVG. См. мой ответ в Как заставить Internet Explorer эмулировать события указателя: нет?
стоит отметить, что специально для IE, disabled=disabled
работает для якорных тегов:
<a href="contact.html" onclick="unleashTheDragon();" disabled="disabled">Contact</a>
IE рассматривает это как disabled
элемент и не срабатывает событие click. Однако,disabled
не является допустимым атрибутом в теге якоря. Следовательно, это не будет работать в других браузерах. Для них pointer-events:none
требуется в стилизации.
обновление 1: поэтому добавление следующего правила кажется мне кросс-браузерным решением
обновление 2: Для дальнейшей совместимости, потому что IE не будет формировать стили для якорных тегов с disabled='disabled'
, так они еще будут посмотреть активный. Таким образом, a:hover{}
правило и стиль-хорошая идея:
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;
}
работа с Chrome, IE11 и IE8.
Конечно, выше CSS предполагает, что якорные теги отображаются с disabled="disabled"
вот небольшой скрипт, реализующий эту функцию (вдохновленный Ши Фредерик статья в блоге что Кайл упоминает):
накройте оскорбительные элементы невидимым блоком, используя псевдо-элемент::before
или :after
a:before {
//IE No click hack by covering the element.
display:block;
position:absolute;
height:100%;
width:100%;
content:' ';
}
таким образом, вы нажимаете земли на родительский элемент. Не хорошо, если родитель кликабелен, но работает хорошо в противном случае.
Я потратил почти два дня на поиск решения этой проблемы, и я нашел это, наконец.
Это использует javascript и jquery.
(GitHub) pointer_events_polyfill
Это может использовать плагин javascript для загрузки / копирования.
Просто скопировать/скачать коды с этого сайта и сохраните его как pointer_events_polyfill.js
. Включить javascript для вашего сайта.
<script src="JS/pointer_events_polyfill.js></script>
добавьте этот сценарий jquery в свой сайт
$(document).ready(function(){
PointerEventsPolyfill.initialize({});
});
и не забудьте включить плагин jquery.
это работает! Я могу щелкнуть элементы под прозрачным элементом. Я использую IE 10. Я надеюсь, что это также может работать в IE 9 и ниже.
EDIT: использование этого решения не работает при щелчке текстовых полей под прозрачным элементом. Чтобы решить эту проблему, я использую фокус, когда пользователь нажимает на текстовый.
Javascript:
document.getElementById("theTextbox").focus();
JQuery:
$("#theTextbox").focus();
Это позволяет ввести текст в текстовое поле.
Я нашел другое решение для решения этой проблемы. Я использую jQuery для установки href
-атрибут javascript:;
(Не ' ', или браузер перезагрузит страницу), если ширина окна браузера больше 1'000px. Вам нужно добавить ID в свою ссылку. Вот что я делаю:
// get current browser width
var width = $(window).width();
if (width >= 1001) {
// refer link to nothing
$("a#linkID").attr('href', 'javascript:;');
}
может быть, это полезно для вас.
вы также можете просто" не " добавить url-адрес внутри <a>
тег, я делаю это для меню <a>
бирка управляемая с падениями также. Если нет выпадающего списка, я добавляю url-адрес, но если есть выпадающие списки с <ul> <li>
list я просто удаляю его.
Я столкнулся с аналогичными проблемами:
Я столкнулся с этой проблемой в директиве, я исправил ее, добавив a в качестве родительского элемента и сделав pointer-events: none для этого
вышеуказанное исправление не работало для тега select, затем я добавил курсор:текст (это было то, что я хотел), и это сработало для меня
Если нужен обычный курсор, вы можете добавить курсор:по умолчанию
лучшее решение:
.disabled{filter: alpha(opacity=50);opacity: 0.5;z-index: 1;pointer-events: none;}
отлично работает во всех браузерах