Zapobiegaj ustawianiu fokusu w oknie dialogowym interfejsu użytkownika jQuery na pierwsze pole tekstowe

156

Skonfigurowałem modalne okno dialogowe interfejsu użytkownika jQuery, które będzie wyświetlane, gdy użytkownik kliknie łącze. Istnieją dwa pola tekstowe (pokazuję tylko kod 1 dla zwięzłości) w tym znaczniku div okna dialogowego i zmienia się na pole tekstowe DatePicker interfejsu jQuery, które reaguje na fokus.

Problem polega na tym, że okno dialogowe interfejsu użytkownika jQuery („otwórz”) w jakiś sposób powoduje, że pierwsze pole tekstowe ma fokus, które następnie powoduje natychmiastowe otwarcie kalendarza DatePicker.

Dlatego szukam sposobu, aby zapobiec automatycznemu ustawianiu ostrości.

<div><a id="lnkAddReservation" href="#">Add reservation</a></div>

<div id="divNewReservation" style="display:none" title="Add reservation">
    <table>
        <tr>
            <th><asp:Label AssociatedControlID="txtStartDate" runat="server" Text="Start date" /></th>
            <td>
                <asp:TextBox ID="txtStartDate" runat="server" CssClass="datepicker" />
            </td>
        </tr>
    </table>

    <div>
        <asp:Button ID="btnAddReservation" runat="server" OnClick="btnAddReservation_Click" Text="Add reservation" />
    </div>
</div>

<script type="text/javascript">
    $(document).ready(function() {
        var dlg = $('#divNewReservation');
        $('.datepicker').datepicker({ duration: '' });
        dlg.dialog({ autoOpen:false, modal: true, width:400 });
        $('#lnkAddReservation').click(function() { dlg.dialog('open'); return false; });
        dlg.parent().appendTo(jQuery("form:first"));
    });
</script>
slolife
źródło
skupi się nawet na obrazie! zarówno do zwykłych tagów <img> - jak i do <input type = image>
Simon_Weaver

Odpowiedzi:

78

jQuery UI 1.10.0 Changelog wyświetla bilet 4731 jako naprawiony.

Wygląda na to, że focusSelector nie został zaimplementowany, ale zamiast tego zastosowano kaskadowe wyszukiwanie różnych elementów. Z biletu:

Rozszerz autofokus, zaczynając od [autofokus], następnie: zawartość z zakładkami, następnie panel przycisków, przycisk zamykania, a następnie okno dialogowe

Więc oznacz element autofocusatrybutem i to jest element, który powinien mieć fokus:

<input autofocus>

W dokumentacji wyjaśniono logikę fokusu (tuż pod spisem treści, pod tytułem „Focus”):

Po otwarciu okna dialogowego fokus jest automatycznie przenoszony do pierwszego elementu, który pasuje do następujących elementów:

  1. Pierwszy element w oknie dialogowym z autofocusatrybutem
  2. Pierwszy :tabbableelement w treści okna dialogowego
  3. Pierwszy :tabbableelement w panelu przycisków okna dialogowego
  4. Przycisk zamykania okna dialogowego
  5. Samo okno dialogowe
slolife
źródło
Po co głos przeciw? Jeśli to dlatego, że wymieniłem 1.9 jako wersję poprawioną, zaktualizowałem do 1.10, aby pasował do biletu.
slolife
1
Patrzę na dokumentację jquery-ui 1.10 dla Dialog i nie widzę jej. Szukałem „focusSelector” w interfejsie API, ale go tam nie ma.
Paul Tomblin
3
Ustawienie fokusu na dowolny element, który jest poza ekranem, powoduje przewinięcie okna w górę lub w dół do tego elementu i dzieje się tak za każdym razem, gdy okno jest aktywne, a nie tylko przy otwartym oknie dialogowym. Jeśli użyję Firebuga do „inspekcji elementu”, a następnie kliknę z powrotem w oknie dokumentu, moje okno przewinie się w górę lub w dół do dowolnego elementu, na którym koncentruje się jQuery-UI. Nie chodzi o to, jak wybrać, który element ma być aktywny, ale jak zapobiec skupieniu. Wybór innego elementu, na którym należy się skupić, nie rozwiązałby problemu.
Vladimir Kornea
4
Pomysł, że interfejs użytkownika jQuery uważa to za „naprawione”, jest szalony. Rozwiązaniem jest usunięcie żadnej logiki autofokusa całkowicie. Poprosiłem cię o otwarcie okna dialogowego, a nie skupianie się na danych wejściowych. Tak denerwujące.
AJB
2
fwiw, dodałem wejście w / type = "hidden" nad pierwszym wejściem i dodałem do niego atrybut autofocus. Nie oznacza tego, co myślisz, że oznacza, ale działa w celu rozwiązania tego problemu.
jinglesthula
77

Dodaj ukrytą rozpiętość nad nią, użyj ui-helper-hidden-access, aby ukryć ją za pomocą pozycjonowania bezwzględnego. Wiem, że masz tę klasę, ponieważ używasz okna dialogowego z jquery-ui i jest w jquery-ui.

<span class="ui-helper-hidden-accessible"><input type="text"/></span>
Patrick Lee Scott
źródło
1
Świetna praca. Nie jest wymagany js, nie zmienia układu, a interfejs użytkownika jquery obsługuje go natywnie.
steampowered
Zgadzam się, świetna robota. Miło też wiedzieć o klasach z ukrytym dostępem! Dzięki!!
user1055761
4
Powoduje to problemy dla osób korzystających z technologii wspomagających (np.
Czytników
1
@ rink.attendant.6 jakie problemy?
oxfn
niesamowite rozwiązanie
Pedro Coelho
63

W jQuery UI> = 1.10.2, możesz zastąpić _focusTabbablemetodę prototypową funkcją placebo:

$.ui.dialog.prototype._focusTabbable = $.noop;

Skrzypce

Wpłynie to na wszystkie dialogstrony na stronie bez konieczności ręcznej edycji każdego z nich.

Oryginalna funkcja nie robi nic poza ustawianiem fokusu na pierwszy element z autofocusatrybutem / tabbableelementem / lub cofaniem się do samego okna dialogowego. Ponieważ jego użycie polega tylko na ustawieniu ostrości na elemencie, nie powinno być problemu z zastąpieniem go plikiem noop.

Fabrício Matté
źródło
7
Spalały się na tym godziny, godziny i godziny. Mój klient ci dziękuje.
lamarant
1
To powinna być odpowiedź!
briansol
2 dni szukałem tego rozwiązania ... nic innego nie działało ... wielkie dzięki!
Legionar
1
Ostrzeżenie: gdy pojawi się okno dialogowe, naciśnięcie klawisza Escape nie zamknie okna (dopóki nie zaznaczysz okna).
Robert
1
@Robert, zamiast zastępować go $.noop, zamień go na funkcję, która zapisuje aktywne okno dialogowe, a następnie zarejestruj globalną procedurę obsługi zdarzeń klucza, która przechwytuje ESCi zamyka „aktywne” okno dialogowe, jeśli takie istnieje.
Perkins
28

Począwszy od jQuery UI 1.10.0, możesz wybrać element wejściowy, na którym chcesz się skupić, używając autofokusa atrybutu HTML5 .

Wszystko, co musisz zrobić, to utworzyć fikcyjny element jako pierwszy wpis w oknie dialogowym. Absorbuje skupienie dla ciebie.

<input type="hidden" autofocus="autofocus" />

Zostało to przetestowane w Chrome, Firefox i Internet Explorer (wszystkie najnowsze wersje) 7 lutego 2013 r.

http://jqueryui.com/upgrade-guide/1.10/#added-ability-to-specify-which-element-to-focus-on-open

Silkfire
źródło
27

Znalazłem następujący kod funkcji okna dialogowego interfejsu użytkownika jQuery do otwierania.

c([]).add(d.find(".ui-dialog-content :tabbable:first")).add(d.find(".ui-dialog-buttonpane :tabbable:first")).add(d).filter(":first").focus();

Możesz obejść zachowanie jQuery lub zmienić zachowanie.

tabindex -1 działa jako obejście.


źródło
1
Czy tabindex = -1 nie uniemożliwi mi przejścia do pola tekstowego?
slolife
2
Dzięki za badania. Teraz wiem, że robi to rzeczywisty kod. Mogę zasugerować zespołowi jQuery UI, aby dodać opcję wyłączania tego autofokusu.
slolife
3
@slolife - Przepraszamy za wskrzeszenie tego naprawdę starego wątku, ale ten bilet mówi, że poprawka ( focusSelectoropcja) powinna znajdować się w jQueryUI 1.8, a jesteśmy teraz na 1.8.13 i nie widzę tego w dokumentach dialogowych jQueryUI . Co się z tym stało?
Tom Hamming,
Nieważne. Widziałem w historii modyfikacji „Milestone zmienił się z TBD na 1.8” i nie zauważyłem, że tak naprawdę na górze jest napisane 1,9.
Tom Hamming
Mam podobny problem, moje obejście jest opisane tutaj - stackoverflow.com/a/12250193/80002
oznacz
15

Po prostu wymyśliłem to podczas zabawy.

Znalazłem dzięki tym rozwiązaniom, aby usunąć fokus, spowodował, że ESCklawisz przestał działać (tj. Zamknął okno dialogowe) przy pierwszym wejściu do okna dialogowego.

Jeśli okno dialogowe otworzy się i natychmiast wciśniesz ESC, nie zamkniesz okna (jeśli masz to włączone), ponieważ fokus znajduje się na jakimś ukrytym polu lub czymś w tym rodzaju i nie otrzymuje zdarzeń naciśnięcia klawisza.

Sposób, w jaki to naprawiłem, polegał na dodaniu tego do zdarzenia open, aby zamiast tego usunąć fokus z pierwszego pola:

$('#myDialog').dialog({
    open: function(event,ui) {
        $(this).parent().focus();
    }
});

Spowoduje to ustawienie fokusu na oknie dialogowym, które nie jest widoczne, a następnie ESCklawisz działa.

Rob Donovan
źródło
3
Wydaje się, że jest to jedyne działające rozwiązanie, które nie obejmuje dodawania bezużytecznego HTML, usuwania tabindexu czy łamania klawisza ESC.
Bojan Bedrač
10

Ustaw tabindex wejścia na -1, a następnie ustaw dialog.open, aby przywrócić tabindex, jeśli będziesz tego potrzebować później:

$(function() {
    $( "#dialog-message" ).dialog({
        modal: true,
        width: 500,
        autoOpen: false,
        resizable: false,
        open: function()
        {
            $( "#datepicker1" ).attr("tabindex","1");
            $( "#datepicker2" ).attr("tabindex","2");
        }
    });
});
plac Czerwony
źródło
4
Czy tabindex = -1 nie uniemożliwi mi przejścia do pola tekstowego?
slolife
1
Możesz użyć setTimeout, aby ustawić indeks tabulacji z powrotem po wyświetleniu okna dialogowego
redsquare
10

Moje obejście:

open: function(){
  jQuery('input:first').blur();
  jQuery('#ui-datepicker-div').hide();
},  
Tomasz
źródło
+1. Działa jak urok za pomocą :firstselektora lub .first()w FF / Chrome / IE9. Wrzucenie go do dialogopenwiązania też działa.
nickb
Ten też mnie tam doprowadził. Z wyjątkiem mnie, moje okno dialogowe nie miało żadnych danych wejściowych, a pierwszy link był aktywny ... więc dodałem tę opcję do mojego okna dialogowego jQuery:open: function(){ $('a').blur(); // no autofocus on links }
Marcus
8

Treść była dłuższa niż okno dialogowe. Po otwarciu okno dialogowe przewijało się do pierwszej: tabbable, która znajdowała się na dole. Oto moja poprawka.

$("#myDialog").dialog({
   ...
   open: function(event, ui) { $(this).scrollTop(0); }
});
thetoolman
źródło
To działało dla mnie, ale $('...').blur();zamiast przewijania użyłem .
Jawa,
4
Moja treść była również bardzo długa. rozmycie usunęło zaznaczenie, ale pozostawiło okno dialogowe przewijane na sam dół. scrollTop przewinął zawartość do góry, ale pozostawił zaznaczenie. Skończyło się na użyciu $ ('...'). Blur (); $ (this) .scrollTop (0); pracował jak mistrz.
7

Proste obejście:

Po prostu utwórz niewidoczny element z tabindex = 1 ... To nie skupi się na datepicker ...

na przykład.:

<a href="" tabindex="1"></a>
...
Here comes the input element
Andy
źródło
Działa dobrze w IE9 i Firefox, ale nie w Safari / Chrome.
tuseau
3

Oto rozwiązanie, które zaimplementowałem po przeczytaniu biletu nr 4731 jQuery UI , pierwotnie opublikowanego przez slolife w odpowiedzi na inną odpowiedź. (Bilet również został stworzony przez niego.)

Po pierwsze, w dowolnej metodzie, której używasz do stosowania autouzupełniania na stronie, dodaj następujący wiersz kodu:

$.ui.dialog.prototype._focusTabbable = function(){};

To wyłącza zachowanie „autofokusu” jQuery. Aby zapewnić, że witryna będzie nadal szeroko dostępna, opakuj metody tworzenia okna dialogowego, aby można było dodać dodatkowy kod, i dodaj wywołanie, aby skupić się na pierwszym elemencie wejściowym:

function openDialog(context) {

    // Open your dialog here

    // Usability for screen readers.  Focus on an element so that screen readers report it.
    $("input:first", $(context)).focus();

}

Aby jeszcze bardziej zająć się dostępnością, gdy opcje autouzupełniania są wybierane za pomocą klawiatury, zastępujemy wywołanie zwrotne autouzupełniania interfejsu użytkownika jQuery „select” i dodajemy dodatkowy kod, aby zapewnić, że textElement nie straci fokusu w IE 8 po dokonaniu wyboru.

Oto kod, którego używamy do stosowania autouzupełniania do elementów:

$.fn.applyAutocomplete = function () {

    // Prevents jQuery dialog from auto-focusing on the first tabbable element.
    // Make sure to wrap your dialog opens and focus on the first input element
    // for screen readers.
    $.ui.dialog.prototype._focusTabbable = function () { };

    $(".autocomplete", this)
        .each(function (index) {

            var textElement = this;

            var onSelect = $(this).autocomplete("option", "select");
            $(this).autocomplete("option", {
                select: function (event, ui) {
                    // Call the original functionality first
                    onSelect(event, ui);

                    // We replace a lot of content via AJAX in our project.
                    // This ensures proper copying of values if the original element which jQuery UI pointed to
                    // is replaced.
                    var $hiddenValueElement = $("#" + $(textElement).attr('data-jqui-acomp-hiddenvalue'));
                    if ($hiddenValueElement.attr("value") != ui.item.value) {
                        $hiddenValueElement.attr("value", ui.item.value);
                    }

                    // Replace text element value with that indicated by "display" if any
                    if (ui.item.display)
                        textElement.value = ui.item.display;

                    // For usability purposes.  When using the keyboard to select from an autocomplete, this returns focus to the textElement.
                    $(textElement).focus();

                    if (ui.item.display)
                        return false;

                }
            });
        })
        // Set/clear data flag that can be checked, if necessary, to determine whether list is currently dropped down
        .on("autocompleteopen", function (event, ui) {
            $(event.target).data().autocompleteIsDroppedDown = true;
        })
        .on("autocompleteclose", function (event, ui) {
            $(event.target).data().autocompleteIsDroppedDown = false;
        });

    return this;
}

źródło
2

Możesz podać tę opcję, aby zamiast tego uaktywnić przycisk zamykania.

.dialog({
      open: function () {
              $(".ui-dialog-titlebar-close").focus();
            }
   });
Jay Dubal
źródło
1

Może to być zachowanie przeglądarki, a nie problem z wtyczką jQuery. Czy próbowałeś usunąć fokus programowo po otwarciu wyskakującego okienka.

$('#lnkAddReservation').click(function () {
    dlg.dialog('open');

    // you may want to change the selector below
    $('input,textarea,select').blur();

    return false;
});

Nie testowałem tego, ale powinno działać dobrze.

RaYell
źródło
1
niestety to nie działa. nie jestem pewien, czy jest to rzecz IE, czy interfejs jquery. ale nawet jeśli programowo przesuniesz fokus na coś innego, kalendarz pozostanie otwarty.
Patricia
1

Ten sam problem rozwiązałem, wstawiając puste dane wejściowe przed selektorem daty, które kradną fokus za każdym razem, gdy otwiera się okno dialogowe. To wejście jest ukrywane przy każdym otwarciu okna dialogowego i pokazywane ponownie po zamknięciu.

Manuel Leuenberger
źródło
1

Cóż, fajnie, że na razie nikt nie znalazł rozwiązania, ale wygląda na to, że mam coś dla Ciebie. Zła wiadomość jest taka, że ​​okno dialogowe w każdym przypadku przechwytuje fokus, nawet jeśli nie ma w nim danych wejściowych ani linków. Używam okna dialogowego jako podpowiedzi i zdecydowanie potrzebuję skupienia się na oryginalnym elemencie. Oto moje rozwiązanie:

użyj opcji [autoOpen: false]

$toolTip.dialog("widget").css("visibility", "hidden"); 
$toolTip.dialog("open");
$toolTip.dialog("widget").css("visibility", "visible");

Podczas gdy okno dialogowe jest niewidoczne, fokus nie jest nigdzie ustawiony i pozostaje w pierwotnym miejscu. Działa w przypadku podpowiedzi zawierających zwykły tekst, ale nie jest testowany w przypadku bardziej funkcjonalnych okien dialogowych, w których może być ważne, aby okno dialogowe było widoczne w momencie otwierania. Prawdopodobnie w każdym przypadku będzie działać dobrze.

Rozumiem, że oryginalny post miał po prostu uniknąć skupienia się na pierwszym elemencie, ale możesz łatwo zdecydować, gdzie powinien być fokus po otwarciu okna dialogowego (po moim kodzie).

Przetestowano w IE, FF i Chrome.

Mam nadzieję, że to komuś pomoże.

Roc
źródło
1

Mam podobny problem. Otwieram okno dialogowe błędu, gdy walidacja się nie powiedzie, i przechwytuje fokus, tak jak pokazuje to Flugan w swojej odpowiedzi . Problem polega na tym, że nawet jeśli żaden element w oknie dialogowym nie jest tabelą, samo okno dialogowe jest nadal aktywne. Oto oryginalny niezminifikowany kod z jquery-ui-1.8.23 \ js \ jquery.ui.dialog.js:

// set focus to the first tabbable element in the content area or the first button
// if there are no tabbable elements, set focus on the dialog itself
$(self.element.find(':tabbable').get().concat(
  uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
    uiDialog.get()))).eq(0).focus();

Komentarz należy do nich!

Jest to dla mnie bardzo złe z kilku powodów. Najbardziej irytujące jest to, że pierwszą reakcją użytkownika jest naciśnięcie klawisza Backspace w celu usunięcia ostatniego znaku, ale zamiast tego jest on proszony o opuszczenie strony, ponieważ naciśnięcie klawisza Backspace znajduje się poza kontrolką wejściową.

Okazało się, że następujące obejście działa całkiem nieźle dla mnie:

jqueryFocus = $.fn.focus;
$.fn.focus = function (delay, fn) {
  jqueryFocus.apply(this.filter(':not(.ui-dialog)'), arguments);
};
znak
źródło
Można to rozszerzyć, aby wpływać tylko na określone okna dialogowe, używając opcji „dialogClass” w .dialog (), a następnie zmieniając powyższe: nie filtruj, aby uwzględnić twoją klasę. np .: not (.ui-dialog.myDialogClass)
Andrew Martinez
1

Rozglądałem się za innym problemem, ale z tą samą przyczyną. Problem polega na tym, że okno dialogowe ustawia fokus na pierwsze <a href="">.</a>znalezione. Więc jeśli masz dużo tekstu w oknie dialogowym i pojawiają się paski przewijania, możesz mieć sytuację, w której pasek przewijania zostanie przewinięty do dołu. Uważam, że rozwiązuje to również pytanie dotyczące pierwszej osoby. Chociaż inni też.

Prosta łatwa do zrozumienia poprawka. <a id="someid" href="#">.</a> jako pierwsza linia w Twoim div dialogu.

PRZYKŁAD:

 <div id="dialogdiv" title="some title">
    <a id="someid" href="#">.</a>
    <p>
        //the rest of your stuff
    </p>
</div>

Gdzie jest inicjowane okno dialogowe

$(somediv).dialog({
        modal: true,
        open: function () { $("#someid").hide(); otherstuff or function },
        close: function () { $("#someid").show(); otherstuff or function }
    });

Powyższe nie będzie miało żadnego skupienia, a paski przewijania pozostaną na górze, gdzie należy. <a>Dostaje ostrość, ale jest to ukryty. Zatem ogólny efekt jest pożądany.

Wiem, że to stary wątek, ale jeśli chodzi o dokumentację interfejsu użytkownika, nie ma na to poprawki. To nie wymaga rozmycia ani ostrości do działania. Nie jestem pewien, czy jest najbardziej elegancki. Ale to ma sens i jest łatwe do wyjaśnienia każdemu.

MikeF
źródło
1

Jeśli masz tylko jedno pole w postaci okna dialogowego Jquery i to jest to, które wymaga Datepicker, możesz też po prostu ustawić fokus na przycisku Zamknij (krzyżyk) w pasku tytułowym okna dialogowego:

$('.ui-dialog-titlebar-close').focus();

Wywołaj to PO zainicjowaniu okna dialogowego, np .:

$('#yourDialogId').dialog();
$('.ui-dialog-titlebar-close').focus();

Ponieważ przycisk zamykania jest renderowany po .dialog()wywołaniu.

mikhail-t
źródło
1

Jeśli używasz przycisków dialogowych, po prostu ustaw autofocusatrybut na jednym z przycisków:

$('#dialog').dialog({
  buttons: [
    {
      text: 'OK',
      autofocus: 'autofocus'
    },
    {
      text: 'Cancel'
    }
  ]
});
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
<link href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css" rel="stylesheet"/>

<div id="dialog" title="Basic dialog">
  This is some text.
  <br/>
  <a href="www.google.com">This is a link.</a>
  <br/>
  <input value="This is a textbox.">
</div>

Sam
źródło
0

Mam ten sam problem.

Obejście, które zrobiłem, polega na dodaniu fikcyjnego pola tekstowego u góry kontenera okna dialogowego.

<input type="text" style="width: 1px; height: 1px; border: 0px;" />
TTCG
źródło
0

Jak wspomniano, jest to znany błąd dotyczący interfejsu użytkownika jQuery i powinien zostać naprawiony stosunkowo szybko. Dopóki...

Oto inna opcja, więc nie musisz mieszać z tabindex:

Tymczasowo wyłącz DatePicker do momentu otwarcia okna dialogowego:

dialog.find(".datepicker").datepicker("disable");
dialog.dialog({
    "open": function() {$(this).find(".datepicker").datepicker("enable");},
});

Pracuje dla mnie.

Zduplikowane pytanie: jak zamazać pierwsze dane wejściowe formularza po otwarciu okna dialogowego

BMiner
źródło
0

Aby rozwinąć niektóre z poprzednich odpowiedzi (i zignorować pomocniczy aspekt wyboru daty), jeśli chcesz uniemożliwić focus()zdarzeniu skupianie się na pierwszym polu wejściowym po otwarciu okna dialogowego, spróbuj tego:

$('#myDialog').dialog(
    { 'open': function() { $('input:first-child', $(this)).blur(); }
});
nickb
źródło
0

Miałem podobny problem i rozwiązałem go, skupiając się na oknie dialogowym po otwarciu:

var $dialog = $("#pnlFiltros")
    .dialog({
        autoOpen: false,
        hide: "puff",                   
        width: dWidth,
        height: 'auto',
        draggable: true,
        resizable: true,
        closeOnScape : true,
        position: [x,y]                    
    });
$dialog.dialog('open');
$("#pnlFiltros").focus(); //focus on the div being dialogued (is that a word?)

Ale w moim przypadku pierwszym elementem jest kotwica, więc nie wiem, czy w twoim przypadku pozostawi on otwarty datepicker.

EDYCJA: działa tylko w IE

daniloquio
źródło
0

znaleźć w jquery.ui.js

d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus(); 

i zamień na

d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(-1).focus();
user1443069
źródło
0

jQuery 1.9 został wydany i nie wydaje się, aby był poprawiony. Próba uniemożliwienia skupienia się na pierwszym polu tekstowym przez niektóre z sugerowanych metod nie działa w wersji 1.9. Myślę, że dlatego, że metody próbują rozmazać ostrość lub przenieść ostrość po tym, jak pole tekstowe w oknie dialogowym już się wyostrzyło i wykonało swoją brudną robotę.

W dokumentacji API nie widzę niczego, co mogłoby sugerować, że coś się zmieniło pod względem oczekiwanej funkcjonalności. Wyłącz, aby dodać przycisk otwieracza ...

pixelda
źródło
Poprawka została teraz przesunięta do 1.10 zgodnie z biletem jQuery: bugs.jqueryui.com/ticket/4731
slolife
0

Miałem podobny problem. Na mojej stronie pierwsze dane wejściowe to pole tekstowe z kalendarzem jQuery UI. Drugi element to przycisk. Ponieważ data ma już wartość, ustawiam fokus na przycisku, ale najpierw dodaję wyzwalacz rozmycia w polu tekstowym. To rozwiązuje problem we wszystkich przeglądarkach i prawdopodobnie we wszystkich wersjach jQuery. Testowane w wersji 1.8.2.

<div style="padding-bottom: 30px; height: 40px; width: 100%;">
@using (Html.BeginForm("Statistics", "Admin", FormMethod.Post, new { id = "FormStatistics" }))
{
    <label style="float: left;">@Translation.StatisticsChooseDate</label>
    @Html.TextBoxFor(m => m.SelectDate, new { @class = "js-date-time",  @tabindex=1 })
    <input class="button gray-button button-large button-left-margin text-bold" style="position:relative; top:-5px;" type="submit" id="ButtonStatisticsSearchTrips" value="@Translation.StatisticsSearchTrips"  tabindex="2"/>
}

<script type="text/javascript">
$(document).ready(function () {        
    $("#SelectDate").blur(function () {
        $("#SelectDate").datepicker("hide");
    });
    $("#ButtonStatisticsSearchTrips").focus();

});   

user1698635
źródło
0

Jest to naprawdę ważne w przypadku smartfonów i tabletów, ponieważ klawiatura pojawia się, gdy fokus jest na wejściu. Oto, co zrobiłem, dodaj to wejście na początku div:

<input type="image" width="1px" height="1px"/>

Nie działa z rozmiarem 0px. Myślę, że to nawet lepiej z prawdziwym przejrzystego obrazu, albo .pnglub .gifale nie próbowałem.

Jak dotąd działa dobrze na iPadzie.

Ángel Arbeteta
źródło
-1

Możesz dodać to:

...

dlg.dialog({ autoOpen:false,
modal: true, 
width: 400,
open: function(){                  // There is new line
  $("#txtStartDate").focus();
  }
});

...

Khofidin Ofid
źródło
3
Pyta, jak zapobiegać skupieniu, a nie dodawać ostrości.
CBarr
-2

jako pierwsze wejście: <input type="text" style="position:absolute;top:-200px" />

user2816796
źródło