Инициировать событие onmouseover, когда элемент отключен

У меня есть некоторые элементы управления, которые мне нужно отключить, когда у пользователей нет прав редактирования, но иногда они недостаточно широки, чтобы показать весь текст выбранного элемента option. В этом случае я добавил подсказку с ASP.NET и следующий код

ddl.Attributes.Add("onmouseover", "this.title=this.options[this.selectedIndex].title")

Это работает, когда элемент управления включен, но не работает, когда он отключен.

Следующее предупреждение не сработает, когда мышь находится над выбранным элементом:

<select disabled="disabled" onmouseover="alert('hi');">
    <option>Disabled</option>
</select>

См. эту скрипку.

Вопрос. Можно ли запускать событие onmouseover для элементов управления, которые являются disabled?


person KyleMit    schedule 07.08.2013    source источник


Ответы (6)


Отключенные элементы не запускают события, например. пользователи не могут навести или щелкнуть их, чтобы вызвать всплывающее окно (или всплывающую подсказку). Однако вы можете обернуть отключенный элемент DIV и вместо этого прослушивать событие, вызванное этим элементом.

person Diodeus - James MacFarlane    schedule 07.08.2013
comment
не могли бы вы продемонстрировать - person mikewasmike; 07.06.2017
comment
Похоже, что если отключенный элемент занимает 100% div, даже это не сработает. - person Michael S. Miller; 07.02.2020
comment
Сделайте это и используйте mouseenter вместо mouseover, и это сработает. - person Petra1999; 28.10.2020
comment
Проблема в том, что вы теряете курсор HTML «не разрешено» snf курсора указателя, как только кнопка включена - person Chris Pink; 07.04.2021

Обновление: см. комментарий Натана Уильяма за некоторые серьезные ограничения этого подхода. Я обновил скрипку, чтобы более четко проиллюстрировать проблемные области.


В дополнение к тому, что сказал @Diodeus, вы можете использовать jQuery для автоматического создания контейнера div для вас. и оберните его вокруг любых отключенных элементов.

  1. Используйте селектор :disabled, чтобы найти все отключенные элементы.
  2. Затем вызовите метод .wrap() с обратным вызовом функции.
  3. Вы можете использовать this для ссылки на текущий элемент в наборе.
  4. Затем используйте метод .attr(), чтобы получить значение onmouseover из родительского элемента и применить то же значение к новому разд.
$(':disabled').wrap(function() {
    return '<div onmouseover="' + $(this).attr('onmouseover') + '" />';
});

Демо в jsFiddle

person KyleMit    schedule 07.08.2013
comment
Следует отметить, что над самим отключенным элементом остается мертвая зона. Если оболочка имеет блочный стиль, эффект будет неустойчивым; если он имеет встроенный стиль, то мышь никогда не сможет пройти через какую-либо его часть, чтобы вызвать эффект. Элемент наложения z-index будет вести себя более последовательно, но потребует вставки родственного элемента с абсолютным позиционированием относительно оболочки. - person Nathan Williams; 21.03.2017

Я знаю, что это старый пост, но, надеюсь, этот ответ прояснит, как можно реализовать ответ @Diodeus!

Отключенные элементы не запускают события, например. пользователи не могут навести или щелкнуть их, чтобы вызвать всплывающее окно (или всплывающую подсказку). Однако в качестве обходного пути вы можете обернуть <DIV> или <span> вокруг отключенного элемента и вместо этого прослушивать событие, вызванное этим элементом.

ПРИМЕЧАНИЕ! Использование onmouseover и onmouseout в оболочке <DIV> не будет работать должным образом в Chrome (v69). Но будет работать в IE. Вот почему я рекомендую пользователям вместо этого использовать onmouseenter и onmouseleave, которые отлично работают как в IE, так и в Chrome.

   <select disabled="disabled" onmouseover="alert('hi');">
    <option>Disabled</option>
  </select>

  <div onmouseenter="alert('hi');">
    <select disabled="disabled" onmouseover="alert('hi');">
      <option>Disabled with wrapper</option>
    </select>
  </div>

Я собрал скрипт JS с несколькими примерами здесь: http://jsfiddle.net/Dr4co/tg6134ju/< /а>

person Dr4co    schedule 26.10.2018
comment
Спасибо за добавление этого ответа. В последней версии Chrome onmouseenter заменял onmouseover с disabled дочерними элементами, но onmouseleave не заменял onmouseout. Из-за проблемы с onmouseleave мне все равно пришлось добавить псевдоэлемент ::before в оболочку, расположенную поверх дочернего элемента disabled, чтобы заставить onmouseover или onmouseleave срабатывать. - person Greg Venech; 05.05.2021

Я знаю, что это старый пост, но в chrome вы можете установить все события-указатели свойства css, и это должно разрешать события. В других браузерах не проверял.

button[disabled] {
  pointer-events: all;
}

Редактировать:

На самом деле я думаю, что достаточно установить для свойства значение auto. Как прокомментировал @KyleMit, поддержка довольно хорошая.

Я просто использовал это в проекте, где мне нужно было отключить кнопку до тех пор, пока не будут соблюдены некоторые правила проверки, но мне также нужно было запустить проверку при наведении на кнопку. Таким образом, добавление событий-указателей помогло. Я думаю, что это самый простой способ решить проблему, указанную в ОП.

person Andres Zapata    schedule 30.12.2016
comment
Это вообще не работает для меня, использую ли я all или auto. - person Christian Jensen; 15.10.2020

Почему вы не можете добавить заголовок к целевому элементу? заголовок выглядит так же, как всплывающая подсказка. И заголовок работает с отключенными элементами.

когда вы устанавливаете значение вашего выбора, также установите заголовок:

element.value=value;
element.title = element.options[element.selectedIndex].text;
person Justin    schedule 19.01.2016
comment
Джастин, это один из способов (который, я думаю, я мог бы в конечном итоге выбрать) - проблема в том, что есть много выборок, которые условно отключены. Мне нужно было наведение курсора мыши, чтобы заголовок обновлялся соответствующим образом, когда он не был отключен. Но заполнение его правильным заголовком для начала охватывает оба случая. - person KyleMit; 19.01.2016
comment
В Kylemit вы можете добавить для него условие: if(element.classList.contains(addTitle15)){ // добавить заголовок - person Justin; 19.01.2016

есть два решения для этого

<Tooltip title="Tooltip" placement="bottom">
          <div>
            <IconButton disabled>
              <Done />
            </IconButton>
          </div>
        </Tooltip>

или этот, если вы не хотите пропустить вид

<Tooltip title="Tooltip" placement="bottom">
  <IconButton component="div" disabled>
    <Done />
  </IconButton>
</Tooltip>

ссылка

person Mina Fawzy    schedule 23.07.2019