Значения ключевых слов JavaScript: "undefined" в Internet Explorer 8

У меня возникли проблемы с некоторыми JavaScript, которые я написал, но только с Internet Explorer 8. У меня нет проблем с выполнением этого в Internet Explorer 7 или ранее или в Mozilla Firefox 3.5 или ранее. Он также выполняется правильно, когда я использую режим совместимости в Internet Explorer 8.

Что я делаю, это переопределение нажатия клавиши Enter, когда пользователь вводит значение в текстовое поле. Итак, на моем элементе у меня есть это:

<asp:TextBox ID="ddPassword" runat="server" TextMode="Password" onkeypress="doSubmit(event)" Width="325"></asp:TextBox>

И затем у меня есть следующий метод JavaScript:

function doSubmit(e)
{
    var keyCode = (window.Event) ? e.which : e.keyCode;
    if (keyCode == 13)
        document.getElementById("ctl00_ContentPlaceHolder1_Login").click();  
}

Опять же, все это прекрасно работает практически с любым другим браузером. Internet Explorer 8 просто смущает меня.

Любая помощь, которую вы можете получить, очень ценится. Спасибо!

ОБНОВЛЕНИЕ: Спасибо всем за вашу быструю обратную связь. И Крис Пеббл, и Брайан Кайл помогли этому решению. Я наградил Брайана "ответ", чтобы помочь его репутации. Спасибо всем!

Ответ 1

Похоже, что в IE8 свойство keyCode window.Event равно undefined, но это же свойство window.Event (обратите внимание на строчный e) имеет значение. Вы можете попробовать использовать window.Event.

function doSubmit(e)
{
   var keyCode = (window.event) ? e.which : e.keyCode;
   if (keyCode == 13)
      document.getElementById("ctl00_ContentPlaceHolder1_Login").click();  
}

Ответ 2

Просто догадайтесь, попробуйте следующее:

var keyCode = e.keyCode ? e.keyCode : e.which;

Ответ 3

В моем коде он работал следующим образом:

var kcode = (window.event) ? event.keyCode : event.which;

Ответ 4

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

map={}//declare object to hold data
onkeydown=onkeyup=function(e){
    e=e||event//if e doesn't exist (like in IE), replace it with window.event
    map[e.keyCode]=e.type=='keydown'?true:false
    //Check for keycodes
}

Альтернативным методом будет разделение событий onkeydown и onkeyup и явное определение подэлементов карты в каждом событии:

map={}
onkeydown=function(e){
    e=e||event
    map[e.keyCode]=true
}
onkeyup=function(e){
    e=e||event
    map[e.keyCode]=false
}

В любом случае все отлично. Теперь, чтобы фактически обнаружить нажатия клавиш, метод, включая исправления ошибок, следующий:

//[in onkeydown or onkeyup function, after map[e.keyCode] has been decided...]
if(map[keycode]){
    //do something
    map={}
    return false
}

map[keycode] представляет собой конкретный код ключа, например 13 для Enter, или 17 для CTRL.

Строка map={} очищает объект карты, чтобы она не удерживалась на клавишах в случаях нефокусировки, а return false предотвращает появление, например, диалогового окна "Закладки", когда вы проверяете CTRL+D. В некоторых случаях вы можете заменить его на e.preventDefault(), но я обнаружил, что return false будет более эффективным в большинстве случаев. Чтобы получить четкую перспективу, попробуйте с помощью CTRL+D. CTRL 17, а D - 68. Обратите внимание, что без строки return false откроется диалоговое окно "Закладки".

Ниже приведены некоторые примеры:

if(map[17]&&map[13]){//CTRL+ENTER
    alert('CTRL+ENTER was pressed')
    map={}
    return false
}else if(map[13]){//ENTER
    alert('Enter was pressed')
    map={}
    return false
}

Следует иметь в виду, что меньшие комбинации должны быть последними. Всегда помещайте большие комбинации сначала в цепочку if..else, поэтому вы не получаете предупреждения как для Enter, так и CTRL+ENTER в то же время.

Теперь, полный пример, чтобы "собрать все вместе". Предположим, вы хотите предупредить сообщение, содержащее инструкции для входа в систему, когда пользователь нажимает SHIFT+? и регистрируется, когда пользователь нажимает Enter. Этот пример также совместим с кросс-браузером, то есть он также работает в IE:

map={}
keydown=function(e){
    e=e||event
    map[e.keyCode]=true
    if(map[16]&&map[191]){//SHIFT+?
        alert('1) Type your username and password\n\n2) Hit Enter to log in')
        map={}
        return false
    }else if(map[13]){//Enter
        alert('Logging in...')
        map={}
        return false
    }
}
keyup=function(e){
    e=e||event
    map[e.keyCode]=false
}
onkeydown=keydown
onkeyup=keyup//For Regular browsers
try{//for IE
    document.attachEvent('onkeydown',keydown)
    document.attachEvent('onkeyup',keyup)
}catch(e){
    //do nothing
}

Обратите внимание, что некоторые специальные клавиши имеют разные коды для разных движков. Но, как я протестировал, это работает в каждом браузере, который у меня есть на моем компьютере, включая Maxthon 3, Google Chrome, Internet Explorer (9 и 8) и Firefox.

Надеюсь, это было полезно.

Ответ 5

попробуйте следующее:

function checkKeyCode(e){  
    if (!e) e = window.event;   var kCd =  e.which ||  e.keyCode;
    return kCd;
}

Ответ 6

Попробуйте добавить событие onkeyup и вызовите ту же функцию.

TIP: Вы можете добавить debugger; в начало doSubmit, чтобы установить разрыв, тогда вы можете проверить keyCode.

Ответ 7

Я думаю, что window.Event.keyCode работает в IE8 (я не могу проверить сейчас, хотя)

Ответ 8

Или что-то в этом роде. var keyCode = e.which || e.keyCode;