2009-08-25 17 views
15

Zajmuję się tworzeniem webapp przy użyciu jQuery. Mam funkcjonalność, która dodaje nowy wiersz z 3 pól wejściowych. Po utworzeniu tych elementów DOM chcę skupić się na jednym z pól wejściowych. Robię to, wywołując funkcję fokusu jQuery na wymaganym polu wejściowym.jQuery focus() czasami nie działa w IE8

Problem polega na tym, że wywoływanie fokusa() działa poprawnie w IE6 i FF3.5, ale nie działa w IE8.

Próbowałem zrobić prosty przykład tego problemu, aby go wyświetlić tutaj, ale z usuniętą wersją kodu fokusa() działa dobrze. Zgaduję więc, że DOM nie jest jeszcze gotowy, gdy zadzwonię focus() w IE8. Do tego próbowałem wywoływać setTimeout ("myFocus()", 400). Odniosłem sukces i w niektórych przypadkach fokus naprawdę działał, ale nadal nie zawsze. Losowo nie koncentruje się moje pole wejściowe.

Pytanie brzmi: czy ktokolwiek napotkał podobne problemy i czy ktoś ma pojęcie, jak go obejść? Używanie setTimeout wydaje się bardzo brzydkim obejściem.

Tnx z góry

Zmieniano: 26.08.2009

udało się odtworzyć na prostym przykładzie. Oto kod HTML + JS, który odtwarza ten błąd w 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> 

Aby odtworzyć: 1) wybierz wartość z pierwszej listy rozwijanej. Zobaczysz, że dane wejściowe po raz pierwszy działają 2) wybierz wartość z drugiego menu rozwijanego. Zobaczysz, że błąd jest powielany.

Następnie w kodzie możesz skomentować linię, w której wyświetla alert JS(). Dziwne jest to, że jeśli jest to alert(), to po jego skupieniu działa dobrze.

Mam nadzieję, że pomoże to zrozumieć, gdzie jest mój problem.

P.S. Potrzebuję mojej aplikacji do pracy w ten sposób - regeneruje ona te wejścia po wybraniu wartości z rozwijanego menu. To jest uproszczony przykład mojej aplikacji;).

+1

opublikuj fragment kodu. ułatwia to. – krishna

+0

Czy próbowałeś skupić się na zdarzeniu "load" okna (nie na "DOMContentLoaded", a.k.a. - 'document.ready (...)' - one)? – kangax

Odpowiedz

6

dziwo miałem ten sam problem i rozwiązać go za pomocą zwykłego starych skrypt tak:

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

Korzystanie jQuery równoważne $('#friend_name').focus(); nie działa w IE8: -/

+3

To jest coś, co możesz chcieć zgłosić do fundacji jQuery. – Fresheyeball

1

Ponieważ nie napisali żadnego kodu używasz:

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

To pozwoli na wykonywanie kodu JavaScript html po załadowaniu.

Należy również użyć live events. Kiedy twoje dodawanie danych wejściowych do domu będzie automatycznie wiązało się z nimi.

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

Oznacza to, że każde p, które zostanie utworzone, będzie miało przypisane do niego skupienie.

+0

Chcę skupić trochę uwagi, ale nie muszę być świadomy tego fokusu. P.S. Obecna stabilna wersja jQuery nie obsługuje transmisji na żywo dla zdarzenia "focus". – oskarae

30

Miałem podobny problem z moją aplikacją, ale nie mogę odtworzyć problemu z kodem. Mój problem był trochę inny, ponieważ moja strona zawierała hasz łączący, który powodował, że IE nie skupiał się na moim elemencie.

W każdym razie, aby obejść problem dodałem timeout:

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

niezauważalny przez użytkownika, ale daje IE chwilę oddychać.

+0

Czy wiesz, dlaczego to rozwiązanie działa? (Och, dzięki. To na pewno działa.) – jjnguy

+0

Jestem całkiem zainteresowany, dlaczego to działa również. – kukudas

+1

Z niektórych [stara dokumentacja] (http://javascript.gakaa.com/div-focus-4-0-5-.aspx): Aby ustawić pole tekstowe i zaznaczyć wstępnie cały tekst w polu, użyj sekwencja metod focus() i select() na elemencie. Jeśli ta sekwencja ma nastąpić po zmianie okna (na przykład po zamknięciu okna dialogowego alertu), umieść metody w oddzielnej funkcji i wywołaj tę funkcję za pomocą metody setTimeout() następującej po metodzie alert() dla okna dialogowego. Pozwala to systemowi IE/Windows na prawidłowe wykonanie instrukcji sekwencji. – davidchambers

4

Miał podobny problem z IE8. Chciałem skupić dane wejściowe w oknie dialogowym, gdy jest otwarte. Używane autoOpen = false. Zauważono, że fokus nie działa tylko dla pierwszego elementu, który można ustawić w oknie dialogowym. Próbowałem setTimeout, ale działało to tylko czasami. Przedostał się element rozmycia, który pomógł mi.

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

Dzięki! Dokładnie to trzeba zrobić, gdy opóźnienie nie pomaga. – Episodex

1

ten to najlepsze rozwiązanie na chwilę, aby ustawić ostrość:

$ ("elt"). adeIn (200, function() {$ ('. elt'). focus();});

8

W połączeniu z roztworem Kazysa za znalazłem to, aby rozwiązać wszystkie moje problemy (przy użyciu plików IE8 & .hta):

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

nie mam pojęcia dlaczego, ale jakoś wywołanie ostrości dwukrotnie pomaga IE wzdłuż .

EDYCJA: Odkryłem, że wywołanie funkcji .show() i .select() również może pomóc.

+0

'$ (" id "). Focus(). Focus();' działa dla mnie, czy jest jakiś minus przy użyciu tego? @Max Mayhem – bumbumpaw

+0

Nic, co jeszcze wiem. –

+0

Naprawiono go również w IE11!Dzięki :) – Krenor

0

To jest stare pytanie, ale jest najlepsze w wyszukiwaniu, więc chciałem je zaktualizować.

Nie wiem, czy kiedykolwiek zdarzyło się, że zostało to naprawione, ale wpadłem na ten problem ponownie w IE11, używając jquery-2.1.3. Zauważyłem, że owijanie fokusu w setTimeout, jak to określił Ponny powyżej, sprawdziło się najlepiej dla mnie.

Musiałem zwiększyć limit czasu w niektórych przypadkach, aby go uruchomić.