IE — запретить фокус (щелчок, двойной щелчок) в поле выбора, если оно имеет определенный класс

Я использую javascript для имитации отключенного элемента выбора. На самом деле я не могу отключить его, так как валидаторы .net не работают, но это уже другая история.

У меня есть следующая функция:

function preventFocus(e) {
  if ($(this).hasClass("disabled")) {
    e.preventDefault();
    this.blur();
  }
}

Здесь это называется:

$("#ProvinceID").toggleClass("disabled").bind('focus click dblclick', preventFocus);

Двойной щелчок по полю выбора в IE по-прежнему позволяет отображать и выбирать элементы. Я попробовал панель инструментов разработчика IE, и e.type отображается как фокус и dblclick. Это ошибка IE или мне нужно поймать какое-то другое событие? Я тоже пробовал фокусин.

Спасибо!


person ScottE    schedule 10.02.2010    source источник


Ответы (2)


Это с опозданием на 4 года, но я только что обнаружил, что на самом деле есть способ заставить IE ≤ 8 делать то, что e.preventDefault() на mousedown делает в других браузерах (что предотвращает выбор и блокирует фокус): установите атрибут unselectable ! http://jsbin.com/yagekiji/1

Обратите внимание, что в отличие от всегда предлагаемых обходных путей, которые всегда сводятся к setTimeout(function() { thingIDidntWantFocusStolenFrom.focus(); }), это в первую очередь предотвращает кражу фокуса целью mousedown!

Что забавно в unselectable, так это то, что оно не наследуется, поэтому его часто упускают из виду в пользу события selectstart (которое всплывает, и e.preventDefault() на котором предотвращает выбор, но не предотвращает фокусировку) или устанавливают на каждый элемент-потомок с обходом дерева (например, ответ StackOverflow, который первым подсказал мне, что это возможно, или Тим серия из почти идентично ответы), но на самом деле вы можете просто установить его на event.target на mousedown.

(Кроме того, билет jQuery: http://bugs.jquery.com/ticket/10345)

person Han Seoul-Oh    schedule 30.04.2014

Я не знаю, может это просто опечатка, но вы должны использовать e.preventDefault(); похоже, вы пропустили скобки.

person Mike Sherov    schedule 10.02.2010
comment
опечатка, да; ответ, нет. Спасибо хоть. - person ScottE; 10.02.2010