2008-11-10 21 views
75

Có cách đơn giản để đặt tiêu điểm (con trỏ đầu vào) của trang web trên thành phần đầu vào đầu tiên (hộp văn bản, danh sách thả xuống, ...) khi tải trang mà không cần phải biết id của phần tử ?Làm cách nào để đặt tiêu điểm thành phần tử đầu vào đầu tiên trong biểu mẫu HTML độc lập với id?

Tôi muốn triển khai nó như một kịch bản chung cho tất cả các trang/biểu mẫu của ứng dụng web của tôi.

+6

REMARK nếu mẫu được đặt xuống trong trang trong một sử dụng cách có để cuộn xuống trang để xem biểu mẫu, bằng cách đặt tiêu điểm sẽ tự động cuộn xuống trang như một neo sẽ làm. Điều này không phải là rất tốt gây ra người dùng đến trang như vậy sẽ thấy nó ngay lập tức cuộn xuống vị trí hình thức. Tôi đã thử nghiệm trên Safari và FF (IE7 không thực hiện di chuyển trang). –

+0

@Marco_Demaio Ứng dụng web của tôi được cấu trúc theo cách mọi trang đều có hộp nhập gần đầu cửa sổ. – splattne

+3

nếu người dùng thay đổi kích thước chiều cao cửa sổ trình duyệt thành cái gì đó nhỏ hơn 768px. Trang sẽ cuộn đến vị trí bạn đặt tiêu điểm. Dù sao tôi chỉ muốn cảnh báo bạn trong trường hợp bạn không biết về vấn đề nhỏ như vậy, tôi không biết về nó, hoặc trước khi làm một số xét nghiệm. –

Trả lời

90

Bạn cũng có thể thử phương pháp jQuery dựa trên:

$(document).ready(function() { 
    $('form:first *:input[type!=hidden]:first').focus(); 
}); 
+0

Nó hoạt động! Tôi bắt đầu tích hợp jQuery trong ứng dụng web của tôi. Vì vậy, tôi nghĩ rằng tôi sẽ gắn bó với cách tiếp cận này! Rất cám ơn, Marko! – splattne

+2

Điều gì sẽ xảy ra nếu biểu mẫu đầu tiên trên trang bị ẩn trong trường hợp này? Hoặc nếu phần tử đầu tiên trên biểu mẫu bị ẩn qua CSS? Chắc chắn điều này sẽ thất bại. Dĩ nhiên tôi đang là người đi bộ nhưng đó là cách tôi lăn. –

+0

Trong trường hợp của tôi (sử dụng ASP.NET) tôi chỉ có MỘT hình thức mà không bao giờ bị ẩn. Vì vậy, điều này làm việc cho tôi. – splattne

23
document.forms[0].elements[0].focus(); 

này có thể được tinh chế sử dụng một vòng lặp để ví dụ. không tập trung một số loại trường, trường bị vô hiệu hóa, v.v. Tốt hơn có thể thêm lớp = "tự động lấy nét" vào trường bạn thực sự do muốn tập trung và lặp lại các biểu mẫu [i] .elements [j] tìm kiếm className đó.

Dù sao đi nữa: thường thì không nên làm điều này trên mọi trang. Khi bạn tập trung đầu vào, người dùng sẽ mất khả năng ví dụ. cuộn trang từ bàn phím. Nếu không mong muốn, điều này có thể gây phiền nhiễu, do đó, chỉ tự động lấy nét khi bạn khá chắc chắn rằng việc sử dụng trường biểu mẫu sẽ là những gì người dùng muốn thực hiện. I E. nếu bạn là Google.

+1

Phải là câu trả lời đúng, vì câu hỏi không có thẻ jquery. –

5

Bạn cũng cần bỏ qua mọi thông tin nhập ẩn.

for (var i = 0; document.forms[0].elements[i].type == 'hidden'; i++); 
document.forms[0].elements[i].focus(); 
+0

Tôi có thể sai, nhưng vòng lặp này không có hành vi được xác định nếu biểu mẫu [0] không có đầu vào bị ẩn. – xtofl

+0

Chính xác. Nó được sử dụng để bỏ qua bất kỳ đầu vào ẩn hàng đầu nào. Và nó được viết dưới giả định rằng có các trường không được ẩn trong biểu mẫu. Tôi có thể đã làm nó với jQuery là tốt (tôi sẽ đăng một câu trả lời) nhưng bạn đã không đề cập đến bạn muốn jQuery tham gia. –

+1

@MarkoDumic Tại sao lãng phí bộ nhớ nếu bạn có thể sử dụng câu lệnh 'while'? – Lucio

7

Nếu bạn đang sử dụng khuôn khổ JavaScript Prototype sau đó bạn có thể sử dụng phương pháp focusFirstElement:

Form.focusFirstElement(document.forms[0]); 
3

Đưa mã này vào cuối thẻ body của bạn sẽ tập trung đầu tiên có thể nhìn thấy, không ẩn tự động bật phần tử trên màn hình. Nó sẽ xử lý hầu hết các trường hợp tôi có thể đưa ra trong thông báo ngắn.

<script> 
    (function(){ 
     var forms = document.forms || []; 
     for(var i = 0; i < forms.length; i++){ 
      for(var j = 0; j < forms[i].length; j++){ 
       if(!forms[i][j].readonly != undefined && forms[i][j].type != "hidden" && forms[i][j].disabled != true && forms[i][j].style.display != 'none'){ 
        forms[i][j].focus(); 
        return; 
       } 
      } 
     } 
    })(); 
</script> 
+1

Một điều cần xem xét ở đây là nó có thể phù hợp với các yếu tố mà không phải là mình ẩn nhưng một tổ tiên được. Điều đó sẽ yêu cầu theo dõi sao lưu DOM và kiểm tra khả năng hiển thị của từng tổ tiên mà tôi cảm thấy là quá mức nghiêm trọng đối với loại tình huống này. –

+0

Điều gì về Tôi nghĩ bạn nên thêm trường hợp này vào mã của bạn. Thông thường mọi người không muốn tập trung vào một trường văn bản đầu vào chỉ đọc. Dù sao mã đẹp và +1 cảm ơn! –

+0

Chưa được kiểm tra nhưng tôi đã cập nhật nó với! Forms [i] [j] .readonly! = Undefined –

17

Khái niệm jQuery toàn diện nhất mà tôi thấy làm việc là (thông qua sự giúp đỡ của hơn here)

$(document).ready(function() { 
    $('input:visible:enabled:first').focus(); 
}); 
+0

Tôi đã sử dụng tính năng này, nhận thấy nó chạy cực kỳ chậm trên IE khi có số lượng lớn> 1000 hộp kiểm trong bảng. Bạn không chắc chắn phải làm gì về nó, có thể phải từ bỏ việc tập trung vào trường đầu vào đầu tiên. –

118

Mặc dù điều này doesn' t trả lời câu hỏi (yêu cầu một tập lệnh phổ biến), mặc dù nó có thể hữu ích cho người khác biết rằng HTML5 giới thiệu thuộc tính 'tự động lấy nét':

<form> 
    <input type="text" name="username" autofocus> 
    <input type="password" name="password"> 
    <input type="submit" value="Login"> 
</form> 

Dive in to HTML5 có thêm thông tin.

+2

lấy nét tự động là tên thuộc tính. Điều gì về giá trị của nó? Somethig như autofocus = true không cần thiết? Điều đó có nghĩa là không đặt bất kỳ giá trị nào? – Geek

+4

Trong HTML5, một số thuộc tính không cần phải có giá trị, 'đã chọn' là thuộc tính khác trong trường hợp này. Tôi tin rằng khi giá trị được tắt, nó được ngụ ý rằng nó giống với tên (ví dụ: autofocus = "autofocus" và checked = "checked"). –

+0

Ứng dụng Spring của tôi bị hỏng khi tôi cố gắng sử dụng 'lấy nét tự động' mà không có giá trị trên' spring: form'. 'autofocus =" autofocus "' hoạt động tốt, mặc dù. Cảm ơn, @Jacob. –

2

Đây là mục nhập đầu tiên của bất kỳ đầu vào phổ biến hiển thị nào, bao gồm cả các hộp văn bản và các hộp chọn. Điều này cũng đảm bảo chúng không bị ẩn, bị vô hiệu hóa hoặc chỉ đọc. nó cũng cho phép một div mục tiêu, mà tôi sử dụng trong phần mềm của tôi (ví dụ, đầu vào đầu tiên bên trong của biểu mẫu này).

$("input:visible:enabled:not([readonly]),textarea:visible:enabled:not([readonly]),select:visible:enabled:not([readonly])", 
    target).first().focus(); 
2

Tôi đang sử dụng này:

$("form:first *:input,select,textarea").filter(":not([readonly='readonly']):not([disabled='disabled']):not([type='hidden'])").first().focus(); 
0

Với AngularJS:

angular.element('#Element')[0].focus(); 
0

này bao gồm textareas và loại trừ các nút radio

$(document).ready(function() { 
    var first_input = $('input[type=text]:visible:enabled:first, textarea:visible:enabled:first')[0]; 
    if(first_input != undefined){ first_input.focus(); } 
}); 
1

Đối với những người sử dụng JSF2. 2+ và không thể vượt qua tự động ofocus như một thuộc tính không có giá trị cho nó, sử dụng thuộc tính này:

p:autofocus="true" 

Và thêm nó vào không gian tên p (Cũng thường được sử dụng pt. Dù bạn thích gì).

<html ... xmlns:p="http://java.sun.com/jsf/passthrough"> 
0

Bạn sẽ có thể sử dụng clientHeight thay vì kiểm tra các thuộc tính hiển thị, kể từ khi cha mẹ có thể được ẩn yếu tố này:

function setFocus() { 
    var forms = document.forms || []; 
     for (var i = 0; i < forms.length; i++) { 
      for (var j = 0; j < forms[i].length; j++) { 
      var widget = forms[i][j]; 
       if ((widget && widget.domNode && widget.domNode.clientHeight > 0) && typeof widget.focus === "function") 
       && (typeof widget.disabled === "undefined" || widget.disabled === false) 
       && (typeof widget.readOnly === "undefined" || widget.readOnly === false)) { 
         widget.focus(); 
         break; 
       } 
      } 
     } 
    } 
} 
Các vấn đề liên quan