jQuery: fire click () trước sự kiện Blur ()


134

Tôi có một trường đầu vào, nơi tôi cố gắng thực hiện đề xuất tự động hoàn thành. Mã trông như

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

Trong blur()sự kiện đầu vào, tôi muốn ẩn div kết quả:

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

Khi tôi viết một cái gì đó vào đầu vào của mình, tôi gửi yêu cầu đến máy chủ và nhận được phản hồi json, phân tích nó thành cấu trúc ul-> li và đặt ul này vào #myresultsdiv của tôi .

Khi tôi nhấp vào phần tử li được phân tích cú pháp này, tôi muốn đặt giá trị từ li thành đầu vào và ẩn #myresultsdiv

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

Mọi thứ đang diễn ra tốt đẹp, nhưng khi tôi nhấp vào blur()sự kiện li của mình sẽ kích hoạt trước đó click()và giá trị đầu vào không nhận được html của li.

Làm thế nào tôi có thể thiết lập click()sự kiện trước blur()?


Vì vậy, trường hợp tại sao bạn sử dụng chức năng làm mờ? khi nhu cầu của bạn đã được lấp đầy từ chức năng nhấp chuột.
Owais Iqbal

Điều này có thể sẽ không thay đổi thứ tự mà các sự kiện của bạn đang kích hoạt, nhưng nếu blurthực sự bắn sau khi bạn nhấp vào li, thì có lẽ bạn không cần phải thực thi $("#myresults").hide()trong trình xử lý nhấp chuột. Những gì có vẻ như đang xảy ra $(this).html()là trả về một chuỗi rỗng. Bạn có thể loghoặc alert $(this).html()để chắc chắn?
veeTrain

@OwaisIqbal đôi khi không có kết quả, đôi khi người dùng không muốn chọn bất cứ điều gì từ các đề xuất, đôi khi người dùng không muốn sử dụng thông tin này nữa, nhưng tôi phải ẩn kết quả không sử dụng
Egor Sazanovich

@veeTrain có nhiều hành động trong trình xử lý của tôi, tôi chỉ thu nhỏ chúng để dễ hiểu vấn đề trong câu hỏi của mình. ps Tôi đã cố gắng thêm điểm quan sát trong firebird trên blur()click()xử lý, không có hành động nào sau khi blur()kết thúc
Egor Sazanovich

Có vẻ như bạn cần phải xếp hàng các chức năng. Hãy thử xem trang này: stackoverflow.com/questions/1058158/ cấp . Phần đầu tiên xuất hiện (FIFO) có thể liên quan đến bạn
Patriotec

Câu trả lời:


312

Giải pháp 1

Nghe mousedownthay click.

Sự kiện mousedownblursự kiện xảy ra lần lượt khi bạn nhấn nút chuột, nhưng clickchỉ xảy ra khi bạn nhả nó.

Giải pháp 2

Bạn có thể preventDefault()vào mousedownđể chặn thả xuống từ ăn cắp tập trung. Ưu điểm nhỏ là giá trị sẽ được chọn khi nút chuột được phát hành, đó là cách các thành phần chọn gốc hoạt động. Câu đố

$('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
Giải pháp 1 đã làm việc cho tôi trong tình huống tương tự! Dễ dàng thay đổi! Cảm ơn bạn :)
Jon

Cảm ơn bạn :) Nhưng bạn có thể giải thích tại sao nghe mousedown thay vì click hoạt động như bùa mê không?
Mudassir Ali

3
@MudassirAli vì sự kiện mousedown đến trước mờ và nhấp vào sau. jsfiddle.net/f3BKP
Alexey Lebedev

Giải pháp số 1 theo tôi là sự lựa chọn tốt hơn. Đơn giản và hiệu quả. Hết thời gian sẽ có nghĩa là nhiều mã hơn + nhiều chỗ hơn cho hành vi không mong muốn (thời gian chờ là bao lâu? Đủ lâu để đăng ký nhấp chuột, nhưng không quá lâu để gây nhầm lẫn cho việc sử dụng ...).
cw24

5
Giải pháp số 2 thật tài tình. Tôi sẽ không bao giờ tìm ra nó! Cảm ơn
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();
}

VĨ CẦM


2

Tôi đã đối mặt với vấn đề này và sử dụng mousedownkhông phải là một lựa chọn cho tôi.

Tôi đã giải quyết điều này bằng cách sử dụng setTimeoutchức năng xử lý

        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

Tôi vừa trả lời một câu hỏi tương tự: https://stackoverflow.com/a/46676463/227578

Một giải pháp thay thế cho các giải pháp mousedown là nó bỏ qua các sự kiện mờ gây ra bằng cách nhấp vào các phần tử cụ thể (nghĩa là trong trình xử lý mờ của bạn, bỏ qua việc thực thi nếu đó là kết quả của việc nhấp vào một phần tử cụ thể).

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

trong trường hợp của tôi, event.relatedTarget trả về null, bạn có biết tại sao không?
gaurav5430

ok, đã có câu trả lời ở đây: stackoverflow.com/questions/42764494/ từ
gaurav5430

0

Các giải pháp Mousedown không hoạt động đối với tôi, khi tôi nhấp vào các yếu tố không phải nút. Vì vậy, đây là những gì tôi đã thực hiện với chức năng làm mờ trong mã của mình:

.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;
*/
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.