2013-08-22 36 views
32

Tôi đang cố gắng tập trung vào xác thực thẻ tín dụng không thành công. nhưng lạ focus() không hoạt động.Tiêu điểm jQuery không hoạt động

$('#cc_number').validateCreditCard(function (result) { 
    if (result.length_valid && result.luhn_valid) { 

    } else { 
     $("#cc_number").focus(); 
     return false; 
    } 
}); 

<input type="text" id='cc_number' name="cc_number" /> 
+1

gì "không làm việc"? Tôi nhận được một cảnh báo mỗi khi tôi làm mờ đầu vào. – j08691

+1

Trong chrome nó hoạt động –

+0

chỉ cảnh báo đang làm việc .. nhưng tại sao tập trung thất bại .. :( –

Trả lời

56

mentioned in the comments, jsfiddle ban đầu của bạn chứa giải pháp.

Giải pháp thay thế là đặt thời gian chờ vào cuộc gọi lấy nét.

setTimeout(function(){ 
    $("#cc_number").focus(); 
}, 0); 

Tôi không chắc chắn 100%, nhưng nó có thể là như cảnh báo sẽ được kêu gọi làm mờ, bạn sẽ không bao giờ thực sự cho phép hộp mất tập trung, và do đó khi tập trung được gọi, nó đã có nó.

Bằng cách sử dụng hết thời gian chờ, bạn đang đặt logic vào một chuỗi riêng biệt, chạy riêng biệt đến mã javascript chính (giống như hàm gọi lại).


Nhưng khi nhận xét về câu hỏi của bạn cũng đề cập đến, hãy tập trung cho đến khi xác thực vượt qua là gây phiền nhiễu.

Nhưng đây chỉ là một lời chỉ trích của UX.

+4

Nếu bạn có thể giải thích lý do tại sao nó hoạt động, tôi hoàn toàn sẽ +1 nó. – Richard

+0

@Richard Tôi không chắc chắn 100%, nhưng tôi tin rằng đó là vì trọng tâm được lấy ra khỏi luồng hiện tại. Thời gian chờ nhỏ là không liên quan thực sự, nó chỉ là thời gian chờ không chạy tuyến tính với phần còn lại của mã, giống như một chức năng gọi lại. Do đó tôi đã sửa đổi câu trả lời để tránh nhầm lẫn. – Curt

+2

Đó là vì thời gian của sự kiện. Nếu bạn đặt tiêu điểm trong sự kiện Blur, đầu vào sẽ lấy nét. Tuy nhiên, do sự kiện mờ chưa hoàn thành, nó sẽ mất tập trung khi sự kiện kết thúc. Việc thêm thời gian chờ cho phép .focus() xuất hiện sau khi sự kiện mờ hoàn thành. Bạn cũng có thể hủy sự kiện ban đầu để có cùng tác dụng. – Richard

17

DOM của bạn có thể đang được làm mới để tập trung không hoạt động ở đây. Thay vào đó bạn có thể làm theo phương pháp này:

$('#cc_number').validateCreditCard(function (result) { 
    if (result.length_valid && result.luhn_valid) { 

    } else { 
     $("#cc_number").attr("autofocus","autofocus") 
     return false; 
    } 
}); 

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