Kann ich mit einem <Button> kein Formular senden?

516

Ich habe ein Formular mit 2 Schaltflächen

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

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

Ich benutze auch die Schaltfläche der jQuery-Benutzeroberfläche, einfach so

$('button').button();

Die erste Schaltfläche sendet jedoch auch das Formular. Ich hätte gedacht, wenn es das nicht hätte type="submit", würde es nicht.

Offensichtlich könnte ich das tun

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

Aber gibt es eine Möglichkeit, das Zurücksenden des Formulars ohne JavaScript-Intervention zu verhindern?

Um ehrlich zu sein, habe ich nur eine Schaltfläche verwendet, um sie mit der jQuery-Benutzeroberfläche zu gestalten. Ich habe versucht, button()den Link aufzurufen , und es hat nicht wie erwartet funktioniert (sah ziemlich hässlich aus!).

Alex
quelle
Mögliches Duplikat der HTML-Schaltfläche, um das Formular NICHT zu senden
just.another.programmer
2
Verwenden Sie <button type="button">für das eine, das das Formular nicht sendet, und <input type="submit">für das andere. Dann fangen Sie es mit jquery$('#formID').submit(function(e){});
Airwavezx

Antworten:

1130

Der Standardwert für das typeAttribut von buttonElementen ist "submit". Stellen Sie ein, type="button"um eine Schaltfläche zu erstellen, die das Formular nicht sendet.

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

Mit den Worten des HTML-Standards : "Tut nichts."

Josh Lee
quelle
14
Laut w3schools gilt das nicht für IE .
R0MANARMY
53
Das ist nur eine schockierend schlechte Designentscheidung.
Oktober
Jeder: Bitte lesen Sie html.spec.whatwg.org/multipage/syntax.html#unquoted
Josh Lee
Wow, du und Alex haben es in den Revisionen wirklich geschafft. Ich verstehe nicht, warum sich einer von Ihnen für Zitate interessiert oder nicht für ein Attribut.
ADJenks
228

Das buttonElement hat den Standardtyp submit.

Sie können nichts tun, indem Sie einen Typ festlegen button:

<button type="button">Cancel changes</button>
s4y
quelle
1
@ B.ClayShannon Nicht wirklich. Sie können serverseitigen Code verwenden, um dieselbe Seite zurückzugeben, wenn Sie auf die Schaltfläche klicken, aber die Seite wird trotzdem neu geladen. Letztendlich ist die Schaltfläche Teil des Dokuments. Daher können Sie dem Browser nur HTML und JavaScript mitteilen, wie er sich verhalten soll.
s4y
17

Verwenden Sie einfach gutes altes HTML:

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

Wickeln Sie es als Thema eines Links ein, wenn Sie dies wünschen:

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

Oder wenn Sie möchten, dass Javascript andere Funktionen bietet:

<input type="button" value="Cancel" onclick="javascript: someFunctionThatCouldIncludeRedirect();"/>
Jeffrey Blake
quelle
7
Die Verwendung eines Standard-Schaltflächensteuerelements mit dem richtigen Typattribut ist "gutes altes HTML" und erzeugt ein viel einfacheres Markup.
R0MANARMY
Es ist eindeutig nicht einfacher, wenn es in einigen Browsern einen Standardtyp für das Senden und in anderen einen Standardtyp für Schaltflächen gibt. Selbst wenn nur der Standardtyp der Übermittlung verwendet wird, werden die Dinge mehr kompliziert als nötig, IMO. Es sollte ein Markup geben, das leicht eine Schaltfläche bereitstellt, die nichts bewirkt. Und es gibt:<input type="button" />
Jeffrey Blake
+1 Ich habe genau diese Technik oft verwendet und sie hat bei mir immer gut funktioniert. Eine Variante ist, wenn Sie das Postback-Ereignis für eine serverseitige Schaltfläche basierend auf einer clientseitigen Berechnung abbrechen müssen, können Sie window.event.returnValue = false einschließen; in Ihrem Code, der im clientseitigen Onclick-Ereignis für Ihre Schaltfläche ausgeführt wird ... das heißt, wenn die Verwendung eines benutzerdefinierten Validator-Steuerelements den Senf für Sie nicht schneidet :)
Adam McKee
1
@ JGB146: Nur weil nicht alle Browser standardmäßig den gleichen Wert verwenden, bedeutet dies nicht, dass sie den richtigen Typ nicht respektieren, wenn er manuell festgelegt wird (wie von jleedev vorgeschlagen. Ganz zu schweigen von den Fragen, die speziell nach einer Möglichkeit fragen, darauf zu verzichten JavaScript, während Ihre Antwort dies nicht berücksichtigt.
R0MANARMY
11
@ JGB146: Buttonist ein Container in HTML. Auf diese Weise können Sie Dinge wie Bilder oder Tabellen platzieren (nicht sicher, warum Sie dies tun würden, aber Sie könnten es) usw., während inputdies nicht unterstützt wird. Es gibt einen Unterschied zwischen den beiden, und jeder hat seinen geeigneten Anwendungsfall.
R0MANARMY
6
<form onsubmit="return false;">
   ...
</form>
zzjove
quelle
5

Ehrlich gesagt mag ich die anderen Antworten. Einfach und ohne dass Sie in JS einsteigen müssen. Aber ich habe bemerkt, dass Sie nach jQuery gefragt haben. Der Vollständigkeit halber wird in jQuery die Standardaktion des Widgets negiert, wenn Sie mit dem Handler .click () false zurückgeben.

Hier finden Sie ein Beispiel (und auch weitere Extras). Hier ist auch die Dokumentation .

Kurz gesagt, mit Ihrem Beispielcode tun Sie Folgendes:

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

Als zusätzlichen Vorteil können Sie damit das Ankertag entfernen und einfach die Schaltfläche verwenden.

TCCV
quelle
Seltsamerweise verhindert das Hinzufügen e.preventDefault()nichts, um die Übermittlung zu stoppen (wo es beginnt function(e)).
Sablefoste
1

Ohne das typeAttribut festzulegen, können Sie auch falsevon Ihrem OnClickHandler zurückkehren und das onclickAttribut als deklarieren onclick="return onBtnClick(event)".

DennisVM-D2i
quelle
0

Ja, Sie können festlegen, dass eine Schaltfläche kein Formular sendet, indem Sie ein Attribut vom Typ der Wertschaltfläche hinzufügen: <button type="button"><button>

Githaiga Geoffrey
quelle
-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
        }
        }

        ?>
Andrew
quelle