Отправка формы нажатием кнопки ввода без кнопки отправки.

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. Тем не менее, мне все еще не нравится это решение, поскольку трудно понять, будет ли оно работать на всех платформах со всеми браузерами.

Кто-нибудь может предложить лучший метод? Или это так хорошо, как это получается?

abatishchev
источник
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 и drafts.csswg.org/css-values-3/#lengths
pwdst
2
Если сомневаетесь, укажите явную единицу длины другими словами.
17
3
Хотя, конечно, не помешает добавить единицу с 0, отсутствие ее должно быть на 100% действительным независимо от языка, фактически вплоть до математических абстракций. OTOH, удобное использование наличия или отсутствия их состоит в том, чтобы передать сообщение о том, действительно ли данное свойство «действительно должно быть 0, и остаться таким» (без единицы), против «эта вещь теперь равна нулю, но может быть настроен по вкусу, или как угодно ... "(с единицей).
СЗ

Ответы:

237

Пытаться:

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

Это будет нажимать кнопку влево, вне экрана. Хорошая вещь с этим, вы получили бы постепенное ухудшение, когда CSS отключен.

Обновление - Обходной путь для IE7

В соответствии с предложением Брайана Даунинга + tabindexдля предотвращения доступа к этой кнопке (от Ates Goral):

<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 такой, как этот?
Во-
28
@nornagon: Если вы чувствуете, что этот хак ужасен, не стесняйтесь предложить менее ужасный. HTML - это то, что есть ...
Ates Goral
13
@MooseFactorytabindex="-1"
Ates Goral
14
"хорошая вещь ... изящная деградация, когда CSS отключен" ?! Я имею в виду, конечно, это прекрасно работает, но часть «изящной деградации» - это просто маркетинговая тактика. Я даже не слышал об этом, пока не нашел эту страницу с 2002 года . Правильно, единственный результат Google на первой странице "css отключен в браузере" получен 10 лет назад (или 7, если учесть, что этот ответ был выставлен в 2009 году).
Вики Чижвани
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>
strager
источник
6
хороший, проверенный и работает нормально. Но прежде чем пытаться что-то вроде этого, помните, что отправка формы через Javascript не приведет к тому, что некоторые браузеры предложат сохранение пароля.
андик
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.

AndyK
источник
3
есть только одна вещь visibility: hidden: как вы можете прочитать в w3schools , наглядность: ничего не влияет на макет. Если вы хотите избежать этого пробела, мне кажется, что решение с абсолютным позиционированием лучше для меня.
Лойберт
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;
    }
  });

});
damoiser
источник
1
Странный трюк Это вы делаете свою кнопку в текстовом поле! Но так как уловка работает для всех браузеров, я заслужил вас!
Дженна Лиф
спасибо @JennaLeaf ;-) В любом случае, я думаю, что это не так уж и странно - многие онлайн-формы используют как отправку просто «срабатывание» нажатия клавиш. Примером может служить панель поиска Google (возможно, они не используют именно этот код, но, возможно, что-то похожее).
damoiser
16

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

например

<input type="submit" hidden />
Panomosh
источник
Хотя кажется, что он работает с настольным 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>
jumpnett
источник
4
Атрибут скрытый отключит отправку, нажав Enter.
66Ton99
@ 66Ton99 Просто попробуй в FF. Это не отключить отправку
Евгений Коньков
1
"это работает на моей машине";) браузеров намного больше, чем firefox. Можно, возможно, захотеть решение, которое надежно работает в разных браузерах.
Феликс Ганьон-Гренье
Работает над Chrome 63
piotr_cz
В настоящее время не работает в Chrome или Safari на iPhone.
Ульф Адамс
7

Самый элегантный способ сделать это - сохранить кнопку submit, но установить для нее border, padding и font-size значение 0.

Это сделает размеры кнопки 0x0.

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

Вы можете попробовать это сами, и, установив контур элемента, вы увидите точку, которая является внешней границей, «окружающей» элемент пикселя 0x0.

Нет необходимости в видимости: скрытый, но если он заставляет вас спать по ночам, вы можете добавить это и в микс.

JS Fiddle

Вальтур Берк
источник
5

IE не позволяет нажимать клавишу ВВОДА для отправки формы, если кнопка отправки не видна, а форма имеет более одного поля. Дайте ему то, что он хочет, предоставив прозрачное изображение 1x1 пикселей в качестве кнопки отправки. Конечно, это займет пиксель макета, но посмотрите, что вы должны сделать, чтобы скрыть его.

<input type="image" src="img/1x1trans.gif"/>
Уинстон Тэмблин
источник
4

Это мое решение, протестированное в Chrome, Firefox 6 и IE7 +:

.hidden{
    height: 1px;
    width: 1px;
    position: absolute;
    z-index: -100;
}
vjnrv
источник
Похоже, что IE8 не нравится позиция: абсолютно, он не подчиняется.
maxxyme
4
<input type="submit" style="display:none;"/>

Это прекрасно работает, и это самая явная версия того, что вы пытаетесь достичь.

Обратите внимание, что есть разница между display:noneи visibility:hiddenдля других элементов формы.

Shammoo
источник
4

HTML5 решение

<input type="submit" hidden />
Эндрю Лука
источник
То же, что и выше - не работает с Chrome или Safari на iPhone.
Ульф Адамс
3

самый простой способ

<input type="submit" style="width:0px; height:0px; opacity:0;"/>
Шахин Мамедзада
источник
2

Для тех, у кого проблемы с IE и для других тоже.

{
    float: left;
    width: 1px;
    height: 1px;
    background-color: transparent;
    border: none;
}
Jekis
источник
Я бы все еще использовал position: absolute, 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

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

начальная загрузка

<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;
}
H собака
источник
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);
    });
}
seePatCode
источник
0
input.on('keypress', function(event) {
    if ( event.which === 13 ) {
        form.submit();
        return false;
    }
});
Marty
источник
-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. У меня это тоже получалось волшебно. :)

Михай Савин
источник