2009-08-25 31 views
15

Tôi đang phát triển webapp bằng jQuery. Tôi có chức năng thêm hàng mới gồm 3 trường nhập. Sau khi tạo các phần tử DOM này, tôi muốn tập trung vào một trong các trường nhập. Tôi đang làm điều đó bằng cách gọi hàm jQuery focus() trên trường đầu vào cần thiết.jQuery focus() đôi khi không hoạt động trong IE8

Vấn đề là tập trung gọi() hoạt động tốt trong IE6 và FF3.5, nhưng không hoạt động trong IE8.

Tôi đã cố gắng làm ví dụ đơn giản về vấn đề này để hiển thị nó ở đây, nhưng với phiên bản lấy nét mã() đang hoạt động tốt. Vì vậy, tôi đoán là DOM chưa sẵn sàng khi tôi gọi focus() trong IE8. Đối với điều này tôi đã cố gắng gọi setTimeout ('myFocus()', 400). Tôi đã thành công và trong một số trường hợp, tập trung thực sự hiệu quả nhưng vẫn không phải lúc nào. Ngẫu nhiên nó không tập trung vào trường nhập của tôi.

Câu hỏi là: Có ai phải đối mặt với các vấn đề tương tự và không ai biết cách giải quyết nó? Sử dụng setTimeout cảm thấy như cách giải quyết rất xấu.

Tnx trước

được sửa đổi: 26.08.2009

Kế nhiệm để tái tạo trên ví dụ đơn giản. Đây là mã HTML + JS sao chép lỗi này trên IE8.

<html> 
<head> 
    <script type="text/javascript" src="js/jquery-1.3.2.min.js"></script> 
    <script type="text/javascript"> 
     function performChanged() { 
      formChanged = true; 
     } 

     function handleChange() { 
      var parentDiv = $('#container'); 
      newValue = $(html).html(); 

      parentDiv.html(newValue); 
      $(".sel1",parentDiv).bind('change',handleChange); 
      //alert('Uncomment this and after alert focus will be on input'); 
      $("input.cv_values",parentDiv).focus(); 
     } 

     $(document).ready(function() { 
      $('.trackChange').bind('change', handleChange); 
     }); 
     var html = '<div class=\"div1\">\n<select class=\"sel1\" id=\"sel1\" name=\"sel1\"><option value=\"\"><\/option>\n<option value=\"11\">Select me to see problem<\/option>\n<\/select>\n\n\n<input class=\"cv_values\" id=\"sel3\" name=\"sel3\" size=\"30\" type=\"text\" value=\"\" /><br/>Focus should in input field. With alert it is but without alert focus is not there</div>'; 
    </script> 
</head> 
<body> 
    <select class="trackChange" onchange='performChanged();'> 
     <option value=""></option> 
     <option value="1" >Select me to generate new inputs</option> 
    </select> 

    <div id="container"></div> 
</body> 

Để tái sản xuất: 1) chọn giá trị từ danh sách thả xuống đầu tiên. Bạn sẽ thấy đầu vào thời gian đầu tiên đang hoạt động 2) chọn giá trị từ menu thả xuống thứ hai. Bạn sẽ thấy lỗi đó được sao chép.

Sau đó, trong mã, bạn có thể nhận xét dòng nơi hiển thị cảnh báo JS(). Điều kỳ lạ là nếu có cảnh báo này() thì sau khi tiêu điểm đang hoạt động tốt.

Hy vọng điều này sẽ giúp bạn hiểu vấn đề của mình ở đâu.

P.S. Tôi cần ứng dụng của mình hoạt động theo cách này - nó đang tạo lại các đầu vào đó sau khi chọn giá trị từ menu thả xuống. Đây là ví dụ đơn giản về ứng dụng của tôi;).

+1

đăng đoạn mã. làm mọi thứ dễ dàng hơn. – krishna

+0

Bạn đã thử tập trung vào sự kiện "tải" của cửa sổ (không phải trên "DOMContentLoaded", a.k.a. - 'document.ready (...)' - một)? – kangax

Trả lời

6

Kỳ lạ thay tôi đã có cùng một vấn đề và giải quyết nó bằng cách sử đồng bằng javascript cũ như vậy:

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

Sử dụng jQuery tương đương $('#friend_name').focus(); đã không làm việc trong IE8: -/

+3

Đây là điều bạn có thể muốn báo cáo lên nền tảng jQuery. – Fresheyeball

1

Vì bạn đã không đăng tải bất kỳ mã bạn đang sử dụng:

$(document).ready(function(){ 
    //code here 
}); 

này sẽ làm cho chạy javascript sau html được tải.

Và bạn cũng nên sử dụng live events. Khi bạn thêm đầu vào vào dom, nó sẽ tự động có tiêu điểm được liên kết với chúng.

$("p").live("focus", function(){ 
    alert($(this).text()); 
}); 

Điều này có nghĩa là mọi p được tạo sẽ tập trung vào nó.

+0

Tôi muốn tập trung vào một số đầu vào nhưng tôi không cần phải biết về sự kiện trọng tâm đó. P.S. Phiên bản ổn định hiện tại của jQuery không hỗ trợ trực tiếp cho sự kiện "tập trung". – oskarae

30

Tôi gặp sự cố tương tự với ứng dụng của mình, nhưng tôi không thể tạo lại vấn đề tiêu điểm với mã của bạn. Vấn đề của tôi hơi khác một chút ở chỗ trang của tôi có một băm liên kết khiến IE không tập trung vào yếu tố của tôi.

Dù sao, để có được xung quanh vấn đề tôi đã thêm một thời gian chờ:

setTimeout(function() { 
    $('.my-thing').focus(); 
}, 100); 

Không dễ nhận thấy bởi một người dùng nhưng nó mang lại cho IE một chút thời gian để thở.

+0

Bạn có biết tại sao giải pháp này hoạt động không? (Oh, cảm ơn. Nó chắc chắn hoạt động.) – jjnguy

+0

Tôi khá quan tâm đến lý do tại sao điều này hoạt động như là tốt. – kukudas

+1

Từ một số [tài liệu cổ] (http://javascript.gakaa.com/div-focus-4-0-5-.aspx): Để tập trung vào hộp văn bản và chọn trước tất cả văn bản trong hộp, hãy sử dụng chuỗi các phương thức focus() và select() trên phần tử. Nếu chuỗi này xảy ra sau khi cửa sổ thay đổi (như sau khi hộp thoại cảnh báo đóng), hãy đặt các phương thức trong một hàm riêng biệt và gọi hàm này thông qua phương thức setTimeout() theo phương thức alert() cho hộp thoại. Điều này cho phép IE/Windows thực thi câu lệnh tuần tự một cách chính xác. – davidchambers

4

Đã xảy ra sự cố tương tự với IE8. Tôi muốn tập trung đầu vào trong hộp thoại khi nó được mở ra. Được sử dụng autoOpen = false. Nhận thấy rằng tiêu điểm không chỉ hoạt động cho phần tử có thể lấy nét đầu tiên trong hộp thoại. Đã thử setTimeout nhưng đôi khi nó chỉ hoạt động. Yếu tố làm mờ trước khi tập trung giúp tôi.

$('#dialog').find('#name').blur(); 
$('#dialog').find('#name').focus(); 
+0

Cảm ơn! Đó là chính xác những gì người ta cần làm khi sự chậm trễ không giúp được gì. – Episodex

1

này là giải pháp tốt nhất cho thời điểm đặt trọng tâm:

$ ('. elt'). f adeIn (200, hàm() {$ ('. elt'). focus();});

8

Cùng với giải pháp Kazys, tôi thấy điều này để sửa chữa tất cả các vấn đề của tôi (sử dụng file IE8 & .hta):

$("elem").blur(); 
$("elem").focus().focus(); 

Tôi không có ý tưởng tại sao, nhưng bằng cách nào đó tập trung kêu gọi hai lần giúp IE cùng .

EDIT: Tôi đã nhận thấy rằng gọi .show() và .select() cũng có thể hữu ích.

+0

'$ (" id "). Focus(). Focus();' làm việc cho tôi, có nhược điểm nào khi sử dụng cái này không? @Max Mayhem – bumbumpaw

+0

Không có gì mà tôi biết. –

+0

Đã sửa lỗi cho tôi trong IE11!Cảm ơn :) – Krenor

0

Đây là một câu hỏi cũ, nhưng nó là đầu tìm kiếm, vì vậy muốn cập nhật.

Tôi không biết có bao giờ nó đã được sửa chưa, nhưng tôi đã gặp phải vấn đề này một lần nữa hôm nay trong IE11, sử dụng jquery-2.1.3. Tôi thấy rằng gói các cuộc gọi tập trung trong một setTimeout, như đặt ra bởi Ponny ở trên, làm việc tốt nhất cho tôi.

Tôi cần tăng thời gian chờ trong một số trường hợp, để nó hoạt động.

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