<form> etiketinin dışındaki bir düğmeyi kullanarak formu gönderin


301

Diyelim ki:

<form method="get" action="something.php">
    <input type="text" name="name" />
</form>

<input type="submit" />

Formun dışında bu gönderme düğmesi ile bu formu gönderme hakkında nasıl, HTML5 içinde göndermek için bir eylem özniteliği düşünüyorum ama bu tamamen çapraz tarayıcı olup olmadığını ve yine de orada olup olmadığından emin değilim Bunu yap?


2
Javascript olmadan bunu yapabileceğinizi sanmıyorum. Tarayıcı ne biçim olduğunu nasıl bilecek? Birkaç tane olabilir. Gönder düğmesini neden formun içine yerleştiremiyorsunuz?
Keith

1
JS kullanmak istemiyorsanız o zaman bana html'de (<5), sadece meraktan imkansız görünüyor, neden kodda böyle bir düzenlemeye sahip olacaksınız?
Kumar

1
Hepsini güncellemek için bir düğme ile çok sekmeli ayarlar alanı var, tasarımı nedeniyle düğme formun dışında olacaktır. Bu soru gereksiz gibi görünen sadece HTML5 seçeneği veya bir JS çözümü ile rulo olacak.
daryl

1
@Kumar, ben de imkansız olacağını düşündüm, ancak görünüşe göre değil stackoverflow.com/a/23456905/932473
dav

Yanıtlar:


84

Güncelleme: Modern tarayıcılarda bunu formyapmak için özelliği kullanabilirsiniz .


Bildiğim kadarıyla bunu javascript olmadan yapamazsınız.

İşte spec ne diyor

Denetimleri oluşturmak için kullanılan öğeler genellikle bir FORM öğesinin içinde görünür, ancak kullanıcı arabirimleri oluşturmak için kullanıldıklarında bir FORM öğesi bildiriminin dışında da görünebilir. Bu, iç olaylarla ilgili bölümde tartışılmaktadır. Bir formun dışındaki denetimlerin başarılı denetimler olamayacağını unutmayın.

Bu benim cesurum

Bir submitdüğme kontrol olarak kabul edilir.

http://www.w3.org/TR/html4/interact/forms.html#h-17.2.1

Yorumlardan

Hepsini güncellemek için bir düğme ile çok sekmeli ayarlar alanı var, bunun tasarımı nedeniyle düğme formun dışında olacaktır.

Neden inputformun içine yerleştirilmiyor, ancak sayfanın başka bir yerine yerleştirmek için CSS kullanılıyor?


19
FYI, HTML5 desteği, henüz mükemmel değil ama oraya
varıyor

6
Buraya biraz geç kaldım, ancak girdiyi forma nasıl koyabilirsiniz, ancak başka bir yere yerleştirebilirsiniz?
cgf

<button> etiketini html4
degr

2016'dan itibaren Sincap Joe'nun cevabı işe yaradığından, cevap artık geçerli değil.
Peter

önerilen JavaScript çözümleriyle ilgili bir endişe var. en son Chrome'da HTML5 doğrulaması (zorunlu vb.) atlanır. aklıma gelen bir çözüm, biri gizli iki gönderme düğmeleri olması. gizli düğmede bir tıklama tetiklenmelidir. form uygun bir doğrulama olmadan gönderilmemelidir.
victor n.

613

HTML5'te form özelliği vardır . temel olarak

<form id="myform" method="get" action="something.php">
    <input type="text" name="name" />
</form>

<input type="submit" form="myform" />

35
Bu, kullanmayı planlayan herkes için IE üzerinde çalışmaz. Ben kullandım ama sonra IE tarayıcılarda formu el ile göndermek için göndermek olay işlevi geri arama eklemek karar verdi.
racl101

1
Tam olarak hangi IE sürümleri?
mwld

11
Bunu zarif bir geri dönüş olarak yaptım <button type="submit" form="frmFoo" onclick="!this.form&&$('#'+$(this).attr('form')).submit()">: Deneyler ortaya çıktığı gibi, bu ekli DomElement formudur, aksi halde boştur. // değiştir: jQuery, ancak vanilya ile mümkün, çok ofc
Adrian Föder

2
MS Edge'de form özniteliğini görmek istiyorsanız lütfen buraya oy verin: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…
mkurz

2
@ AdrianFöder fallback'in vanilya-JS versiyonu:<button type="submit" form="frmFoo" onclick="!this.form && document.getElementById('myform').submit()">
romaricdrigon

318

Benim için harika bir çözüm hala burada eksik. İçinde görsel olarak gizli <submit>ya da bir <input type="submit">eleman <form>ve <label>onun dışında bir ilişkili eleman olması gerekir. Şöyle görünecektir:

<form method="get" action="something.php">
     <input type="text" name="name" />
     <input type="submit" id="submit-form" class="hidden" />
</form>

<label for="submit-form" tabindex="0">Submit</label>

Artık bu bağlantı, <submit>öğeyi tıklatarak form öğesini 'tıklatmanızı' sağlar <label>.


4
js ve büyük değişiklikler gerektirmeden daha iyi çözüm imho :)
Anton Hasan

52
IE 11'de de çalışır. Biliyorum, aynı cümlede sık sık "çalışır" ve "IE" görmüyorsunuz.
shim

2
Uyumsuzluk olmadan daha iyi çözüm. Twitter Bootstrap kullanıyorsanız, etiket bss sınıfı için "btn btn-birincil" kullanabilirsiniz ve mükemmel çalışır.
Juanda

7
Çok güzel bir çözüm, ancak bu yöntemi kullanmak için bir itiraz olabilir. A labelodaklanabilir bir öğe (AFAIK) değildir, bu nedenle yalnızca 'düğmeye' gitmek için klavyeyi kullanan bir kullanıcı için sezgisel değildir ve sonra bu düğmeyi etkinleştirmek için boşluk tuşuna basar. (Bunun <enter>yerine basabileceğinizin farkındayım , ancak insanların klavye ile formlarda gezinmeye alışkın olmasının tek yolu bu değil)
Auke

11
Odaklanmak için labelsekme düğmesi ile kullanabileceğiniz tabindexHTML niteliğini: <label for="submit-form" tabindex="0">Submit</label>uyarınca bu soruya
MarthyM

47

jQuery kullanabiliyorsanız bunu kullanabilirsiniz

<form method="get" action="something.php" id="myForm">
    <input type="text" name="name" />

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

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

<script type="text/javascript">
    $(document).ready(function() {
       $("#myButton").click(function() {
           $("#myForm").submit();
       });
    });
</script>

Bu nedenle, alt satırda Gönder gibi bir düğme oluşturmak ve gerçek gönderme düğmesini forma (tabii ki gizlemek) koymak ve 'Sahte Gönder' düğmesini tıklayarak formu jquery ile göndermektir. Umarım yardımcı olur.


1
Hem HTML5 hazır tarayıcıda hem de IE'de çalışmasını sağlamak için işte benim jQuery$('button[form]').click(function (){ var formId = $(this).attr('form'); $('#' + formId).submit(); });
Snook

35
<form method="get" id="form1" action="something.php">

</form>

<!-- External button-->
<button type="submit" form="form1">Click me!</button>

Bu, bir form için uzaktan gönderme düğmesine sahip olmak benim için çalıştı.


teşekkürler dostum, bu basit özellik için JS kodu satırları yazmak istemiyorum. Not: Uygulamam IE'yi desteklemiyor
Mani

1
MS Edge'de form özniteliği özelliğini görmek istiyorsanız lütfen burayı oylayın
mkurz

22

Buradaki başka bir çözüme benzer, küçük değişikliklerle:

<form method="METHOD" id="FORMID">
   <!-- ...your inputs -->
</form>
<button type="submit" form="FORMID" value="Submit">Submit</button>

https://www.w3schools.com/tags/att_form.asp


Bu en iyi cevap, IMO. Düğmenin form özniteliğinde doğrudan MDN'den: Düğmenin ilişkili olduğu form öğesi (form sahibi). Özniteliğin değeri, aynı belgedeki <form> öğesinin id özniteliği olmalıdır. Bu öznitelik belirtilmezse, <button> öğesi, varsa bir üst <form> öğesiyle ilişkilendirilir. Bu öznitelik, yalnızca <form> öğelerinin torunları gibi değil, <button> öğelerini belgenin herhangi bir yerinde <form> öğesiyle ilişkilendirmenizi sağlar.
AlexSashaRegan

Unutmayın: Internet Explorer 11'de işe yaramıyor: Burada deneyin: cdpn.io/mdix/debug/PooPqaM/PNAvYKNJojRr
Marc Dix

19

Bunu dene:

<input type="submit" onclick="document.forms[0].submit();" />

Her ne kadar idforma bir ekleme ve bunun yerine erişerek öneririz document.forms[index].


1
Evet, javascript ile nasıl yapılacağını biliyorum, eğer bakarsanız javascript olarak etiketlemedim.
Daryl

Üzgünüm, yayınınızda JS olmayan bir yol aradığınız açık değildi (JS altında etiketlemeyi kaçırdığınızı düşündüm).
Mrchief

1
Başka bir formun içindeki düğmeyi kullanarak harici bir form göndermek istiyorsanız, bunu yapmanın en iyi yolu budur.
Vahid Amiri

11

Her zaman jQuery kullanabilirsiniz:

<form id="myForm">
  <!-- form controls -->
</form>
<input type="submit" id="myButton">

<script>
$(document).ready(function () {
  $("#myButton").click(function () {
    $("#myForm").submit();
  });
});
</script>

8

İşte şimdiye kadar en iyi fikirleri içeren ve Offerein'in vurguladığı bir soruna çözümümü içeren oldukça sağlam bir çözüm. Javascript kullanılmaz.

IE (ve hatta Edge 13) ile geriye dönük uyumluluğu önemsiyorsanız, form="your-form" özelliği kullanamazsınız .

Hiçbiri görüntülenmeyen standart bir gönderme girişi kullanın ve formun dışında bir etiket ekleyin:

<form id="your-form">
  <input type="submit" id="your-form-submit" style="display: none;">
</form>

Kullanımına dikkat edin display: none;. Bu kasıtlı. Bootstrap en kullanma .hiddenjQuery en sınıf çatışmaları .show()ve .hide(), ve o zamandan beri Bootstrap 4'te kaldırılmıştır.

Şimdi gönderiniz için bir etiket ekleyin, (bootstrap için tasarlandı):

<label for="your-form-submit" role="button" class="btn btn-primary" tabindex="0">
  Submit
</label>

Diğer çözümlerden farklı olarak, 0 olarak ayarlanmış tabindex kullanıyorum - bu da artık klavye sekme ile uyumlu olduğumuz anlamına geliyor. role="button"Özniteliğin eklenmesi ona CSS stili verir cursor: pointer. Et voila. ( Bu kemanı gör ).


Güzel! IE11 ve firefox ile harika çalıştı. Teşekkürler!
eaglei22

@ eaglei22 duyduğuma sevindim :)
Jonathan

Başka bir yerden tüm özellikleri / önerileri bir araya getirmeniz çok yararlı, bu yüzden teşekkür ederim. Ancak, şimdi düğmeye / etikete sekebilmenize rağmen, klavyeden "tıklamanın" hiçbir yolunu göremiyorum, örneğin basmanın Enterhiçbir etkisi yoktur. Böylece, sekme yapabilmek biraz anlamsız görünüyor. JavaScript kullanmadan bunu yapmanın bir yolu var mı?
Andrew Willems

@AndrewWillems bu iyi bir nokta. Ne yazık ki javascript olmadan bir tıklama olayını tetiklemek için klavyenizi kullanmanın bir yolunu görmüyorum. Not: Eğer gönderi size yardımcı olduysa lütfen oy verin. Size hiçbir maliyeti yoktur ama yararlı cevaplar üreten herkes için çok şey ifade eder.
Jonathan

1
Ayrıca, sizi ( <input... />burada) hemen hemen herkesin açık ve yanlış bir şekilde kullandığı özensiz ve geçersiz kendi kendine kapanan sözdizimini düzeltmek için de seviyorum ! :) Şeref!
Sz.

3

Bu mükemmel çalışıyor! ;)

Bu Ajax ve "form ayna elemanı" dediğim ile yapılabilir. Dışarıda bir öğe içeren bir form göndermek yerine, sahte bir form oluşturabilirsiniz. Önceki forma gerek yoktur.

<!-- This will do the trick -->
<div >
    <input id="mirror_element" type="text" name="your_input_name">
    <input type="button" value="Send Form">
</div>

Kod ajax şöyle olurdu:

    <script>
        ajax_form_mirror("#mirror_element", "your_file.php", "#your_element_response", "POST");

        function ajax_form_mirror(form, file, element, method) {
            $(document).ready(function() {
                // Ajax
                $(form).change(function() { // catch the forms submit event
                    $.ajax({                // create an AJAX call...
                        data: $(this).serialize(),      // get the form data
                        type: method,                   // GET or POST
                        url: file,                      // the file to call
                        success: function (response) {   // on success..
                        $(element).html(response);  // update the DIV
                        }
                    });

                    return false; // cancel original event to prevent form submitting
                });
            });
        }
   </script>

Üst formu göndermeden başka bir formun içine bazı veriler göndermek istiyorsanız bu çok kullanışlıdır.

Bu kod muhtemelen ihtiyaca göre uyarlanabilir / optimize edilebilir. Mükemmel çalışıyor !! ;) Bunun gibi bir seçenek kutusu seçmek isterseniz de çalışır:

<div>
    <select id="mirror_element" name="your_input_name">
        <option id="1" value="1">A</option>
        <option id="2" value="2">B</option>
        <option id="3" value="3">C</option>
        <option id="4" value="4">D</option>
    </select>
</div>

Umarım böyle birisine yardımcı olmuştur. ;)


1

Belki bu işe yarayabilir, ancak bunun geçerli HTML olup olmadığını bilmiyorum.

<form method="get" action="something.php">
    <input type="text" name="name" />
    <input id="submitButton" type="submit" class="hide-submit" />
</form>

<label for="submitButton">Submit</label>

3
Bu cevap bu sorunun kendisi için zaten var. stackoverflow.com/a/23456905/2968465
Jayant Bhawal

0

Bir tablo hücre öğesinden formu gizlemeye çalıştığım bir sorun vardı, ama yine de formları Gönder düğmesini göster. Sorun, form öğesinin hala fazladan boş bir alan kaplaması ve tablo hücresimin biçiminin garip görünmesiydi. Display: none ve visibility: hidden öznitelikleri, gizlemeye çalıştığım formun içinde bulunduğundan, gönderme düğmesini de gizleyeceği için çalışmadı. Basit cevap, form yüksekliğini CSS kullanarak zar zor hiçbir şeye ayarlamaktı

Yani,

CSS -

    #formID {height:4px;}

benim için çalıştı.


0

Bu şekilde kullandım ve nazik beğendim, göndermeden önce formu doğrular da safari / google ile uyumludur. jquery yok nn

        <module-body>
            <form id="testform" method="post">
                <label>Input Title</label>
                <input name="named1" placeholder="Placeholder"  title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>

                <label>Input Title</label>
                <input placeholder="Placeholder" title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>

                <label>Input Title</label>
                <input placeholder="Placeholder" title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>
            </form>
        </module-body>
        <module-footer>
            <input type="button" onclick='if (document.querySelector("#testform").reportValidity()) { document.querySelector("#testform").submit(); }' value="Submit">
            <input type="button" value="Reset">
        </module-footer>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.