2012-03-07 40 views
21

Một số suy nghĩ là ELEMENT_ID.focus() nằm bên trong các div bị ẩn vào một số thời điểm nhất định.Một số lý do cho jquery .focus() không hoạt động?

này phải là một vấn đề dễ giải quyết - nhưng tôi đang gặp khó khăn :(

*** đang hoạt động tốt -. Lĩnh vực văn bản không được tập trung vào việc khi tải trang lên

STEP1 [SOLVED] JAVASCRIPT:

$("#goal-input").focus(); 

$('#goal-input').keypress(function(event){ 
var keycode = (event.keyCode ? event.keyCode : event.which); 
    if(keycode == '13') { 
etc, etc, etc 
} 

HTML

<input type="text" id="goal-input" name="goal" /> 

[STEP2] JAVASCRIPT:

if (goal) { 
      step1.fadeOut('fast', function() { 
      step1.hide(); 
      step2.fadeIn('fast'); 

etc, etc 

HTML:

<div id="step-2"> 
     <div class="notifications"> 
     </div> 
     <input type="text" id="name" name="name" placeholder="Name" /> 
       <script type="text/javascript"> 
       $(function(){ 
       $("#name").focus(); 
       }); 
      </script> 

Tại sao không bước 2 làm việc? :(

+3

Làm thế nào về một số mã mẫu? - Theo tài liệu jQuery trên ['.focus()'] (http://api.jquery.com/focus/): 'Cố gắng đặt tiêu điểm thành phần tử ẩn gây ra lỗi trong Internet Explorer. Hãy cẩn thận để chỉ sử dụng .focus() trên các phần tử hiển thị. Để chạy trình xử lý sự kiện tập trung của phần tử mà không đặt tiêu điểm cho phần tử, hãy sử dụng .triggerHandler ("focus") thay vì .focus(). ' – Morgon

+0

Ý của bạn là" không hoạt động "? Ví dụ., mã chạy mà không có bất kỳ lỗi nào được báo cáo nhưng tiêu điểm không được đặt theo ý muốn của bạn hoặc trình duyệt có đưa ra lỗi không? – nnnnnn

+0

mã mẫu được cung cấp và những gì "không hoạt động" có nghĩa là (trường văn bản không tập trung vào) @nnnnnn – dngoo

Trả lời

12

bạn cần phải hoặc đặt mã dưới dạng HTML hoặc tải nếu sử dụng các sự kiện tải tài liệu:.

<input type="text" id="goal-input" name="goal" /> 
<script type="text/javascript"> 
$(function(){ 
    $("#goal-input").focus(); 
}); 
</script> 

Cập nhật:

Chuyển đổi div không kích hoạt sự kiện tải tài liệu vì mọi thứ đã được tải. Bạn cần tập trung nó khi bạn chuyển div:

if (goal) { 
     step1.fadeOut('fast', function() { 
      step1.hide(); 
      step2.fadeIn('fast', function() { 
       $("#name").focus(); 
      }); 
     }); 
} 
+2

Tôi muốn đi xa để nói rằng tất cả mã liên quan đến DOM phải luôn đi bên trong trình xử lý tải DOM, bất kể vị trí tương đối của nó với các mục tiêu của nó. :) – Morgon

+0

Demo: http://jsfiddle.net/BXpkY/ –

+0

Điều này chứng minh rằng chỉ cần ẩn và hiển thị phụ huynh 'div' nên thay đổi' $ .focus() 'firing: http://jsfiddle.net/3Sz8Z/ –

3

Hãy thử một cái gì đó như thế này khi bạn đang áp dụng tập trung theo cách đó nếu nguyên tố này được ẩn, nó sẽ không ném ra một lỗi:

$("#elementid").filter(':visible').focus(); 

Nó có thể làm cho ý nghĩa hơn để làm cho nguyên tố này có thể nhìn thấy, mặc dù mà sẽ yêu cầu mã cụ thể để bố trí của bạn

5

Đừng quên rằng trường đầu vào phải hiển thị trước, sau đó bạn có thể lấy nét trường đó.

$("#elementid").show(); 
$("#elementid input[type=text]").focus(); 
25

Tôi gặp sự cố khi kích hoạt tập trung vào yếu tố (đầu vào biểu mẫu) đang chuyển đổi sang trang. Tôi thấy nó có thể sửa được bằng cách gọi sự kiện lấy nét từ bên trong một setTimeout mà không có sự chậm trễ nào trên nó. Khi tôi hiểu nó (từ, ví dụ: this answer), điều này sẽ trì hoãn chức năng cho đến khi hàng đợi thực thi hiện tại kết thúc, vì vậy trong trường hợp này nó trì hoãn sự kiện lấy nét cho đến khi quá trình chuyển đổi hoàn tất.

setTimeout(function(){ 
    $('#goal-input').focus(); 
}); 
+0

điều này làm việc cho tôi, ty! –

+0

Ý tưởng sáng tạo ... –

+0

Tôi phải sử dụng hết thời gian chờ 600 trước khi nó bắt đầu hoạt động, vì vậy 'setTimeout (function() {$ ('# goal-input'). Focus();}, 600);' trong ví dụ trên. – SharpC

3

tôi thấy rằng focus không hoạt động khi cố gắng để có được một tập trung vào một yếu tố văn bản (chẳng hạn như một thông báo div) nhưng hoạt động khi tập trung vào các lĩnh vực đầu vào.

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