2009-09-16 14 views
40

Jaka jest właściwa metoda ustawiania fokusu na określone pole w dynamicznie ładowanym DIV?Ustaw fokus na pole w dynamicznie ładowanym DIV

$("#display").load("?control=msgs"); // loads the HTML into the DIV 
$('#display').fadeIn("fast"); // display it 
$("tex#header").focus();   // ?? neither that 
$("input#header").focus();  // ?? nor that 
$('#display', '#header').focus() // ?? nor that 
$("#header").focus();    // ?? nor that works 

następujący kod HTML jest pobierany do display DIV:

<div id="display"> 
<form id="newHeaderForm" class="dataform" action="/" method="post"> 
    <input id="to" type="hidden" value="22" name="to"/> 
    <dl> 
     <dt>Header</dt> 
     <dd> 
      <input id="header" class="large" type="text" name="header" value="" maxlength="128"/> 
     </dd> 
</form> 
</div> 

Wiele, wiele dzięki!

+0

Czy możesz również pokazać nam html, który zostanie wygenerowany? – Bela

+1

$ ('# display', '#header'). Focus() powinien zadziałać – orip

Odpowiedz

57

Funkcja load() jest funkcją asynchroniczną. Powinieneś ustawić fokus po zakończeniu wywołania load(), które jest w funkcji wywołania zwrotnego load(), ponieważ w przeciwnym razie element, do którego odwołujesz się przez #header, jeszcze nie istnieje. Na przykład:

$("#display").load("?control=msgs", {}, function() { 
    $('#header').focus(); 
}); 

miałem problemów sobie nawet z tego rozwiązania, więc zrobiłem setTimeout w zwrotnego i ustawić ostrość na timeout, aby/naprawdę/pewien element istnieje.

+1

Wciąż widzę rozwiązania takie jak ten w odniesieniu do trudnych scenariuszy z udziałem DOM i byciem "gotowym" .Czy po prostu nie ma alternatywy dla wywoływania 'setTimeout' przez dowolnie długi czas i mając nadzieję, że to wystarczy? Wydaje mi się, że takie podejście jest z przerwami zawierane. Ten problem pojawił się ostatnio w moim pytaniu: http://stackoverflow.com/questions/21191336/getting-chrome-to-prompt-to-save-password-when-dynamically- generujące -the-forma- – EleventyOne

+0

Limit czasu funkcja również obecna w Angular.Inna składnia, ale to samo rozwiązanie.Dziękuję za ustawienie mnie na właściwym torze z timeoutem. $ timeout (function() { \t \t \t \t \t $ window.document.getElementById ("nazwa"). Focus(); \t \t \t \t}); ' – Michel

12

Czy próbowałeś po prostu wybrać przez Id?

$("#header").focus(); 

Widząc jak identyfikatory powinny być unikalne, nie ma potrzeby, aby mieć bardziej konkretnego wyboru.

+0

Wielkie dzięki, ale to też nie działa ( – MrG

+1

powinieneś był umieścić ten dokument w środku.nie działa – Omu

3

Jeśli

$("#header").focus(); 

nie działa wtedy jest tam inny element na swojej stronie z identyfikatorem nagłówka?

Użyj firebug, aby uruchomić $("#header") i zobaczyć, co powraca.

1

Dynamicznie dodane elementy muszą zostać dodane do DOM ... clone().append() dodaje je do DOM ..., który pozwala na ich wybór za pomocą jquery.

3

Próbowałem, ale to nie działa, proszę dać mi więcej porad, aby rozwiązać ten problem. dziękuję za pomoc

+0

Czy ustawiłeś identyfikator pola, np. ? Przetestuj swój kod w Firefoksie i włącz konsolę błędów lub w Chrome z punktem przerwania we właściwym miejscu, może to pomóc. – MrG

8

Tak, dzieje się tak, gdy manipulujemy elementem, który jeszcze nie istnieje (kilku współpracowników tutaj również miało dobry cel z unikalnym identyfikatorem). Wpadłem na podobny problem. Muszę też przekazać argument do funkcji manipulującej elementem, który wkrótce zostanie wyrenderowany.

Rozwiązanie sprawdzone tutaj nie pomogło mi. W końcu znalazłem taki, który działał zaraz po wyjęciu z pudełka. I to też jest bardzo ładne - zamknięcia.

Zamiast:

$('#header').focus(); 
or the tempting: 
setTimeout($('#header').focus(), 500); 

Spróbuj tego:

setTimeout(function() { $('#header').focus() }, 500); 

W moim kodu, testowanie przekazując argument ten nie działa, czas oczekiwania został zignorowany:

setTimeout(alert('Hello, '+name), 1000); 

To działa, czas oczekiwania:

setTimeout(function() { alert('Hello, '+name) }, 1000); 

To jest do bani, że w3schools o tym nie wspomina.

Kredyty dostępne są pod adresem: makemineatriple.com.

Mamy nadzieję, że pomoże to komuś, kto tu przyjdzie.

Marty

+0

Świetnie, działa. Dzięki :-) – Biki

+0

SetTimeout pozornie pomaga, nawet jeśli element dobrze i prawdziwie istnieje przed wywołaniem '.focus()'. Jednak wartość 500 jest prawdopodobnie przesadzona. Działa dobrze dla mnie z 10 :) – Nick

+0

Pracowałem świetnie, okrzyki. – Leo

2

Omu Jak podkreślił, należy ustawić ostrość w dokumencie gotowej funkcji. jQuery zapewnia to za Ciebie. I wybierz na id. Na przykład, jeśli masz stronę logowania:

$(function() { $("#login-user-name").focus(); }); // jQuery rocks! 
1

To działa podczas ładowania strony.

<script type="text/javascript"> 
    $(function() { 
     $("#header").focus(); 
    }); 
</script> 
0
$("#header").attr('tabindex', -1).focus(); 
0
$(function(){ 
    $('body').on('keypress','.sobitie_snses input',function(e){ 
     if(e.keyCode==13){ 
      $(this).blur(); 
      var new_fild = $(this).clone().val(''); 
      $(this).parent().append(new_fild); 
      $(new_fild).focus(); 
     } 
    }); 
}); 

najbardziej błędu są bo u używać niewłaściwy obiekt ustawić prorepty lub funkcję. Użyj console.log (new_fild); aby zobaczyć, do jakiego obiektu U próbujesz ustawić prorepty lub funkcję.