Có thể tập trung vào một <div> bằng cách sử dụng hàm JavaScript Focus () không?


227

Có thể tập trung vào một chức năng <div>sử dụng JavaScript focus()?

Tôi có một <div>thẻ

<div id="tries">You have 3 tries left</div>

Tôi đang cố gắng tập trung vào những điều trên <div>bằng cách sử dụng:

document.getElementById('tries').focus();

Nhưng nó không hoạt động. Ai đó có thể đề nghị một cái gì đó ....?


3
Bạn muốn điều gì xảy ra khi bạn 'tập trung' nó? Divs không chấp nhận đầu vào, vì vậy bạn có muốn flash đường viền hoặc flash vùng sáng nổi bật không?
Michael Shimmins

@Michael, vâng tôi cần <div> để thu hút sự chú ý của người dùng ...
OM The Eternity


1
@MichaelShimmins và bất kỳ ai khác, các phần tử <div> có thể chấp nhận đầu vào nếu bạn đã đặt nội dung có thể chỉnh sửa thành đúng. (Lý do tại sao tôi hỏi)
MattOlivos

1
@MichaelShimmins divcó thể chấp nhận đầu vào nếu chúng tràn và hiển thị thanh cuộn. Khi một divthanh cuộn được tập trung, các phím mũi tên sẽ cuộn nội dung của nó (thay vì nội dung của các yếu tố khác như body).
Rory O'Kane

Câu trả lời:


101
window.location.hash = '#tries';

Điều này sẽ cuộn đến phần tử trong câu hỏi, về cơ bản là "tập trung" vào nó.


2
@Casey Chu: Nó hoạt động tốt trong tức là nhưng không phải trong firefox, bạn có ý kiến ​​gì không?
Haseeb Akhtar

Nó không hoạt động trong một số phiên bản Chrome ... Tuy nhiên, giải pháp @vinoths thực hiện điều đó
Charliemops

1
Điều này hoạt động nhưng ... với Angular bạn sẽ gặp vấn đề !!
Carlos Verdes

@CarlosVerdes; Có một giải pháp cho Angular?
Mac Vicy

3
không trả lời câu hỏi 'trọng tâm', đây không phải là câu trả lời đúng. trong trường hợp của tôi, tôi muốn tập trung vào div 'contentEditable' và thủ thuật của bạn không giúp ích được gì.
arnaudambro

453

Vâng - điều này là có thể. Để làm điều đó, bạn cần chỉ định một tabindex ...

<div tabindex="0">Hello World</div>

Một tabindex bằng 0 sẽ đặt thẻ "theo thứ tự tab tự nhiên của trang". Một số cao hơn sẽ cung cấp cho nó một thứ tự ưu tiên cụ thể, trong đó 1 sẽ là đầu tiên, 2 giây và cứ thế.

Bạn cũng có thể đưa ra một tabindex là -1, điều này sẽ khiến div chỉ có thể lấy nét theo tập lệnh chứ không phải người dùng.

document.getElementById('test').onclick = function () {
    document.getElementById('scripted').focus();
};
div:focus {
    background-color: Aqua;
}
<div>Element X (not focusable)</div>
<div tabindex="0">Element Y (user or script focusable)</div>
<div tabindex="-1" id="scripted">Element Z (script-only focusable)</div>
<div id="test">Set Focus To Element Z</div>

Rõ ràng, thật đáng tiếc khi có một yếu tố bạn có thể tập trung theo tập lệnh mà bạn không thể tập trung bằng phương thức nhập khác (đặc biệt là nếu người dùng chỉ sử dụng bàn phím hoặc bị hạn chế tương tự). Ngoài ra còn có một loạt các yếu tố tiêu chuẩn có thể tập trung theo mặc định và có thông tin ngữ nghĩa được đưa vào để hỗ trợ người dùng. Sử dụng kiến ​​thức này một cách khôn ngoan.


6
@Michael Shimmins, Điều này cho phép phần tử có thể tập trung (theo cách không chuẩn!) Với focus().
strager

2
@Olical - Tôi khá chắc chắn rằng đó chính xác là những gì nó nói trong dòng cuối cùng có thể trả lời. Hãy cho tôi biết nếu bạn nghĩ rằng có một vấn đề cần chỉnh sửa.
Fenton

2
Nếu nó không được rõ ràng, thêm tabindexvào một yếu tố sẽ làm cho nó có thể đặt tiêu, cho phép focus()blur()phương pháp, và sau đó bạn có thể kích hoạt một tập trung như thế này:document.getElementById('tries').focus();
cơm rang

4
Xin chào @SteveOwen - có vẻ như nó vẫn hoạt động trong Firefox v42. Tôi đã thêm một đoạn trích vào câu trả lời này để bạn có thể chạy nó và kiểm tra.
Fenton

9
@SteveOwen sử dụng window.location.hash = ...là cách để làm điều đó. tiêu điểm không có nghĩa là "đưa vào tầm nhìn", nó chỉ có nghĩa là đặt trọng tâm vào yếu tố đó.
Fenton

76

document.getElementById('tries').scrollIntoView()làm. Điều này hoạt động tốt hơn so với window.location.hash khi bạn có định vị cố định.


2
Lưu ý rằng giải pháp này sẽ không hoạt động trong IE, Opera hoặc Safari.
AlecRust

1
Tôi mới thử cái này trong Chrome 65 và nó không hoạt động. Lớp phủ div cuộn vào chế độ xem, nhưng tiêu điểm vẫn nằm trong div nền. Cách chắc chắn duy nhất tôi biết là có một phần tử có thể lập bảng (sử dụng tabindexthuộc tính) trong div lớp phủ và sử dụng focus()trên phần tử đó thay thế.
thdoan

@ om-the-vĩnh cửu đã tuyên bố rằng anh ta muốn div kêu gọi sự chú ý của người dùng, vì vậy điều anh ta cần không phải là tập trung thực sự (ngay cả khi làm việc không chính xác để làm điều đó), nhưng đưa nó lên màn hình , điều này giải quyết được điều đó
Omar Vazquez

Nếu tôi làm điều này trong Chrome, nó sẽ tiếp tục cuộn trở lại trường nhập liệu vẫn tập trung. Đặc biệt là nếu trang chưa tải xong.
Roger Krueger

37

Bạn có thể sử dụng tabindex

<div tabindex="-1"  id="tries"></div>

Giá trị tabindex có thể cho phép một số hành vi thú vị.

  • Nếu được cho giá trị là "-1", phần tử không thể được gắn thẻ nhưng có thể lấy tiêu điểm cho phần tử theo chương trình (sử dụng phần tử.f Focus ()).
  • Nếu được đưa ra một giá trị 0, phần tử có thể được tập trung thông qua bàn phím và rơi vào dòng chảy của tài liệu. Các giá trị lớn hơn 0 tạo mức ưu tiên với 1 là quan trọng nhất.

1
Wow, cảm ơn thủ thuật tuyệt vời. Cảm ơn bạn! Tôi sẽ không tìm ra điều này khác.
Lập trình viên

Cứu người, cảm ơn. Trong Edge, một div có thể được tập trung nhưng không có trong Chrome mà không có thủ thuật này. Câu trả lời được chấp nhận là rất tốt nhưng tôi không muốn có thêm phần trong url.
Cal

cứu lấy cuộc sống. Làm việc tốt với chrome và firefox
Susampath

14
<div id="inner" tabindex="0">
    this div can now have focus and receive keyboard events
</div>

Điều này chỉ hoạt động với tôi trong Chromium / Chrome 46 kết hợp với$('#inner').focus();
TNT

2

Tôi muốn đề xuất một cái gì đó giống như của Michael Shimmin nhưng không mã hóa những thứ như phần tử hoặc CSS được áp dụng cho nó.

Tôi chỉ sử dụng jQuery để thêm / xóa lớp, nếu bạn không muốn sử dụng jquery, bạn chỉ cần một thay thế cho add / removeClass

--Javascript

function highlight(el, durationMs) { 
  el = $(el);
  el.addClass('highlighted');
  setTimeout(function() {
    el.removeClass('highlighted')
  }, durationMs || 1000);
}

highlight(document.getElementById('tries'));

- CSS

#tries {
    border: 1px solid gray;
}

#tries.highlighted {
    border: 3px solid red;
}

1

document.getElementById('test').onclick = function () {
    document.getElementById('scripted').focus();
};
div:focus {
    background-color: Aqua;
}
<div>Element X (not focusable)</div>
<div tabindex="0">Element Y (user or script focusable)</div>
<div tabindex="-1" id="scripted">Element Z (script-only focusable)</div>
<div id="test">Set Focus To Element Z</div>


0

Để làm cho đường viền flash bạn có thể làm điều này:

function focusTries() {
    document.getElementById('tries').style.border = 'solid 1px #ff0000;'
    setTimeout ( clearBorder(), 1000 );
}

function clearBorder() {
    document.getElementById('tries').style.border = '';
}

Điều này sẽ làm cho đường viền rắn màu đỏ trong 1 giây sau đó loại bỏ nó một lần nữa.

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.