Posso fare in modo che un <pulsante> non invii un modulo?


516

Ho un modulo, con 2 pulsanti

<a href="index.html"><button>Cancel changes</button></a>

<button type="submit">Submit</button>

Uso anche il pulsante dell'interfaccia utente di jQuery su di essi, semplicemente così

$('button').button();

Tuttavia, anche il primo pulsante invia il modulo. Avrei pensato che se non avesse avuto type="submit", non avrebbe.

Ovviamente potrei farlo

$('button[type!=submit]').click(function(event) { event.stopPropagation(); });

Ma c'è un modo per impedire a quel pulsante Indietro di inviare il modulo senza l'intervento di JavaScript?

Ad essere sincero, ho usato un pulsante solo per poterlo modellare con l'interfaccia utente di jQuery. Ho provato a chiamare button()il link e non ha funzionato come previsto (sembrava abbastanza brutto!).



2
utilizzare <button type="button">per quello che non invia il modulo e <input type="submit">per l'altro. Quindi $('#formID').submit(function(e){});
prendilo

Risposte:


1131

Il valore predefinito per l' typeattributo degli buttonelementi è "submit". Impostalo su type="button"per produrre un pulsante che non invia il modulo.

<button type="button">Submit</button>

Nelle parole dello standard HTML : "Non fa nulla".


14
Secondo w3schools, questo è non è vero per IE .
R0MANARMY,

53
Questa è solo una scelta di design incredibilmente cattiva.
octern


Wow, tu e Alex stavate davvero litigando nelle revisioni. Non vedo perché nessuno dei due si preoccupi delle virgolette o meno di un attributo.
ADJenks,

228

L' buttonelemento ha un tipo predefinito di submit.

Puoi fare in modo che non faccia nulla impostando un tipo di button:

<button type="button">Cancel changes</button>

1
@ B.ClayShannon Non proprio. È possibile utilizzare il codice lato server per restituire la stessa pagina quando si fa clic sul pulsante, ma ricaricherà comunque la pagina. In definitiva il pulsante fa parte del documento e quindi gli unici modi per dire al browser come si desidera agire sono HTML e JavaScript.
s4y,

17

Usa solo un buon vecchio HTML:

<input type="button" value="Submit" />

Avvolgilo come oggetto di un link, se lo desideri:

<a href="http://somewhere.com"><input type="button" value="Submit" /></a>

Oppure, se decidi di volere che JavaScript fornisca altre funzionalità:

<input type="button" value="Cancel" onclick="javascript: someFunctionThatCouldIncludeRedirect();"/>

7
L'uso di un controllo pulsante standard con l'attributo type corretto è "good old html" e crea un markup molto più semplice.
R0MANARMY,

Chiaramente non è più semplice se in alcuni browser ha un tipo predefinito di invio e in altri ha un tipo predefinito di pulsante. Diamine, anche solo avere il tipo predefinito di invio complica le cose più del necessario IMO. Dovrebbe esserci un markup che fornisce facilmente un pulsante che non fa nulla. E c'è:<input type="button" />
Jeffrey Blake,

+1 Ho usato questa tecnica esatta molte volte e ha sempre funzionato bene per me. Una variante è se è necessario annullare l'evento di postback per un pulsante sul lato server basato su alcuni calcoli sul lato client, è possibile includere window.event.returnValue = false; nel tuo codice che viene eseguito nell'evento onclick sul lato client per il tuo pulsante ... vale a dire, se l'utilizzo di un controllo validatore personalizzato non ti taglia la senape :)
Adam McKee,

1
@ JGB146: Solo perché non tutti i browser hanno lo stesso valore predefinito non significa che non rispetteranno il tipo corretto se impostato manualmente (come suggerito da jleedev. Per non parlare delle domande che richiedono specificamente un modo per farlo senza JavaScript mentre la tua risposta non ne tiene conto.
R0MANARMY,

11
@ JGB146: Buttonè un contenitore in HTML. Ciò ti consente di posizionare cose come immagini o tabelle (non sei sicuro del perché lo faresti, ma potresti) ecc., Mentre inputnon lo supporta. C'è una differenza tra i due e ognuno ha il proprio caso d'uso appropriato.
R0MANARMY,


5

Onestamente, mi piacciono le altre risposte. Facile e senza bisogno di entrare in JS. Ma ho notato che stavi chiedendo di jQuery. Quindi, per completezza, in jQuery se si restituisce false con il gestore .click (), si annullerà l'azione predefinita del widget.

Vedi qui per un esempio (e anche altre chicche). Ecco anche la documentazione .

in poche parole, con il tuo codice di esempio, fai questo:

<script type="text/javascript">
    $('button[type!=submit]').click(function(){
        // code to cancel changes
        return false;
    });
</script>

<a href="index.html"><button>Cancel changes</button></a>
<button type="submit">Submit</button>

Come ulteriore vantaggio, con questo, puoi sbarazzarti del tag anchor e usare semplicemente il pulsante.


Curiosamente, l'aggiunta e.preventDefault()non fa nulla per fermare l'invio (da dove inizia function(e)).
Sablefoste,

1

Senza impostare l' typeattributo, potresti anche tornare falsedal tuo OnClickgestore e dichiararlo onclickcome onclick="return onBtnClick(event)".


0

Sì, puoi fare in modo che un pulsante non invii un modulo aggiungendo un attributo del tipo di pulsante valore: <button type="button"><button>


-2
  <form class="form-horizontal" method="post">
        <div class="control-group">

            <input type="text" name="subject_code" id="inputEmail" placeholder="Subject Code">
        </div>
        <div class="control-group">
            <input type="text" class="span8" name="title" id="inputPassword" placeholder="Subject Title" required>
        </div>
        <div class="control-group">
            <input type="text" class="span1" name="unit" id="inputPassword" required>
        </div>
            <div class="control-group">
            <label class="control-label" for="inputPassword">Semester</label>
            <div class="controls">
                <select name="semester">
                    <option></option>
                    <option>1st</option>
                    <option>2nd</option>
                </select>
            </div>
        </div>

        <div class="control-group">
            <label class="control-label" for="inputPassword">Deskripsi</label>
            <div class="controls">
                    <textarea name="description" id="ckeditor_full"></textarea>
 <script>CKEDITOR.replace('ckeditor_full');</script>
            </div>
        </div>



        <div class="control-group">
        <div class="controls">

        <button name="save" type="submit" class="btn btn-info"><i class="icon-save"></i> Simpan</button>
        </div>
        </div>
        </form>

        <?php
        if (isset($_POST['save'])){
        $subject_code = $_POST['subject_code'];
        $title = $_POST['title'];
        $unit = $_POST['unit'];
        $description = $_POST['description'];
        $semester = $_POST['semester'];


        $query = mysql_query("select * from subject where subject_code = '$subject_code' ")or die(mysql_error());
        $count = mysql_num_rows($query);

        if ($count > 0){ ?>
        <script>
        alert('Data Sudah Ada');
        </script>
        <?php
        }else{
        mysql_query("insert into subject (subject_code,subject_title,description,unit,semester) values('$subject_code','$title','$description','$unit','$semester')")or die(mysql_error());


        mysql_query("insert into activity_log (date,username,action) values(NOW(),'$user_username','Add Subject $subject_code')")or die(mysql_error());


        ?>
        <script>
        window.location = "subjects.php";
        </script>
        <?php
        }
        }

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