동일한 함수를 트리거하는 jQuery 여러 이벤트


976

을 사용하는 방법이 있을까요 keyup, keypress, blur, 및 change이벤트는 한 줄에 같은 함수를 호출하거나 내가 별도로 어떻게해야합니까?

내가 가진 문제는 db 조회로 일부 데이터의 유효성을 검사해야하며 상자에 입력하거나 붙여 넣었는지 여부에 관계없이 유효성 검사를 놓치지 않도록하고 싶습니다.

답변:


1791

.on()함수를 여러 이벤트에 바인딩하는 데 사용할 수 있습니다 .

$('#element').on('keyup keypress blur change', function(e) {
    // e.type is the type of event fired
});

또는 함수를 매개 변수로 일반 이벤트 함수에 전달하십시오.

var myFunction = function() {
   ...
}

$('#element')
    .keyup(myFunction)
    .keypress(myFunction)
    .blur(myFunction)
    .change(myFunction)

3
공백으로 구분 된 이벤트로 이름 간격도 어떻게 포함합니까? .on('keyup.foo keypress.foo blur.foo change.foo', …)또는 .on('keyup keypress blur change .foo', …)?
Sukima

24
이것에 대한 문제는 myFunction이 여러 번 호출되어 방지하려는 것입니다.
Esger

2
이 함수에서 매개 변수를 전달하려면 어떻게해야합니까?
kushalvm

@Esger 어쨌든 이것을 할 수 있습니까? 모바일에서는 항상해야합니다 on('click tap', e => {...}). 리스너가 두 번 트리거 될 수 있습니다. 한 번만 트리거하고 싶습니다. 리스너 함수에서 어떻게 코딩 할 수 있습니까?
tomision

9
@Tomlsion 호출 된 함수의 요소에 className 'busy'를 추가 한 다음 className 'busy'를 $('#element:not(.busy)').on('keyup keypress blur change', function(e){…});제거하십시오.
Esger

60

jQuery 1.7부터이 .on()메소드는 이벤트 핸들러를 문서에 첨부하는 데 선호되는 메소드입니다. 이전 버전의 .bind()경우이 메소드는 이벤트 핸들러를 요소에 직접 첨부하는 데 사용됩니다.

$(document).on('mouseover mouseout',".brand", function () {
  $(".star").toggleClass("hovered");
})

1
이것은 위임 된 이벤트에 대해 수행되며 작동하지만 가장 간단한 방법이나 가장 효율적인 방법은 아닙니다.
벤 탈리아도 로스

1
이벤트 위임은 중요하며 스크립트가로드 / 실행되는시기와 스크립트가로드 / 실행될 때 요소가 DOM에 존재하는지 여부에 따라 필요하거나 필요하지 않을 수 있습니다.
random_user_name

45

jQuery가 한 번에 여러 이벤트를 수신 할 때 이벤트 유형을 얻는 방법을 찾고 있었고 Google이 나를 여기에 넣었습니다.

그래서 관심있는 사람들을 위해 event.type내 대답은 다음과 같습니다.

$('#element').on('keyup keypress blur change', function(event) {
    alert(event.type); // keyup OR keypress OR blur OR change
});

jQuery doc 에 대한 자세한 정보 .


24

당신이 사용할 수있는 바인딩 방법을 몇 가지 이벤트 기능을 첨부 할 수 있습니다. 이 코드에서와 같이 이벤트 이름과 핸들러 함수를 전달하십시오.

$('#foo').bind('mouseenter mouseleave', function() {
  $(this).toggleClass('entered');
});

또 다른 옵션은 jquery api의 체인 지원을 사용하는 것입니다.


9
jQuery 1.7부터 .on () 메소드는 문서에 이벤트 핸들러를 첨부하는 데 선호되는 메소드입니다.
Dzhuneyt

18

동일한 이벤트 핸들러를 여러 이벤트에 연결하면 종종 둘 이상의 이벤트가 동시에 발생하는 문제가 발생합니다 (예 : 편집 후 사용자가 탭을 누르기; 키 다운, 변경 및 흐림 효과가 모두 발생할 수 있음).

실제로 원하는 것은 다음과 같습니다.

$('#ValidatedInput').keydown(function(evt) {
  // If enter is pressed
  if (evt.keyCode === 13) {
    evt.preventDefault();

    // If changes have been made to the input's value, 
    //  blur() will result in a change event being fired.
    this.blur();
  }
});

$('#ValidatedInput').change(function(evt) {
  var valueToValidate = this.value;

  // Your validation callback/logic here.
});

14

이것이 내가하는 방법입니다.

$("input[name='title']").on({
    "change keyup": function(e) {
        var slug = $(this).val().split(" ").join("-").toLowerCase();
        $("input[name='slug']").val(slug);
    },
});

11

재사용하고자하는 기능을 아래와 같이 정의 할 수 있습니다.

var foo = function() {...}

그리고 나중에 객체에 원하는 많은 이벤트 리스너를 설정하여 on ( 'event')을 사용하여 해당 함수를 트리거하여 아래에 표시된 것처럼 공백을 남길 수 있습니다.

$('#selector').on('keyup keypress blur change paste cut', foo);

3
일반적으로 답변을 설명해야합니다. 코드를 붙여 넣기 만하면 OP가 문제 나 솔루션을 이해하는 데 도움이되지 않습니다.
leigero

jquery 이벤트 구독자 함수 (event)에서 첫 번째 인수가 필요한 경우 어떻게합니까? 사용 방법?
Dr.X

괜찮습니다. 이벤트 매개 변수를 사용하여 함수를 선언 한 다음 메소드 내에서 액세스 할 수 있습니다. 이 이벤트는 객체 자체를 전달합니다. 이게 도움이 되길 바란다. var foo = function (event) {console.log (event); } $ ( '# selector'). on ( '키업 키 누르기 흐림 변경 붙여 넣기 잘라 내기', foo);
갤럭시 코더

7

Tatu의 대답은 직관적으로 수행하는 방법이지만 Internet Explorer에서 이벤트를 중첩 / 바인딩하는 방법으로 문제가 발생했지만 .on()메서드를 통해 수행됩니다 .

나는 이것이 어떤 문제의 jQuery를 정확하게 찾아 낼 수 없었습니다. 그러나 때때로 다음 버전에서 문제가 발생합니다.

  • 2.0.2
  • 1.10.1
  • 1.6.4
  • 모바일 1.3.0b1
  • 모바일 1.4.2
  • 모바일 1.2.0

내 해결 방법은 먼저 함수를 정의하는 것이 었습니다.

function myFunction() {
    ...
}

그런 다음 이벤트를 개별적으로 처리하십시오.

// Call individually due to IE not handling binds properly
$(window).on("scroll", myFunction);
$(window).on("resize", myFunction);

이것은 가장 예쁜 해결책은 아니지만 저에게 효과적 이며이 문제에 걸려 넘어 질 수있는 다른 사람들을 돕기 위해 거기에 배치 할 것이라고 생각했습니다.


5
$("element").on("event1 event2 event..n", function() {
   //execution
});

이 학습서 는 여러 이벤트 처리에 관한 것입니다.


4

을 사용하는 방법이 있을까요 keyup, keypress, blur, 및 change이벤트는 한 줄에 같은 함수를 호출?

그것은 사용 가능 .on(): 다음과 같은 구조를 받아들이는, .on( events [, selector ] [, data ], handler )이 방법으로 여러 이벤트를 전달할 수 있습니다. 귀하의 경우 다음과 같이 보일 것입니다 :

$('#target').on('keyup keypress blur change', function(e) {
    // "e" is an event, you can detect the type of event using "e.type"
});

그리고 여기 실제 예가 있습니다 :

$('#target').on('keyup keypress blur change', function(e) {
  console.log(`"${e.type.toUpperCase()}" event happened`)
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="target">


2

jQuery와 같은 큰 라이브러리없이 내장 DOM 메소드로 이것을 구현하는 것은 간단합니다. 원한다면 이벤트 코드 배열을 반복하고 각각에 대한 리스너를 추가하면 약간의 코드가 더 필요합니다.

function validate() {
  // ...
}

const element = document.querySelector('#element');
['keyup', 'keypress', 'blur', 'change'].forEach((eventName) => {
  element.addEventListener(eventName, validate);
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.