Интересная проблема - это происходит, например, в IE, но не в Chrome. Вот решение, которое я протестировал в Chrome и IE (похоже, работает).
Расширенная версия:
Скрипт в заголовке страницы:
<script>
var buff; //Must have global scope
var input = document.getElementById("testinput"); //Defined here to save cpu (instead of on every key press).
function CheckPreBuff(e)
{
var ev = window.event ? event : e; //Get the event object for IE or FF
var unicode = (typeof(ev.keyCode) != "undefined")? ev.keyCode : ev.charCode;
if(unicode != 27) buff = input.value; //The 'escape' key has a unicode value of 27
else input.value = buff; //Only set the input contents when needed, so not to waste cpu.
}
</script>
Где 'testinput' - это вход, на котором мы отключаем escape. Тестовый ввод HTML ниже:
<input id="testinput" onkeypress="CheckPreBuff();" onkeyup="CheckPreBuff();" type="text"/>
Обратите внимание, что использовались как 'onkeyup', так и 'onkeypress' - технически требуется только 'onkeyup', хотя использование 'onkeypress' предотвращает мгновенное исчезновение текстового поля, пока нажата клавиша выхода.
Сводка вручную + предотвращение ошибок + поддержка нескольких входов (если вы предпочитаете)
Скрипт в шапке:
<script>
var buff = [];
function InitCPB(obj){if(typeof(obj)=="undefined")return;buff[0]=obj;buff[1]="";obj.onkeypress=CPB;obj.onkeyup=CPB;}
function CPB(e){if(typeof((buff[0]))=="undefined")return;var ev=window.event?event:e;(((typeof(ev.keyCode)!="undefined")?ev.keyCode:ev.charCode)!=27)?buff[1]=(buff[0]).value:(buff[0]).value=buff[1];}
</script>
testinput html tag (хотя идентификатор больше не нужен):
<input onfocus="InitCPB(this);" type="text"/>
Оба метода сохраняют копию того, что текстовые вводы содержали до нажатия следующей клавиши, если нажатой клавишей было 'escape', Unicode 27, тогда предыдущая текстовая запись была помещена обратно в текстовое поле (это дискриминация, поэтому скрипт не добавляет слишком большую нагрузку на браузер при каждом нажатии клавиши).
Во второй версии допускается несколько текстовых вводов на одной и той же странице с отключенной клавишей Escape - при условии, что для них установлен атрибут onFocus, как указано выше (несколько элементов не будут мешать друг другу). Он также проверяет объекты, которые передаются ему, определены, чтобы предотвратить случайную неправильную реализацию, вызывающую IE сердечный приступ!
Надеюсь, это поможет.