Mam ostry problem na mojej stronie internetowej. W Google Chrome niektórzy klienci nie mogą przejść do mojej strony płatności. Podczas próby przesłania formularza pojawia się ten błąd:
An invalid form control with name='' is not focusable.
To z konsoli JavaScript.
Czytałem, że problem może być spowodowany ukrytymi polami posiadającymi wymagany atrybut. Problem polega na tym, że używamy formularzy internetowych wymaganych. Walidatorów pól, a nie wymaganego atrybutu HTML5.
Wydaje się losowe, kto dostaje ten błąd. Czy jest ktoś, kto zna rozwiązanie tego problemu?
html
validation
MP1990
źródło
źródło
Odpowiedzi:
Ten problem występuje w przeglądarce Chrome, jeśli sprawdzanie poprawności pola formularza nie powiedzie się, ale z powodu niemożności wyostrzenia odpowiedniego niepoprawnego elementu sterującego przeglądarka próbuje wyświetlić obok niego komunikat „Wypełnij to pole” .
Kontrola formularza może nie być aktywna w momencie uruchomienia sprawdzania poprawności z kilku powodów. Dwa opisane poniżej scenariusze są najbardziej widocznymi przyczynami:
To pole jest nieistotne zgodnie z bieżącym kontekstem logiki biznesowej. W takim scenariuszu odpowiednią kontrolę należy usunąć z DOM lub nie należy
required
w tym momencie oznaczać atrybutu.Przedwczesna walidacja może wystąpić, gdy użytkownik naciśnie klawisz ENTER na wejściu. Lub użytkownik klikając przycisk / kontrolkę wejściową w formularzu, który nie zdefiniował
type
poprawnie atrybutu kontrolki. Jeśli atrybut typu przycisku nie jest ustawiony nabutton
, Chrome (lub dowolna inna przeglądarka w tym zakresie) przeprowadza weryfikację za każdym razem, gdy przycisk zostanie kliknięty, ponieważsubmit
jest to domyślna wartośćtype
atrybutu przycisku .Aby rozwiązać ten problem, jeśli masz przycisk na swojej stronie, że robi coś innego niż inne przedstawienia lub resecie , zawsze pamiętać, aby to zrobić:
<button type="button">
.Zobacz także https://stackoverflow.com/a/7264966/1356062
źródło
required
lub dodanienovalidate
nigdy nie jest dobrym obejściem.number
pole, w którym domyślna wartość nie była podzielna równomiernie przez rozmiar kroku. Zmiana rozmiaru kroku rozwiązała problem.Dodanie
novalidate
atrybutu do formularza pomoże:źródło
<fieldset>
W twoim
form
, mógłbyś ukryćinput
posiadającrequired
atrybut:<input type="hidden" required />
<input type="file" required style="display: none;"/>
Nie
form
można skupić się na tych elementach, musisz usunąćrequired
ze wszystkich ukrytych danych wejściowych lub zaimplementować funkcję sprawdzania poprawności w javascript, aby obsłużyć je, jeśli naprawdę potrzebujesz ukrytych danych wejściowych.źródło
required
.pattern
sam może powodować ten problem.<input type="hidden" required />
i drugą z<input type="text" style="display: none" required />
, a jedyną, która wyświetla błąd w Chrome, jest tadisplay: none
, podczas gdy ta jest w"hidden"
porządku.W przypadku, gdy ktoś ma ten problem, doświadczyłem tego samego. Jak omówiono w komentarzach, było to spowodowane próbą sprawdzenia poprawności ukrytych pól przez przeglądarkę. Znajdował puste pola w formularzu i próbował się na nich skupić, ale ponieważ były ustawione
display:none;
, nie mogło. Stąd błąd.Udało mi się to rozwiązać, używając czegoś podobnego do tego:
Jest to prawdopodobnie duplikat „Niepoprawnej kontroli formularza” tylko w Google Chrome
źródło
W moim przypadku problem polegał na
input type="radio" required
byciu ukrytym za pomocą:visibility: hidden;
Ten komunikat o błędzie pokaże również, czy wymagany typ wejścia
radio
lubcheckbox
madisplay: none;
właściwość CSS.Jeśli chcesz utworzyć niestandardowe wejścia radia / pola wyboru, w których należy je ukryć przed interfejsem użytkownika i nadal zachować
required
atrybut, należy zamiast tego użyć:opacity: 0;
Właściwość CSSźródło
name=""
zamiast oryginalnego?Żadna z poprzednich odpowiedzi nie działała dla mnie i nie mam żadnych ukrytych pól z
required
atrybutem.W moim przypadku problem został spowodowany przez mającego
<form>
a następnie<fieldset>
jako jej pierwsze dziecko, które trzyma<input>
zrequired
atrybutu. Usuwanie<fieldset>
rozwiązanego problemu. Lub możesz owinąć nim swój formularz; jest to dozwolone przez HTML5.Korzystam z systemu Windows 7 x64, wersja Chrome 43.0.2357.130 m.
źródło
Jeszcze jedna możliwość, jeśli pojawia się błąd na wejściu pola wyboru. Jeśli pola wyboru używają niestandardowego kodu CSS, który ukrywa wartość domyślną i zastępuje ją inną stylizacją, spowoduje to również błąd, na który nie można się skupić w Chrome po błędzie sprawdzania poprawności.
Znalazłem to w moim arkuszu stylów:
Prostą poprawką było zastąpienie go następującym:
źródło
Możliwe, że ukryłeś (wyświetl: brak) pola z wymaganymi atrybutem.
Sprawdź, czy wszystkie wymagane pola są widoczne dla użytkownika :)
źródło
Dla mnie dzieje się tak, gdy jest
<select>
pole z wcześniej wybraną opcją o wartości „”:Niestety jest to jedyne rozwiązanie przeglądarki zastępczej dla symboli zastępczych ( Jak zrobić symbol zastępczy dla pola „wybierz”? ).
Problem pojawia się w Chrome 43.0.2357.124.
źródło
Jeśli masz jakieś pole z wymaganym atrybutem, które nie jest widoczne podczas przesyłania formularza, ten błąd zostanie zgłoszony. Po prostu usuwasz wymagany atrybut, gdy próbujesz ukryć to pole. Możesz dodać wymagany atrybut, jeśli chcesz ponownie wyświetlić pole. W ten sposób twoja walidacja nie zostanie naruszona, a jednocześnie błąd nie zostanie zgłoszony.
źródło
$("input").attr("required", "true");
czy$("input").prop('required',true);
przeciwnie można atrybut / nieruchomość . >> Do pól wejściowych wymagane jest dodanie jQueryremove
Dla problemu Select2 Jquery
Problem wynika z faktu, że sprawdzanie poprawności HTML5 nie może skupić ukrytego nieprawidłowego elementu. Natknąłem się na ten problem, gdy miałem do czynienia z wtyczką jQuery Select2.
Rozwiązanie Możesz wstrzyknąć detektor zdarzeń i „nieprawidłowe” zdarzenie każdego elementu formularza, aby można było nim manipulować tuż przed sprawdzeniem poprawności zdarzenia HTML5.
źródło
Wyświetli tę wiadomość, jeśli masz taki kod:
źródło
Tak .. Jeśli kontrola formularza ukrytego wymagała pola, pokazuje ten błąd. Jednym rozwiązaniem byłoby wyłączenie tej kontroli formularza . Wynika to z tego, że zazwyczaj jeśli ukrywasz kontrolę formularza, dzieje się tak dlatego, że nie przejmujesz się jego wartością. Tak więc para wartości nazwa kontrolki formularza nie zostanie wysłana podczas przesyłania formularza.
źródło
Możesz wypróbować
.removeAttribute("required")
te elementy, które są ukryte podczas ładowania okna. ponieważ jest całkiem prawdopodobne, że dany element jest oznaczony jako ukryty z powodu javascript (formularze z kartami)na przykład
To powinno wykonać zadanie.
To działało dla mnie ... na zdrowie
źródło
Inna możliwa przyczyna, która nie została uwzględniona we wszystkich poprzednich odpowiedziach, gdy masz normalny formularz z wymaganymi polami i przesyłasz formularz, a następnie ukrywasz go bezpośrednio po przesłaniu (za pomocą javascript), nie dając czasu na sprawdzenie poprawności.
Funkcja sprawdzania poprawności spróbuje skoncentrować się na wymaganym polu i wyświetli komunikat o sprawdzeniu poprawności błędu, ale pole to zostało już ukryte, więc „Niepoprawna kontrola formularza o nazwie =” nie może być aktywowana ”. pojawia się!
Edytować:
Aby poradzić sobie z tą sprawą, wystarczy dodać następujący warunek w module obsługi przesyłania
Edycja: objaśnienie
Zakładając, że ukrywasz formularz podczas przesyłania, ten kod gwarantuje, że formularz / pola nie zostaną ukryte, dopóki formularz nie stanie się prawidłowy. Jeśli więc pole jest nieprawidłowe, przeglądarka może bez problemu skupić się na nim, ponieważ to pole jest nadal wyświetlane.
źródło
Są rzeczy, które wciąż mnie zaskakują ... Mam formularz z dynamicznym zachowaniem dla dwóch różnych bytów. Jedna jednostka wymaga niektórych pól, których druga nie. Tak więc mój kod JS, w zależności od encji, robi coś takiego: $ ('# periodo'). RemoveAttr ('wymagany'); $ („# periodo-container”). hide ();
a gdy użytkownik wybierze inny byt: $ („# periodo-container”). show (); $ („# periodo”). prop („wymagany”, prawda);
Ale czasami, kiedy formularz jest przesyłany, pojawia się problem: „Niepoprawna kontrola formularza o nazwie = okres” nie może być aktywowana (używam tej samej wartości dla identyfikatora i nazwy).
Aby rozwiązać ten problem, musisz upewnić się, że wejście, w którym ustawiasz lub usuwasz „wymagane”, jest zawsze widoczne.
Więc to co zrobiłem to:
To rozwiązało mój problem ... niewiarygodne.
źródło
W moim przypadku..
ng-show
był używany.ng-if
został umieszczony na swoim miejscu i naprawił mój błąd.źródło
Do użytku kątowego:
ng-wymagany = "boolean"
Spowoduje to zastosowanie atrybutu „wymagane” html5 tylko wtedy, gdy wartość jest prawdą.
źródło
Przyszedłem tutaj, aby odpowiedzieć, że sam uruchomiłem ten problem w oparciu o NIE zamykanie
</form>
tagu ORAZ posiadanie wielu formularzy na tej samej stronie. Pierwszy formularz będzie obejmował wyszukiwanie poprawności danych wejściowych formularza z innych źródeł. Ponieważ te formularze są ukryte, spowodowały błąd.na przykład:
Wyzwalacze
źródło
Istnieje wiele sposobów, aby to naprawić
<form action="...." class="payment-details" method="post" novalidate>
Użyj może usunąć wymagany atrybut z wymaganych pól, co jest również błędne, ponieważ po raz kolejny usunie sprawdzanie poprawności formularza.
Zamiast tego:
<input class="form-control" id="id_line1" maxlength="255" name="line1" placeholder="First line of address" type="text" required="required">
<input class="form-control" id="id_line1" maxlength="255" name="line1" placeholder="First line of address" type="text">
Użyj może wyłączyć wymagane pola, jeśli nie zamierzasz przesyłać formularza zamiast robić inne opcje. To moim zdaniem zalecane rozwiązanie.
lubić:
<input class="form-control" id="id_line1" maxlength="255" name="line1" placeholder="First line of address" type="text" disabled="disabled">
lub wyłącz to za pomocą kodu javascript / jquery, zależy od Twojego scenariusza.
źródło
Znalazłem ten sam problem podczas korzystania z Angular JS. Było to spowodowane używaniem wymaganym razem z ng-hide . Kiedy kliknąłem przycisk wysyłania, gdy ten element był ukryty, pojawił się błąd . Niepoprawna kontrola formularza o nazwie = '' nie może być aktywowana.Wreszcie!
Na przykład użycie ng-hide razem z wymaganymi:
Rozwiązałem go, zastępując zamiast tego wymaganą wzorzec ng.
Na przykład rozwiązanie:
źródło
Dla innych użytkowników AngularJS 1.x ten błąd pojawił się, ponieważ ukrywałem formant formularza przed wyświetlaniem zamiast całkowicie go usuwać z DOM, gdy nie potrzebowałem tej kontroli.
Naprawiłem to za pomocą
ng-if
zamiastng-show
/ng-hide
na div zawierającej kontrolkę formularza wymagającą walidacji.Mam nadzieję, że pomoże to innym użytkownikom skrzynek.
źródło
Pozwólcie, że przedstawię mój przypadek, ponieważ różni się on od wszystkich powyższych rozwiązań. Miałem tag HTML, który nie został poprawnie zamknięty. element nie był
required
, ale był osadzony whidden
divproblem w moim przypadku polegał na tym
type="datetime-local"
, że - z jakiegoś powodu - był sprawdzany przy składaniu formularza.zmieniłem to
w tym
źródło
Chciałem tutaj odpowiedzieć, ponieważ ŻADNA z tych odpowiedzi ani żaden inny wynik Google nie rozwiązał dla mnie problemu.
Dla mnie nie miało to nic wspólnego z zestawami pól ani ukrytymi danymi wejściowymi.
Odkryłem, że jeśli użyję
max="5"
(np.), Spowoduje to ten błąd. Gdybym użyłmaxlength="5"
... nie ma błędu.Kilka razy udało mi się odtworzyć błąd i usunąć błąd.
I nadal nie wiem dlaczego przy użyciu tego kodu powoduje błąd, jeśli chodzi o tych państw powinno być ważne, nawet bez „min” Wierzę.
źródło
min='-9999999999.99' max='9999999999.99'
.Alternatywnie inną i niezawodną odpowiedzią jest użycie atrybutu symbolu zastępczego HTML5, wtedy nie będzie potrzeby używania sprawdzania poprawności js.
Chrome nie będzie w stanie znaleźć pustych, ukrytych i wymaganych elementów, na których mógłby się skupić. Proste rozwiązanie.
Mam nadzieję, że to pomaga. Dzięki temu rozwiązaniu jestem całkowicie posortowany.
źródło
Przybyłem tutaj z tym samym problemem. Dla mnie (wstrzykiwanie ukrytych elementów w razie potrzeby - tj. Wykształcenie w aplikacji o pracę) miałem wymagane flagi.
Uświadomiłem sobie, że walidator wystrzeliwuje wstrzyknięty szybciej niż dokument jest gotowy, więc narzekał.
Mój oryginalny tag wymagany przez ng używał tagu widoczności (vm.flags.hasHighSchool).
Rozwiązałem problem, tworząc dedykowaną flagę, aby ustawić wymagany ng-wymagany = "vm.flags.highSchoolRequired == true"
Dodałem oddzwanianie 10 ms po ustawieniu tej flagi i problem został rozwiązany.
HTML:
źródło
Upewnij się, że wszystkie formanty w formularzu z wymaganym atrybutem mają również ustawiony atrybut name
źródło
Ten błąd przydarzył mi się, ponieważ przesyłałem formularz z wymaganymi polami, które nie zostały wypełnione.
Wystąpił błąd, ponieważ przeglądarka próbowała skoncentrować się na wymaganych polach, aby ostrzec użytkownika, że pola są wymagane, ale te wymagane pola zostały ukryte na ekranie, ponieważ nie można się na nich skoncentrować. Przesyłałem z widocznej zakładki, a wymagane pola znajdowały się w ukrytej zakładce, stąd błąd.
Aby to naprawić, sprawdź, czy wymagane pola są wypełnione.
źródło
Jest tak, ponieważ w formularzu znajduje się ukryty wkład z wymaganym atrybutem.
W moim przypadku miałem pole wyboru i jest ono ukryte przez tokenizer jquery w stylu wbudowanym. Jeśli nie wybiorę żadnego tokena, przeglądarka zgłasza powyższy błąd podczas przesyłania formularza.
Naprawiłem to za pomocą poniższej techniki css:
źródło
Ten sam błąd wystąpił podczas klonowania elementu HTML do użycia w formularzu.
(Mam częściowo wypełniony formularz, do którego wstrzyknięto szablon, a następnie szablon został zmodyfikowany)
Błąd dotyczył oryginalnego pola, a nie sklonowanej wersji.
Nie mogłem znaleźć żadnych metod, które zmusiłyby formularz do ponownej oceny (w nadziei, że pozbyłby się wszelkich odniesień do starych pól, które teraz nie istnieją) przed uruchomieniem sprawdzania poprawności.
Aby obejść ten problem, usunąłem wymagany atrybut z oryginalnego elementu i dynamicznie dodałem go do sklonowanego pola przed wstrzyknięciem go do formularza. Formularz teraz poprawnie sprawdza sklonowane i zmodyfikowane pola.
źródło