jQuery : blur () 이벤트 전에 click ()을 발생시킵니다.


134

자동 완성 제안을 시도하는 입력 필드가 있습니다. 코드는 다음과 같습니다

<input type="text" id="myinput">
<div id="myresults"></div>

입력 blur()이벤트에서 결과의 div를 숨기고 싶습니다.

$("#myinput").live('blur',function(){
     $("#myresults").hide();
});

입력에 무언가를 쓸 때 서버에 요청을 보내고 json 응답을 얻고 그것을 ul-> li 구조로 구문 분석 하고이 ul을 내 #myresultsdiv에 넣습니다 .

이 구문 분석 된 li 요소를 클릭하면 li에서 입력 및 #myresultsdiv 로 값을 설정하고 싶습니다.

$("#myresults ul li").live('click',function(){
     $("#myinput").val($(this).html());
     $("#myresults").hide();
});

모든 것이 잘 진행되고 있지만 클릭하면 li blur()이벤트가 시작 click()되고 입력 값이 li의 html을 얻지 못합니다.

click()전에 이벤트를 blur()어떻게 설정할 수 있습니까?


그렇다면 블러 기능을 사용하는 이유는 무엇입니까? 클릭 기능이 필요하면
Owais Iqbal

이벤트가 실행되는 순서는 변경되지 않지만 blur을 클릭 한 후에 실제로 li실행 $("#myresults").hide()되는 경우 클릭 핸들러에서 실행할 필요가 없습니다 . 보이는 것처럼 보이는 $(this).html()것은 빈 문자열을 반환하는 것입니다. 당신은 할 수 있습니까 log또는 alert $(this).html()확인?
veeTrain

@OwaisIqbal 때로는 결과가 없습니다, 때로는 사용자가 제안에서 아무것도 선택하고 싶지 않고, 때때로 사용자는이 입력을 더 이상 사용하고 싶지 않지만, 사용하지 않은 결과를 숨겨야합니다
Egor Sazanovich

@veeTrain 내 처리기에는 많은 작업이 있으며 내 질문의 문제를 쉽게 이해할 수 있도록 최소화했습니다. 추신 : 나는 방화범 blur()click()처리기 에 감시 점을 추가하려고했지만 blur()끝날 때 아무런 조치가 없습니다.
Egor Sazanovich

함수를 큐에 넣어야 할 것 같습니다. 이 페이지에서 살펴 복용하십시오 stackoverflow.com/questions/1058158/...을 . 선입 선출 (FIFO) 부분은 귀하와 관련이있을 수 있습니다
Patriotec

답변:


312

해결책 1

mousedown대신에 듣기click .

mousedownblur이벤트는 마우스 버튼을 누를 때 잇달아 발생하지만click 당신이 그것을 해제하는 경우에만 발생합니다.

해결책 2

당신은 수 preventDefault()mousedown초점을 훔치는에서 드롭 다운을 차단합니다. 약간의 장점은 마우스 버튼을 놓을 때 값이 선택된다는 것입니다. 이는 기본 선택 구성 요소의 작동 방식입니다. JSFiddle

$('input').on('focus', function() {
    $('ul').show();
}).on('blur', function() {
    $('ul').hide();
});

$('ul').on('mousedown', function(event) {
    event.preventDefault();
}).on('click', 'li', function() {
    $('input').val(this.textContent).blur();
});

12
솔루션 1이 같은 상황에서 저에게 효과적이었습니다! 쉬운 변화! 감사합니다 :)
Jon

감사합니다 :) 그러나 클릭 대신 마우스 다운을 듣는 것이 매력처럼 작동하는 이유를 설명 할 수 있습니까?
Mudassir Ali

3
마우스 다운 이벤트가 흐려지기 전에 @MudassirAli가 발생하고 클릭이 이어집니다. jsfiddle.net/f3BKP
Alexey Lebedev

솔루션 # 1은 제 생각에 더 나은 선택입니다. 간단하고 효과적입니다. 시간 초과는 예상치 못한 동작을 위해 코드를 작성하고 공간을 늘리는 것을 의미합니다 (시간 초과? 클릭을 등록 할만큼 길지만 사용을 혼동하기에는 너무 길지 않습니다 ...).
cw24

5
해결책 # 2는 독창적입니다. 나는 그것을 이해하지 못했을 것입니다! 감사
Tobia

2
$(document).on('blur', "#myinput", hideResult);

$(document).on('mousedown', "#myresults ul li", function(){
     $(document).off('blur', "#myinput", hideResult); //unbind the handler before updating value
     $("#myinput").val($(this).html()).blur(); //make sure it does not have focus anymore
     hideResult(); 
     $(document).on('blur', "#myinput", hideResult);  //rebind the handler if needed
});

function hideResult() {
     $("#myresults").hide();
}

깡깡이


2

나는이 문제에 직면했으며 사용하는 mousedown것이 옵션이 아닙니다.

setTimeout핸들러 함수를 사용하여 이것을 해결했습니다.

        elem1.on('blur',function(e) {

            var obj = $(this);

            // Delay to allow click to execute
            setTimeout(function () {
                if (e.type == 'blur') {

                  // Do stuff here

                }
            }, 250);
        });

        elem2.click( function() {
            console.log('Clicked');
        });

2

방금 비슷한 질문에 대답했습니다 : https : //.com/a/46676463/227578

마우스 다운 솔루션의 대안은 특정 요소를 클릭하여 발생하는 흐림 이벤트를 무시하도록하는 것입니다 (예 : 흐림 처리기에서 특정 요소를 클릭 한 결과 실행을 건너 뜁니다).

$("#myinput").live('blur',function(e){
     if (!e.relatedTarget || !$(e.relatedTarget).is("#myresults ul li")) {
         $("#myresults").hide();
     }
});

제 경우에는 event.relatedTarget이 null을 반환합니다. 왜 그런지 알 수 있습니까?
gaurav5430

: 좋아, 여기에 답변을 얻었다 stackoverflow.com/questions/42764494/...
gaurav5430

0

버튼이 아닌 요소를 클릭하면 마우스 다운 솔루션이 작동하지 않습니다. 내 코드에서 흐림 기능으로 수행 한 작업은 다음과 같습니다.

.on("blur",":text,:checkbox,:radio,select",function() {
/*
* el.container 
* container, you want detect click function on.
*/
            var outerDir = el.container.find(':hover').last();
            if (outerDir.length) {
                if ($.inArray(outerDir.prop('tagName'), ["A","SELECT"] ) != -1 || outerDir.prop('type') == 'button' || outerDir.prop('type') == 'submit') {
                    outerDir.click();
                }
                if (outerDir.prop('type') == 'checkbox') {
                    outerDir.change();
                }
                return false;
            }
/*          
* YOUR_BLUR_FUNCTION_HERE;
*/
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.