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!).



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


14
Laut w3schools gilt das nicht für IE .
R0MANARMY

53
Das ist nur eine schockierend schlechte Designentscheidung.
Oktober


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>

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();"/>

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


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.


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)".


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>


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

        ?>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.