$ .f Focus () không hoạt động


153

Các ví dụ cuối cùng của jQuery focus()tài liệu quốc gia

$('#id').focus()

nên làm cho đầu vào tập trung (hoạt động). Tôi dường như không thể làm việc này.

Ngay cả trong bảng điều khiển trên trang web này, tôi đang thử nó cho hộp tìm kiếm

$('input[name="q"]').focus()

và tôi chẳng nhận được gì. Có ý kiến ​​gì không?


2
Bạn có thể cho chúng tôi xem mã của bạn?
Adil

Chúng ta sẽ phải biết nhiều hơn, bởi vì nó hoạt động tốt với tôi: jsfiddle.net/G7hwR/1 chỉ cần nhấp vào bất cứ nơi nào trong bảng điều khiển bên phải và nó tập trung ...
Rob G

Không nên tập trung vào trang này làm việc? Đoạn trích tôi cung cấp?
Sam Selikoff

Nó phụ thuộc vào những gì nó chứa trong; nếu nó không ở trong bất cứ thứ gì, có khả năng nó sẽ được chạy trước khi trang thậm chí hiển thị ...
Rob G

Đối với những người đến đây từ tìm kiếm: các công cụ dành cho nhà phát triển được tích hợp trong trình duyệt có thể can thiệp vào chức năng focus(). Thêm thông tin
aexl

Câu trả lời:


390

Trên thực tế, ví dụ bạn đưa ra để tập trung vào trang web này chỉ hoạt động tốt, miễn là bạn không tập trung vào bảng điều khiển. Lý do không hoạt động đơn giản là vì nó không lấy cắp trọng tâm từ bảng điều khiển dev. Nếu bạn chạy mã sau trong bảng điều khiển và sau đó nhấp nhanh vào cửa sổ trình duyệt của mình sau đó, bạn sẽ thấy nó tập trung vào hộp tìm kiếm:

setTimeout(function() { $('input[name="q"]').focus() }, 3000);

Đối với người khác của bạn, một điều khiến tôi gặp rắc rối trong quá khứ là thứ tự của các sự kiện. Bạn không thể gọi tiêu điểm () trên một phần tử chưa được gắn vào DOM. Phần tử bạn đang cố tập trung đã được gắn vào DOM chưa?


1
Tuyệt quá! Điều đó có giúp gì cho cả hai vấn đề của bạn không? Nếu vậy, bạn có thể đánh dấu nó là câu trả lời chính xác? Tôi sẽ đánh giá cao nó: D
Justin Warkentin

4
không sử dụng các công cụ dành cho nhà phát triển khi chỉ sử dụng $ ('input [name = "q"]'). Focus (); hoặc không hoạt động
Amitābha

12
Wow, tôi đã vật lộn với điều này trong nhiều tháng, tôi chỉ thấy rằng điều này là do bảng điều khiển dành cho nhà phát triển đang mở. Của tôi luôn là vậy. Cảm ơn bạn!
Alex Turpin

19
+1 cho "Bạn không thể gọi tiêu điểm () trên một phần tử chưa được gắn vào DOM." Ngoài ra, có vẻ như bạn không thể gọi nó trên các yếu tố ẩn.
tandrewnichols

1
Sử dụng setTimeoutđể giải quyết thứ tự các vấn đề hoạt động làm cho nó trở thành một nỗi đau rất lớn trong việc bảo trì. Nếu một lỗi xuất hiện, thật khó để gỡ lỗi. Bất cứ nơi nào bạn đang chèn phần tử vào DOM, nó sẽ gọi đến .focus()đó.
Kevin Beal

55

Tìm thấy một giải pháp ở nơi khác trên mạng ...

$('#id').focus();

đã không làm việc.

$('#id').get(0).focus();

Đã làm việc.


4
Tôi ủng hộ giải pháp này chỉ vì nó hiệu quả với tôi khi giải pháp phổ biến hơn trên trang này không có. ;-)
chriv

Tùy chọn thứ hai dường như chỉ lấy phần tử dom và sử dụng phiên bản javascript thông thường thay vì phiên bản jquery.
danielson317

7
Có thể là bạn có nhiều yếu tố với id "id" trên trang của bạn? DOM sẽ không bị
hỏng

Tôi thấy tôi phải làm điều này với window.setTimeout với độ trễ là 0, và sau đó tất cả đều ổn. Cảm ơn. Mọi thứ khác tôi đã thử thất bại trong một phương thức bootstrap.
Wade Hatler

22

Một số câu trả lời ở đây đề nghị sử dụng setTimeoutđể trì hoãn quá trình tập trung vào phần tử đích. Một trong số họ đề cập rằng mục tiêu nằm trong hộp thoại phương thức. Tôi không thể bình luận thêm về tính chính xác của setTimeoutgiải pháp mà không biết chi tiết cụ thể về nơi nó được sử dụng. Tuy nhiên, tôi nghĩ rằng tôi nên cung cấp một câu trả lời ở đây để giúp đỡ những người chạy vào chủ đề này giống như tôi đã làm

Thực tế đơn giản của vấn đề là bạn không thể tập trung vào một yếu tố chưa nhìn thấy được . Nếu bạn gặp phải vấn đề này, đảm bảo rằng mục tiêu thực sự hiển thị khi nỗ lực tập trung vào nó được thực hiện. Trong trường hợp của riêng tôi, tôi đã làm một cái gì đó dọc theo những dòng này

$('#elementid').animate({left:0,duration:'slow'});
$('#elementid').focus();

Điều này đã không làm việc. Tôi chỉ nhận ra những gì đang xảy ra khi tôi thực hiện $ ('# Elementid'). Focus () `từ bảng điều khiển đã hoạt động. Sự khác biệt - trong mã của tôi ở trên mục tiêu, không có gì chắc chắn rằng mục tiêu sẽ còn nguyên vẹn được hiển thị do hoạt ảnh có thể không hoàn thành . Và có manh mối

$('#elementid').animate({left:0,duration:'slow',complete:focusFunction});

function focusFunction(){$('#elementid').focus();}

hoạt động đúng như mong đợi. Ban đầu tôi cũng đã đặtsetTimeout giải pháp và nó cũng hoạt động. Tuy nhiên, thời gian chờ được chọn tùy ý chắc chắn sẽ phá vỡ giải pháp sớm hay muộn tùy thuộc vào mức độ chậm của thiết bị chủ trong quá trình đảm bảo rằng phần tử đích có thể nhìn thấy được.


Gợi ý có liên quan với tôi là "đảm bảo rằng mục tiêu thực sự có thể nhìn thấy". điều này trở nên có liên quan khi cố gắng tập trung vào các yếu tố được kết xuất có điều kiện.
charlie carver

Hoặc khi yếu tố cần tập trung visibility:hidden- nó sẽ không được tập trung.
bakrall

`bạn không thể tập trung vào một yếu tố chưa được nhìn thấy '- Tôi yêu bạn. Chỉ cần thêm thời gian chờ 100ms, tôi có thể kích hoạt tiêu điểm trên hộp tìm kiếm ẩn của mình. Cảm ơn!
LuBre

Coi chừng thời gian chờ. Những gì hoạt động trên máy phát triển của bạn có thể không hoạt động trên một cái khác.
DroidOS

15

nếu bạn sử dụng bootstrap + modal, điều này có hiệu quả với tôi:

  $(myModal).modal('toggle');
  $(myModal).on('shown.bs.modal', function() {
    $('#modalSearchBox').focus()
  });

8

Chỉ trong trường hợp có ai khác vấp phải câu hỏi này và có tình huống tương tự tôi gặp phải - tôi đã cố gắng đặt tiêu điểm sau khi nhấp vào yếu tố khác, nhưng tiêu điểm dường như không hoạt động. Hóa ra tôi chỉ cần một e.preventDefault();- đây là một ví dụ:

$('#recipients ul li').mousedown(function(e) {
    // add recipient to list
    ...
    // focus back onto the input
    $('#message_recipient_input').focus();
    // prevent the focus from leaving
    e.preventDefault();
});

Điều này đã giúp:

Nếu bạn gọi HTMLEuity.f Focus () từ trình xử lý sự kiện mousedown, bạn phải gọi event.preventDefault () để giữ tiêu điểm rời khỏi HTMLEuity. Nguồn: https://developer.mozilla.org/en/docs/Web/API/HTMLEuity/f Focus


2
Chỉ có một công trình! Kích hoạt là một div popup, nhấp vào ẩn div và đặt một số giá trị vào hộp văn bản (không phải là một trong những cần phải tập trung). Nếu không có DefDefault, hộp văn bản đó luôn được tập trung bất kể là gì -__-
ravief

4

Tôi nhận ra điều này là cũ, nhưng đã đi qua nó ngày hôm nay. Không có câu trả lời nào phù hợp với tôi, điều tôi tìm thấy có hiệu quả là setTimeout. Tôi muốn sự tập trung của mình được đặt vào đầu vào được đệ trình của một phương thức, sử dụng setTimeout hoạt động. Hi vọng điêu nay co ich!


Tôi cũng vậy! VÀ độ dài của thời gian chờ thực sự tạo ra sự khác biệt. IE ngu ngốc.
Eaglei22 ngày

1
Nhưng nó không hoạt động trên thiết bị di động. Các trình duyệt di động đang bỏ qua trong hầu hết các trường hợp mọi thứ bên trong setTimeout
Kosmonaft

1
Theo nguyên tắc thông thường, sử dụng setTimeoutlà một giải pháp tồi . Bạn không thể đảm bảo thời gian thực hiện trên máy của người dùng, vì vậy những thứ phụ thuộc vào thời gian là cực kỳ dễ vỡ.
Nathan

3

Tôi cũng đã từng gặp phải vấn đề này. Giải pháp hoạt động trong trường hợp của tôi là sử dụng thuộc tính tabindex trên phần tử HTML.

Tôi đã sử dụng ng-repeatcho một số phần tử li trong danh sách và tôi không thể tập trung vào li đầu tiên bằng cách sử dụng .f Focus (), vì vậy tôi chỉ cần thêm thuộc tính tabindex cho mỗi li trong vòng lặp.

vậy bây giờ <li ng-repeat="user in users track by $index" tabindex="{{$index+1}}"></li>

+1 đó là chỉ mục bắt đầu từ 0. Ngoài ra, hãy đảm bảo rằng phần tử có trong DOM trước khi gọi hàm .f Focus ()

Tôi hi vọng cái này giúp được.


2

Đối với những người có vấn đề không hoạt động vì bạn đã sử dụng "$ (phần tử) .show ()". Tôi đã giải quyết nó theo cách tiếp theo:

 var textbox = $("#otherOption");
 textbox.show("fast", function () {
    textbox[0].focus();
  });

Vì vậy, bạn không cần bộ hẹn giờ, nó sẽ thực thi sau khi phương thức hiển thị hoàn thành.


Này áp dụng cho bất kỳ chuyển đổi khác: slideDown(), fadeIn()vv
Álvaro González

2

Thêm một độ trễ trước khi lấy nét (). 200 ms là đủ

function focusAndCursor(selector){
  var input = $(selector);
  setTimeout(function() {
    // this focus on last character if input isn't empty
    tmp = input.val(); input.focus().val("").blur().focus().val(tmp);
  }, 200);
}

0

Có vấn đề này một lần nữa và tin hay không, tất cả những gì tôi phải làm là đóng các công cụ dành cho nhà phát triển. Rõ ràng tab Console có mức độ ưu tiên tập trung so với nội dung trang.


0

Hãy chắc chắn rằng các yếu tố và cha mẹ của nó được nhìn thấy. Bạn không thể sử dụng tập trung vào các yếu tố ẩn



-1

Đối với trường hợp của tôi, tôi đã phải chỉ định một chỉ mục tab ( -1nếu chỉ có thể tập trung qua tập lệnh)

<div tabindex='-1'>
<!-- ... -->
</div>
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.