Invio di un modulo premendo Invio senza un pulsante di invio


322

Bene, sto cercando di inviare un modulo premendo invio ma non visualizzo un pulsante di invio. Non voglio entrare in JavaScript, se possibile, poiché voglio che tutto funzioni su tutti i browser (l'unico modo JS che conosco è con gli eventi).

In questo momento il modulo si presenta così:

<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>

Che funziona abbastanza bene. Il pulsante di invio funziona quando l'utente preme invio e il pulsante non viene visualizzato in Firefox, IE, Safari, Opera e Chrome. Tuttavia, non mi piace ancora la soluzione poiché è difficile sapere se funzionerà su tutte le piattaforme con tutti i browser.

Qualcuno può suggerire un metodo migliore? O è tutto così bello?


7
Piccolo punto che potrebbe radere alcuni caratteri dal tuo CSS e in genere verrà eseguito automaticamente come minifilatore: non hai bisogno di unità per misurazioni di lunghezza zero. 0px = 0pt = 0em = 0em ecc.
pwdst

@pwdst grazie per averlo sottolineato - Vengo dal mondo Python, quindi "esplicito è meglio che implicito", e sinceramente mi chiedo se questo è il caso dei CSS o i creatori CSS hanno un linguaggio diverso?
Ericmjl,

2
Zero è l'eccezione alla regola qui @ericmjl - 0px == 0em == 0% == 0vh == 0vh ecc. In altre misurazioni della lunghezza (diverse da zero) non è solo una cattiva pratica, ma contro gli standard non specificare unità e vedrai un comportamento variabile nei programmi utente (browser). Vedi developer.mozilla.org/en-US/docs/Web/CSS/length e drafts.csswg.org/css-values-3/#lengths
pwdst

2
In caso di dubbi, inserire un'unità di lunghezza esplicita in altre parole.
pwdst

3
Anche se certamente non fa male aggiungere l'unità con 0, non averne nessuna dovrebbe essere valida al 100% indipendentemente dalla lingua, in realtà fino alle astrazioni matematiche. OTOH, un utile uso dell'avere rispetto al non averli è quello di trasmettere il messaggio se la proprietà data è "realmente destinata a essere 0, e rimanere così" (nessuna unità), rispetto a "quella cosa sembra essere zero ora, ma potrebbe essere regolato a piacere; o qualsiasi altra cosa ... "(con unità).
Sz.

Risposte:


237

Provare:

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

Ciò spingerà il pulsante a sinistra, fuori dallo schermo. La cosa bella di questo è che otterrai un grazioso degrado quando il CSS è disabilitato.

Aggiornamento: soluzione alternativa per IE7

Come suggerito da Bryan Downing + con tabindexper impedire a tab di raggiungere questo pulsante (di Ates Goral):

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

9
Ho appena provato questa soluzione in IE7 con lo stesso risultato di Erebus. Il codice seguente lo risolve:position: absolute; width: 1px; height: 1px; left: -9999px;
Bryan Downing,

84
Che trucco orribile :( perché HTML è come questo in primo luogo? C'è una buona ragione per entrare per non funzionare in questo caso?
nornagon

28
@nornagon: se ritieni che questo hack sia orribile, sentiti libero di suggerirne uno meno orribile. HTML è quello che è ...
Ates Goral,

13
@MooseFactorytabindex="-1"
Ates Goral

14
"la cosa bella è ... grazioso degrado quando CSS è disabilitato" ?! Voglio dire, questo funziona alla grande, ma la parte "aggraziato degrado" è solo tattiche di marketing. Non ne avevo nemmeno sentito parlare fino a quando non ho trovato questa pagina dell'anno 2002 . Esatto, l' unico risultato di Google nella prima pagina per "css è disabilitato nel browser" è di 10 anni fa (o 7 considerando che questa risposta è stata formulata nel 2009).
Vicky Chijwani,

97

Penso che dovresti seguire il percorso Javascript, o almeno dovrei:

<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
bello, testato e funzionante. Ma prima di provare qualcosa del genere, ricorda che l'invio di un modulo tramite Javascript non farà sì che alcuni browser offrano il salvataggio delle password.
Andyk,

3
Ciò farà apparire il pulsante di invio per un momento (fino a quando la pagina non viene caricata e JS non viene eseguito).
nornagon,

15
Viene inoltre attivato un tasto per una selezione da completamento automatico, ovvero se l'utente sta inserendo un indirizzo e-mail e ne seleziona uno precedentemente dall'autocompletamento del browser premendo Invio, il modulo verrà inviato. Non quello che i tuoi utenti si aspetteranno.
Hamburger

2
Sono passato keydownda keypressper supporto più ampio, ma devi anche aggiungere e.preventDefault();prima ifse speri di supportare Chrome.
Campbeln,

1
@Campbeln potresti invece essere in grado di utilizzare .on('keypress'...). I documenti per .on()sembrano fare .preventDefault()appello a te.
jinglesthula,

79

Hai provato questo?

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

Dal momento che la maggior parte dei browser capisce visibility:hiddene non funziona davvero display:none, immagino che dovrebbe andare bene, però. Non l'ho mai provato da solo, quindi CMIIW.


3
c'è solo una cosa visibility: hidden: come puoi leggere in w3schools , la visibilità: nessuna influenza ancora il layout. Se vuoi evitare questo spazio bianco, la soluzione con posizionamento assoluto sembra essere migliore per me.
loybert,

8
È possibile combinare entrambe le soluzioni:<input type="submit" style="visibility: hidden; position: absolute;" />
VaclavSir l'

2
Dannazione, questo non funziona in IE8 (non invia il modulo), quindi la soluzione sopra vince:position: absolute; left: -100px; width: 1px; height: 1px;
VaclavSir l'

31

Un'altra soluzione senza il pulsante di invio:

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
Strano trucco. Che trasformi il tuo pulsante in una casella di testo! Ma dal momento che il trucco funziona per tutti i browser, ti ho accreditato!
Jenna Leaf,

grazie @JennaLeaf ;-) Comunque penso che non sia così strano - molti moduli online usano come invio il semplice "innesco" del keydown. Un esempio potrebbe essere la barra di ricerca di Google (forse non usano esattamente questo codice, ma probabilmente qualcosa di simile).
Damoiser,

16

Per chiunque guardi a questa risposta in futuro, HTML5 implementa un nuovo attributo per gli elementi del modulo hidden, che si applicherà automaticamente display:noneal tuo elemento.

per esempio

<input type="submit" hidden />

Anche se sembra funzionare con Chrome desktop, non sembra funzionare con Chrome o Safari su iPhone.
Ulf Adams,

@UlfAdams Funziona con Chrome e Safari su iPhone 12.1.2.
Matthew Campbell,

13

Usa il seguente codice, questo ha risolto il mio problema in tutti e 3 i browser (FF, IE e Chrome):

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

Aggiungi la riga sopra come prima riga nel codice con il valore appropriato di nome e valore.


7

Invece dell'hack che attualmente usi per nascondere il pulsante, sarebbe molto più semplice impostare visibility: collapse;l'attributo style. Tuttavia, consiglierei comunque di utilizzare un po 'di Javascript semplice per inviare il modulo. Per quanto ho capito, il supporto per queste cose è onnipresente al giorno d'oggi.


7

Basta impostare l'attributo nascosto su 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
L'attributo nascosto disabiliterà l'invio premendo invio.
66Ton99,

@ 66Ton99 Prova solo in FF. Non disabilita l'invio
Eugen Konkov del

1
"funziona sul mio computer";) ci sono molti più browser di Firefox. si può probabilmente desiderare una soluzione che funzioni in modo affidabile tra browser.
Félix Gagnon-Grenier,

Funziona su Chrome 63
piotr_cz il

Al momento non funziona su Chrome o Safari su iPhone.
Ulf Adams,

7

Il modo più elegante per farlo è mantenere il pulsante di invio, ma impostarne il bordo, il riempimento e la dimensione del carattere su 0.

Questo renderà le dimensioni del pulsante 0x0.

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

Puoi provarlo tu stesso e impostando un contorno sull'elemento vedrai un punto, che è il bordo esterno che "circonda" l'elemento 0x0 px.

Non c'è bisogno di visibilità: nascosto, ma se ti fa dormire la notte, puoi anche buttarlo nel mix.

JS Fiddle


5

IE non consente di premere il tasto INVIO per l'invio del modulo se il pulsante di invio non è visibile e il modulo ha più di un campo. Dagli quello che vuole fornendo un'immagine trasparente da 1x1 pixel come pulsante di invio. Ovviamente occuperà un pixel del layout, ma guarda cosa devi fare per nasconderlo.

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

4

Questa è la mia soluzione, testata in Chrome, Firefox 6 e IE7 +:

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

Sembra che a IE8 non piaccia la posizione: assoluto, non si sottomette.
max.

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

Funziona bene ed è la versione più esplicita di ciò che stai cercando di ottenere.

Si noti che esiste una differenza tra display:nonee visibility:hiddenper altri elementi del modulo.




2

Per coloro che hanno problemi con IE e anche per gli altri.

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

Userei ancora la posizione: assoluto, float influenza il layout.
SuperDuck,

Sembra che a IE8 non piaccia la posizione: assoluto, non si sottomette. Io uso:
maxxyme

Lo stesso per float: left;, quando rimosso, invia.
massimo

2

Puoi provare anche questo

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

È possibile includere un'immagine con larghezza / altezza = 0 px


1
IMPORTANTE: DEVI utilizzare un URL di immagine valido o Firefox mostrerà il testo "Invia query" sulla tua pagina
PH.

2
Se si aggiunge un'immagine esistente e si imposta l'altezza e la larghezza su zero o si aggiunge un'immagine inesistente, il browser dovrà effettuare una richiesta GET sprecata per la risorsa.
prima del

2

Lavoro con un sacco di framework dell'interfaccia utente. Molti di loro hanno una classe integrata che puoi usare per nascondere visivamente le cose.

bootstrap

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

Materiale angolare

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

Le menti brillanti che hanno creato questi quadri hanno definito questi stili come segue:

.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

L'ho aggiunto a una funzione sul documento pronto. Se sul modulo non è presente alcun pulsante di invio (tutti i moduli di finestra di dialogo di Jquery non dispongono di pulsanti di invio), aggiungerlo.

$(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

Ho usato:

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

e:

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

nel file .css. Ha funzionato magicamente anche per me. :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.