Несколько событий keyup в одном JS FILE - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть файл JS для моей веб-страницы HTML.Я хочу проверить 4 вещи.Если они нажимают число, 1-4 на клавиатуре, они переводят их на указанный URL-адрес.Сценарий работает, но только если он у меня есть.

Когда я помещаю все 4 события в файл js, работает только последнее / самое последнее.Есть ли какой-то синтаксис, который я делаю неправильно, что мешает работе всех 4 из них?

Чтобы объяснить, используя этот код, выполняется только эта часть скрипта:

//If they hit keypad number 4
document.body.onkeyup = function(e){
    if(e.keyCode == 52){
        window.location.href = "foo";

JS:

//If they hit keypad number 1
document.body.onkeyup = function(e){
    if(e.keyCode == 49){
        window.location.href = "http://localhost:1337/trail";
    }
}
//If they hit keypad number 2
document.body.onkeyup = function(e){
    if(e.keyCode == 50){
        window.location.href = "foo";
    }
}
//If they hit keypad number 3
document.body.onkeyup = function(e){
    if(e.keyCode == 51){
        window.location.href = "http://localhost:1337/topten";
    }
}
//If they hit keypad number 4
document.body.onkeyup = function(e){
    if(e.keyCode == 52){
        window.location.href = "foo";
    }
}

Ответы [ 7 ]

0 голосов
/ 27 сентября 2018

Это поведение можно объяснить следующим образом: вы пытались назначить функцию событию onkeyup.Это происходит так же, как и при работе с переменными.Допустим,

var key = 1; 

- это «сокращенный» код для

document.body.onkeyup = function(e){
  // action for keypad 1
}

, а затем, при назначении другой функции обработки событий для onkeyup, вы выполняете

key = 2;

Задайте себе вопрос: содержит ли переменная key 1?Нет. Это переписывается вышеприведенным утверждением.key держит 2 сейчас.1 "потерян".По этой причине выполняется только последний обработчик событий (для клавиатуры 4).Последнее назначение перезаписало предыдущее назначение.

Чтобы обойти это, у вас есть две опции:

  1. сгруппировать действия события в одну функцию
  2. использовать EventTarget.addEventListener

С опцией 1 вы можете сгруппировать свои действия в одну функцию, как в интерактивном примере ниже:

// input acts as your document.body
const inp = document.getElementById('foo');

inp.onkeyup = function(e) {
  if(e.keyCode == 49) {
    console.log('pressed keyCode 49'); // press 1
  }
  else if(e.keyCode == 50) {
    console.log('pressed keyCode 50'); // press 2
  }
  else if(e.keyCode == 51) {
    console.log('pressed keyCode 51'); // press 3
  }
  else if(e.keyCode == 52) {
    console.log('pressed keyCode 52'); // press 4
  }
};
<input id="foo" type="text" placeholder="type something">

Но иногда это не гибко.Возможно, вы хотите выполнить два разных действия с событием keyup.Конечно, вы можете сгруппировать это в одну функцию, но что если другой js-файл перезаписывает функцию?Или другой фрагмент в файле js?Это не продуктивно.

Чтобы предотвратить это, вы можете использовать option 2 : .addEventListener, который является более надежным подходом.Ниже приведен интерактивный пример:

// input acts as your document.body
const inp = document.getElementById('foo');

inp.addEventListener('keyup', function(e) {
  if(e.keyCode == 49) {
    console.log('first function: keyCode 49'); // press 1
  }
}); 
inp.addEventListener('keyup', function(e) {
  if(e.keyCode == 50) {
    console.log('second function: keyCode 50'); // press 2
  }
});
<input id="foo" type="text" placeholder="type something">

Кроме того, я хочу добавить еще одно предложение: вы использовали .keyCode, который устарел.Вы все еще можете использовать, но это не поощряется.Вполне возможно, что разработчики браузеров решат отказаться от этого в будущем.Это приводит к неработающему коду.Проблема в том, что каждый браузер / ОС имеет свои собственные коды клавиш, что делает его менее надежным.

Для чистого подхода, пожалуйста, рассмотрите возможность использования KeyboardEvent.code

0 голосов
/ 27 сентября 2018

Ответ большинства людей будет работать, однако, чтобы просто избежать дублирования кода и тирады операторов 'IF', я бы просто использовал оператор switch следующим образом:

document.body.onkeyup = function(e){
    switch(e.keyCode) {
        case 49:
            window.location.href = "http://localhost:1337/trail";
            break;
        case 50:
            window.location.href = "foo";
            break;
        case 51:
            window.location.href = "http://localhost:1337/topten";
            break;
        case 52:
            window.location.href = "foo";
            break;
    }
}
0 голосов
/ 27 сентября 2018

Может быть, добавить все ваши if внутри одного слушателя событий:

document.body.addEventLister("keydown", function(e) {
    if (e.key == "Digit1") {
        window.location.href = "http://localhost:1337/trail";
    }
    if (e.key == "Digit2") {
        window.location.href = "foo";
    }
     if (e.key == "Digit3") {
        window.location.href = "http://localhost:1337/topten";
    }
    if (e.keyCode == "Digit4") {
        window.location.href = "foo";
    }
}
0 голосов
/ 27 сентября 2018

Да, существует альтернативный синтаксис, позволяющий добавлять несколько обработчиков событий к одному и тому же объекту, не перекрывая друг друга.

addEventListener('keyup', functionHere );

/*
// This will work without overriding other functions...
//If they hit keypad number 1
document.body.addEventListener("keyup", function(e){
    if(e.keyCode == 49){
        window.location.href = "http://localhost:1337/trail";
    }
});
//If they hit keypad number 2
document.body.addEventListener("keyup", function(e){
    if(e.keyCode == 50){
        window.location.href = "foo";
    }
});
//If they hit keypad number 3
document.body.addEventListener("keyup", function(e){
    if(e.keyCode == 51){
        window.location.href = "http://localhost:1337/topten";
    }
});
//If they hit keypad number 4
document.body.addEventListener("keyup", function(e){
    if(e.keyCode == 52){
        window.location.href = "foo";
    }
});
*/

// It may be best to combine them all even when using this method...
document.body.addEventListener("keyup", function(e) {
  //If they hit keypad number 1
  if (e.keyCode == 49) {
    window.location.href = "http://localhost:1337/trail";
  }
  //If they hit keypad number 2
  if (e.keyCode == 50) {
    window.location.href = "foo";
  }
  //If they hit keypad number 3
  if (e.keyCode == 51) {
    window.location.href = "http://localhost:1337/topten";
  }
  //If they hit keypad number 4
  if (e.keyCode == 52) {
    window.location.href = "foo";
  }
});
0 голосов
/ 27 сентября 2018

Если вы поместите все свои условия в одну и ту же функцию, она будет отлично работать.В противном случае вы будете перезаписывать свою функцию каждый раз.Вот почему у вас возникла проблема, когда единственное работающее событие было последним.Последнее, попробуйте использовать if, а затем else if.В противном случае вы будете проверять все условия каждый раз без какой-либо причины.

//If they hit keypad number 1
document.body.onkeyup = function(e){
    if(e.keyCode == 49){
        window.location.href = "http://localhost:1337/trail";
    }
    else if(e.keyCode == 50){
        window.location.href = "foo";
    }
    else if(e.keyCode == 51){
        window.location.href = "http://localhost:1337/topten";
    }
    else if(e.keyCode == 52){
        window.location.href = "foo";
    }
}
0 голосов
/ 27 сентября 2018

Вы переопределяете обработчик событий, вам нужна там одна функция.попробуйте этот параметр:

//If they hit keypad number 1
document.body.onkeyup = function(e){
    if(e.keyCode == 49){
        window.location.href = "http://localhost:1337/trail";
    } else if(e.keyCode == 50){
        window.location.href = "foo";
    } else if(e.keyCode == 51){
        window.location.href = "http://localhost:1337/topten";
    } else if(e.keyCode == 52){
        window.location.href = "foo";
    }
}

Или вместо него можно использовать переключатель.

0 голосов
/ 27 сентября 2018

Привет и добро пожаловать в StackOverflow;)

Каждый раз вы регистрируете новый слушатель события onkeyup.Попробуйте поместить все операторы if в один слушатель следующим образом:

//If they hit keypad number 1
document.body.onkeyup = function(e){
    if(e.keyCode == 49){
        window.location.href = "http://localhost:1337/trail";
    }
    if(e.keyCode == 50){
        window.location.href = "foo";
    }
     if(e.keyCode == 51){
        window.location.href = "http://localhost:1337/topten";
    }
    if(e.keyCode == 52){
        window.location.href = "foo";
    }
}

Надеюсь, это поможет.

...