Подання форми натисканням клавіші Enter без кнопки надсилання


322

Я намагаюся подати форму, натиснувши клавішу Enter, але не відображаючи кнопку подання. Я не хочу потрапляти в JavaScript, якщо це можливо, тому що я хочу, щоб все працювало на всіх браузерах (єдиний спосіб, який я знаю, JS - це з подіями).

Зараз форма виглядає приблизно так:

<form name="loginBox" target="#here" method="post">
    <input name="username" type="text" /><br />
    <input name="password" type="password" />
    <input type="submit" style="height: 0px; width: 0px; border: none; padding: 0px;" hidefocus="true" />
</form>

Що працює досить добре. Кнопка надсилання працює, коли користувач натискає клавішу введення, а кнопка не відображається у Firefox, IE, Safari, Opera та Chrome. Однак мені все ще не подобається рішення, оскільки важко знати, чи буде він працювати на всіх платформах із усіма браузерами.

Чи може хтось запропонувати кращий метод? Або це приблизно так добре, як виходить?


7
Невелика крапка, яка може збрити кілька символів з вашого CSS, і, як правило, автоматично робиться міні-міні-вам не потрібні одиниці для вимірювання нульової довжини. 0px = 0pt = 0em = 0em тощо
pwdst

@pwdst дякую, що вказав на це - я із світу Python, тому "явне краще, ніж неявне", і щиро цікаво, чи це так у CSS, чи у творців CSS є інша ідіома?
ericmjl

2
Нуль - виняток із правила тут @ericmjl - 0px == 0em == 0% == 0vh == 0vh тощо. В інших (не нульових) вимірах довжини це не лише погана практика, але й проти стандартів не визначати одиниці та ви побачите різну поведінку в агентах користувача (браузерах). Дивіться developer.mozilla.org/en-US/docs/Web/CSS/length and drafts.csswg.org/css-values-3/#lengths
pwdst

2
Якщо ви сумніваєтесь, введіть явну одиницю довжини іншими словами.
pwdst

3
Хоча, звичайно, не завадить додавати одиницю з 0, але відсутність має бути 100% дійсною незалежно від мови, насправді все так само резервне копіювання до математичних абстракцій. OTOH, зручне використання того, щоб не мати їх, - це передати повідомлення про те, чи дана властивість "насправді призначена як 0, і залишатись таким" (немає одиниці), проти "ця штука зараз дорівнює нулю, але може бути відрегульовано за смаком; або як би там не було ... "(з одиницею)
Sz.

Відповіді:


237

Спробуйте:

<input type="submit" style="position: absolute; left: -9999px"/>

Це натисне кнопку waaay вліво, поза екраном. Приємно з цим, що ви отримаєте витончену деградацію, коли CSS відключений.

Оновлення - вирішення IE7

Як запропонував Брайан Даунінг +, tabindexщоб запобігти вкладці до цієї кнопки (автор: Атес Горал):

<input type="submit" 
       style="position: absolute; left: -9999px; width: 1px; height: 1px;"
       tabindex="-1" />

9
Щойно спробував це рішення в IE7 з тим же результатом, що і Erebus. Наступний код виправляє це:position: absolute; width: 1px; height: 1px; left: -9999px;
Брайан Даунінг

84
Який жахливий хакер :( чому в першу чергу такий HTML? Чи є вагомі причини для того, щоб увійти не працювати в цій справі?
nornagon

28
@nornagon: Якщо вам здається, що цей хак жахливий, не соромтеся запропонувати менш жахливий. HTML це те, що це ...
Ates Goral

13
@MooseFactorytabindex="-1"
Ates Goral

14
"приємно - це витончена деградація, коли CSS відключений" ?! Я маю на увазі, це чудово працює, але частина «витонченої деградації» - це лише маркетингова тактика. Я навіть не чув про це, поки не знайшов цю сторінку 2002 року . Саме так, єдиний результат Google на першій сторінці для "css вимкнено в браузері" - це з 10 років тому (або 7 з урахуванням цієї відповіді було висунуто в 2009 році).
Vicky Chijwani

97

Я думаю, ви повинні піти по маршруту Javascript, або, принаймні, я б:

<script type="text/javascript">
// Using jQuery.

$(function() {
    $('form').each(function() {
        $(this).find('input').keypress(function(e) {
            // Enter pressed?
            if(e.which == 10 || e.which == 13) {
                this.form.submit();
            }
        });

        $(this).find('input[type=submit]').hide();
    });
});
</script>


<form name="loginBox" target="#here" method="post">
    <input name="username" type="text" /><br />
    <input name="password" type="password" />
    <input type="submit" />
</form>

6
приємний, перевірений і добре працює. Але перш ніж спробувати щось подібне, пам’ятайте, що надсилання форми через Javascript не призведе до того, що деякі браузери не пропонують інформацію про збереження пароля.
andyk

3
Це призведе до того, що кнопка надсилання на мить з’явиться (поки сторінка не завантажиться і JS не запуститься).
nornagon

15
Натискання клавіші також запускається для вибору з автозаповнення, тобто якщо користувач вводить адресу електронної пошти і він / вона вибирає попередньо задану з автозаповнення браузера, натиснувши клавішу Enter, то ваша форма подасть. Не те, що очікують ваші користувачі.
cburgmer

2
Я переключився на keydownз keypressдля широкої підтримки, але також необхідно додати e.preventDefault();перед , ifякщо ви сподіваєтеся на підтримку Chrome.
Кемпбелн

1
@Campbeln ви можете використати .on('keypress'...)натомість. Документи, .on()схожі на те, що це .preventDefault()закликає вас.
jinglesthula

79

Ви пробували це?

<input type="submit" style="visibility: hidden;" />

Оскільки більшість веб-переглядачів розуміє, що visibility:hiddenце насправді не працює display:none, я думаю, що це повинно бути добре. Я справді не перевіряв його сам, тому CMIIW.


3
є лише одне visibility: hidden: як ви можете прочитати в w3schools , наочність: ніхто досі не впливає на макет. Якщо ви хочете уникати цього пробілу, рішення з абсолютним позиціонуванням здається мені кращим.
loybert

8
Ви можете комбінувати обидва рішення:<input type="submit" style="visibility: hidden; position: absolute;" />
VaclavSir

2
Чорт забирай, це не працює в IE8 (він не подає форму), тому рішення зверху виграє:position: absolute; left: -100px; width: 1px; height: 1px;
VaclavSir

31

Ще одне рішення без кнопки надсилання:

HTML

<form>
  <input class="submit_on_enter" type="text" name="q" placeholder="Search...">
</form>

jQuery

$(document).ready(function() {

  $('.submit_on_enter').keydown(function(event) {
    // enter has keyCode = 13, change it if you want to use another button
    if (event.keyCode == 13) {
      this.form.submit();
      return false;
    }
  });

});

1
Дивна хитрість. Щоб ви ввели свою кнопку в текстове поле! Але оскільки фокус працює для всіх браузерів, я вам зарахував!
Дженна Ліф

дякую @JennaLeaf ;-) Я думаю, що це не так дивно - багато онлайн-форм використовують як подачу просто "запуск" клавіші. Прикладом може бути панель пошуку Google (можливо, вони не використовують саме цей код, але, мабуть, щось подібне).
дамозер

16

Для тих, хто шукає цю відповідь у майбутньому, HTML5 реалізує новий атрибут для елементів форми hidden, який автоматично застосовуєтьсяdisplay:none до вашого елемента.

напр

<input type="submit" hidden />

Хоча це, здається, працює з настільним Chrome, але, схоже, не працює з Chrome або Safari на iPhone.
Ульф Адамс

@UlfAdams Працює з Chrome і Safari на iPhone 12.1.2.
Меттью Кемпбелл

13

Використовуючи наступний код, це вирішило мою проблему у всіх 3 браузерах (FF, IE та Chrome):

<input  type="submit" name="update" value=" Apply " 
    style="position: absolute; height: 0px; width: 0px; border: none; padding: 0px;"
    hidefocus="true" tabindex="-1"/>

Додайте верхній рядок як перший рядок у коді з відповідним значенням імені та значення.


7

Замість хаку, який ви зараз використовуєте для приховування кнопки, було б набагато простіше встановити visibility: collapse;атрибут стилю. Однак я все-таки рекомендую використовувати трохи простого Javascript, щоб подати форму. Наскільки я розумію, підтримка таких речей є всюди поширеною.


7

Просто встановіть прихований атрибут у true:

<form name="loginBox" target="#here" method="post">
    <input name="username" type="text" /><br />
    <input name="password" type="password" />
    <input type="submit" hidden="true" />
</form>

4
Прихований атрибут відключить подання натисканням клавіші enter.
66Ton99

@ 66Ton99 Просто тест на FF. Це не відключає подання
Євген Конков

1
"працює на моїй машині";) у браузерах набагато більше, ніж у Firefox. Можна, безперечно, бажати рішення, яке надійно працює на крос-браузері.
Фелікс Ганьон-Греньє

Працює на Chrome 63
piotr_cz

Наразі це не працює в Chrome чи Safari на iPhone.
Ульф Адамс

7

Найелегантніший спосіб зробити це - утримувати кнопку подання, але встановити рамку, розмір шрифту та розмір шрифту 0.

Це зробить розміри кнопки 0x0.

<input type="submit" style="border:0; padding:0; font-size:0">

Ви можете спробувати це самостійно, і встановивши контур до елемента, ви побачите крапку, яка зовнішня межа "оточує" елемент 0x0 px.

Немає необхідності в видимості: приховано, але якщо ви змусите спати вночі, ви можете кинути це і в суміш.

JS Fiddle


5

IE не дозволяє натискати клавішу ENTER для подання форми, якщо кнопка подання не видно, а форма має більше одного поля. Надайте їй те, що хоче, надаючи прозоре зображення 1x1 пікселя як кнопку подання. Звичайно, це займе піксель макета, але подивіться, що вам потрібно зробити, щоб приховати його.

<input type="image" src="img/1x1trans.gif"/>

4

Це моє рішення, перевірене в Chrome, Firefox 6 та IE7 +:

.hidden{
    height: 1px;
    width: 1px;
    position: absolute;
    z-index: -100;
}

Здається, що IE8 не любить позицію: абсолютна, вона не подається.
maxxyme

4
<input type="submit" style="display:none;"/>

Це прекрасно працює, і це найбільш явна версія того, що ви намагаєтеся досягти.

Зверніть увагу , що є різниця між display:noneі visibility:hiddenдля інших елементів форми.




2

Для тих, хто має проблеми з IE, а також для інших.

{
    float: left;
    width: 1px;
    height: 1px;
    background-color: transparent;
    border: none;
}

Я б все-таки використовував позицію: абсолютний, float впливає на макет.
SuperDuck

Здається, що IE8 не любить позицію: абсолютна, вона не подається. Я використовую:
maxxyme

Те ж саме float: left;, коли його видаляють, він подає.
maxxyme

2

Ви можете спробувати і це

<INPUT TYPE="image" SRC="0piximage.gif" HEIGHT="0" WIDTH="0" BORDER="0">

Ви можете включити зображення з шириною / висотою = 0 пікс


1
ВАЖЛИВО: ОБОВ'ЯЗКОВО використовувати дійсну URL-адресу зображення, або Firefox на вашій сторінці відобразить текст "Надіслати запит"
PH.

2
Якщо ви додасте існуюче зображення і встановите висоту та ширину до нуля, або додасте неіснуюче зображення, браузеру доведеться зробити витрачений запит GET на ресурс.
pwdst

2

Я працюю з купою фреймворків інтерфейсу. У багатьох з них є вбудований клас, який можна використовувати для візуального приховування речей.

Завантажувальний

<input type="submit" class="sr-only" tabindex="-1">

Кутовий матеріал

<input type="submit" class="cdk-visually-hidden" tabindex="-1">

Блискучі уми, які створили ці рамки, визначали такі стилі так:

.sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

.cdk-visually-hidden {
    border: 0;
    clip: rect(0 0 0 0);
    height: 1px;
    margin: -1px;
    overflow: hidden;
    padding: 0;
    position: absolute;
    width: 1px;
    outline: 0;
    -webkit-appearance: none;
    -moz-appearance: none;
}

1

Я додав його до функції, готової до документа. Якщо у формі немає кнопки подання (усі мої форми діалогу Jquery не мають кнопок подання), додайте її.

$(document).ready(function (){
    addHiddenSubmitButtonsSoICanHitEnter();
});
function addHiddenSubmitButtonsSoICanHitEnter(){
    var hiddenSubmit = "<input type='submit' style='position: absolute; left: -9999px; width: 1px; height: 1px;' tabindex='-1'/>";
    $("form").each(function(i,el){
        if($(this).find(":submit").length==0)
            $(this).append(hiddenSubmit);
    });
}

0
input.on('keypress', function(event) {
    if ( event.which === 13 ) {
        form.submit();
        return false;
    }
});

-2

Я використовував:

<input class="hidden" type="submit" value="" 
onclick="document.getElementById('loginform').submit();"/>

і:

 .hidden {
        border:0;
        padding:0;
        font-size:0;
        width: 0px;
        height: 0px;
    }

у файлі .css. Це працювало магічно і для мене. :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.