2009-08-05 34 views
7

Tôi hiện đang có một kịch bản mà sẽ kiểm tra giá trị của một hộp lựa chọn, và sau đó kích hoạt một trường văn bản ngay bên cạnh nó, và sau đó hy vọng thiết lập tập trung.Đặt tiêu điểm cho đầu vào tiếp theo trong jQuery?

Tôi có này tại thời điểm mà hoạt động tốt tạo điều kiện cho các lĩnh vực đầu vào ...

$("#assessed select").change(function() { 

    if($(this).val() == 'null') { $(this).next('input').attr("disabled", true); } 
    else { $(this).next('input').removeAttr("disabled"); } 

}); 

tôi một chút khó khăn trên 'tập trung' chút phải trung thực, tôi đã cố gắng "$ (this) .next ('đầu vào'). focus(); " nhưng điều đó không tập trung chút nào, mặc dù nó cũng không gây ra lỗi Javascript ...

$("#assessed select").change(function() { 

    if($(this).val() == 'null') { $(this).next('input').attr("disabled", true); $(this).next('input').focus(); } 
    else { $(this).next('input').removeAttr("disabled"); } 

}); 

Bạn có ý kiến ​​gì không? Tôi thực sự bị mắc kẹt về điều này và nó sẽ là một bổ sung rất đơn giản, nhưng rất hữu ích cho trang tôi đang xây dựng!

Cảm ơn

+0

Bạn có thể đăng HTML của bạn không? – RaYell

Trả lời

5

Modified của câu trả lời ở trên với cache đối tượng JQ này. Ngoài ra bộ lọc bên trong tiếp theo là không cần thiết. next() sẽ chỉ bao giờ trả lại anh chị em tiếp theo. Bộ lọc về cơ bản nói rằng hãy cho tôi chỉ tiếp theo nếu nó là đầu vào hoặc bất kỳ bộ lọc nào bạn cung cấp. Nếu bạn chắc chắn tiếp theo là đối tượng mong muốn thì không cần phải bao gồm bộ lọc.

$("#assessed select").change(function() { 
    var $this = $(this); 
    if($this.val() === 'null') { 
     $this.next() 
      .attr("disabled", true); 
    } 
    else { 
     $this.next() 
      .removeAttr("disabled") 
      .focus(); 
    } 
}); 
+0

Hoàn toàn hoàn hảo và nhiều giải pháp tốt hơn so với những gì tôi đã sử dụng, cảm ơn bạn! – Nick

1

Tôi nghĩ rằng vấn đề của bạn có thể là nó không thể thiết lập focus cho một điều khiển đầu vào khuyết tật (ít nhất là trong một số trình duyệt/hệ điều hành).

Cuộc gọi focus() của bạn về cơ bản là sai khối - nó phải ở trong khối else, không phải khối if.

Như thế này:

$("#assessed select").change(function() { 

    if($(this).val() == 'null') { $(this).next('input').attr("disabled", true); } 
    else { $(this).next('input').removeAttr("disabled"); $(this).next('input').focus(); } 
}); 
+0

Hah! Rất cám ơn Rob ... Tôi vừa mới nhận ra rằng tôi tập trung vào 'if' chứ không phải 'else'! Lỗi học sinh tuyệt đối, xin lỗi và cảm ơn rất nhiều - không phải cho đến khi bạn đăng mà tôi nhận ra :) – Nick

+0

Nhớ cache $ (this) thay vì gọi nó nhiều lần – redsquare

+0

Xong, cảm ơn :) – Nick

14

Cũng tìm thấy một plugin tốt đẹp chút để có được đầu vào tiếp theo: http://jqueryminute.com/set-focus-to-the-next-input-field-with-jquery/

$.fn.focusNextInputField = function() { 
    return this.each(function() { 
     var fields = $(this).parents('form:eq(0),body').find('button,input,textarea,select').not(':hidden'); 
     var index = fields.index(this); 
     if (index > -1 && (index + 1) < fields.length) { 
      fields.eq(index + 1).focus(); 
     } 
     else {fields.first().focus();} 
     return false; 
    }); 
}; 
+4

Tôi sẽ thêm '.not (': hidden')' vào khai báo trường, vì vậy chỉ có các phần tử hiển thị được chọn. Ngoài ra, thêm 'else {fields.first(). Focus();}' để lấy tiêu điểm để bao quanh phần tử đầu tiên. –

+0

Tại sao bạn tìm mẫu phụ huynh: eq (0) trước? – Serge

+0

@Serge nó chọn hình thức cha mẹ mà các yếu tố đầu vào là in Tôi không biết nếu "eq (0)" là cần thiết, không phải tho mã của tôi, vì vậy tôi không chắc chắn. – TimoSolo

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