2012-12-20 47 views
10

Tôi đang làm việc trên một dự án có hộp tìm kiếm tự động hoàn tất. Bây giờ tôi có vấn đề mà tôi muốn chuyển giá trị từ các autocompleteresults được tìm thấy vào hộp nhập liệu, nhưng đồng thời, tôi muốn autocompletebox ẩn khi inputfield không tập trung nhiều hơn.jQuery .focusout/.click xung đột

Bây giờ tôi có xung đột xảy ra với cả hai người kể từ khi nhấp vào autocompletebox được coi là tập trung và ẩn hộp ngay cả trước khi nó có thể chuyển giá trị. Bất kỳ con trỏ hoặc cách giải quyết nào cho loại vấn đề này? Đây là một jsfiddle để làm cho nó rõ ràng hơn cho bạn.

http://jsfiddle.net/KeGvM/

Hoặc đây

CSS:

#a_c {display:none;}​ 

JS:

$('#search_field').focusout(function() { 
    $('#a_c').hide(); // IF I DELETE THIS IT WORKS 
}); 

$('#search_field').focusin(function() { 
    $('#a_c').show(); 
}); 

$('#a_c a').click(function() { 
    $('#search_field').val(''); 
    var value = $(this).text(); 
    var input = $('#search_field'); 
    input.val(input.val() + value); 
    $('#a_c').hide(); 
    return false; 
});​ 

HTML:

<input autocomplete="off" onkeyup="searchFor(this.value);" name="search" id="search_field" class="bold" type="text" placeholder="Search..."> 
<div id="a_c"><a href="">hello world</a></div>​ 

Trả lời

17

Giải pháp của tôi trong tình huống tương tự đã sử dụng thời gian chờ để tạm hoãn hành động thực hiện trong blur xử lý sự kiện. Như thế này:

$('#search_field').focusout(function() { 
    window.setTimeout(function() { $('#a_c').hide() }, 100); 
}); 
+0

Rất hữu ích. Cảm ơn đã trả lời nhanh chóng! – Johnny000

+1

tôi đã có một vấn đề tương tự như op, và tôi quyết định sử dụng sửa chữa bẩn này như là một giải pháp (cuối cùng và im trên một thời hạn phải sửa chữa này càng sớm càng tốt).Điều này đặt các sự kiện trong điều kiện chủng tộc và thực hành rất xấu của nó. tôi sẽ sử dụng điều này, cảm ơn câu trả lời này, nhưng sẽ downvote. chờ đợi một câu trả lời tốt hơn. – Sharky

17

Làm thế nào về việc sử dụng

: hover

tôi giải quyết cùng một vấn đề sử dụng nó.

$('className').on('focusout', function(e) { 
    if($('.suggestLi' + ':hover').length) { 
     return; 
    } 
    $('.suggestList').empty(); 
}); 
+1

Tôi nghĩ đây là giải pháp tốt nhất. Tôi đã sử dụng nó và nó hoạt động hoàn hảo. Cảm ơn! – ZanattMan

+1

Đây là giải pháp thanh lịch nhất mà tôi đã tìm thấy trên internet. Cảm ơn. –

+0

Không hoạt động nếu chuột di chuột đề xuấtList và tôi sẽ nhấn TAB (như di chuyển sang mục nhập tiếp theo) (thay vì nhấp) ** [JSFIDDLE] (http://jsfiddle.net/KeGvM/61/) ** – bsbak

1

Con đường tôi giải quyết này đã sử dụng sự kiện mousedown thay vì click, như trường hợp mousedown được kích hoạt trước khi sự kiện focusout khi click thì không.

Bạn có thể dùng thử trong bản trình diễn nhỏ bên dưới. Tập trung vào trường và sau đó nhấp vào nút.

const field = document.getElementById('field'); 
 
const btn = document.getElementById('btn'); 
 

 
btn.addEventListener('click',() => console.log('Click')); 
 
btn.addEventListener('mousedown',() => console.log('Mouse down')); 
 
field.addEventListener('focusout',() => console.log('Focus out'));
<input id="field"> 
 
<button id="btn">Try it</button>

Như bạn có thể nhìn thấy đầu ra là theo trình tự sau:

  1. chuột xuống
  2. Focus ra
  3. Bấm

Điểm bất lợi duy nhất của giải pháp này là nó không chờ người dùng nhả nút chuột của họ, nhưng bạn có thể tự quyết định xem đó có phải là một vấn đề hay không.

+1

Điều này phải được chấp nhận trả lời, cảm ơn bạn đã điều tra! –

Các vấn đề liên quan