Значения ключевых слов 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;