jquery form gönder üzerinde devre dışı bırak


207

Sayfamda çalışmıyor gibi görünen aşağıdaki javascript var.

$('form').bind("keypress", function(e) {
  if (e.keyCode == 13) {               
    e.preventDefault();
    return false;
  }
});

Ajax form gönderimi çağırmak için enter veya daha iyisi form gönderilmesini devre dışı bırakmak istiyorum. Her iki çözüm de kabul edilebilir ancak yukarıda eklediğim kod formun gönderilmesini engellemiyor.


3
İşte basit bir HTML çözümü: stackoverflow.com/a/51507806/337934
SamB

Yanıtlar:


420

Eğer keyCodeyakalandı değildir, av which:

$('#formid').on('keyup keypress', function(e) {
  var keyCode = e.keyCode || e.which;
  if (keyCode === 13) { 
    e.preventDefault();
    return false;
  }
});

EDIT: kaçırdı, keyupyerine kullanmak daha iyidirkeypress

DÜZENLEME 2: Firefox'un bazı yeni sürümlerinde olduğu gibi, form gönderimi engellenmez, keypress olayını forma eklemek de daha güvenlidir. Ayrıca, olayı yalnızca "ad" biçimine bağlayarak (yalnızca form kimliğine) bağlayarak (artık?) Çalışmaz. Bu nedenle kod örneğini uygun şekilde değiştirerek bunu daha açık hale getirdim.

DÜZENLEME 3: Değiştirildi bind()içinon()


15
jQuery bunu normalleştirir e.which, bu nedenle test etmeniz gerekmez e.keyCode, ancak bu sorunun en olası nedeni için +1.
Bojangles

4
Buna ihtiyacın var return false;mı? e.preventDefault();yeterli görünüyor
chromigo

10
Önemli! Bu çözelti bloğu metin alanında kırılır.
Alman Khokhlov

4
Sorun, aynı formda bir metin kutusu varsa, şimdi metin kutusuna bir enter (yeni bir satır yapmak için) ekleyemiyorum.
Tikky

3
keyCode === 13 && !$(e.target).is('textarea')
teran

62

Genellikle form, Entergiriş öğelerine odaklandığınızda gönderilir .

Bir formdaki giriş öğelerinde Enteranahtarı (kodu 13) devre dışı bırakabiliriz :

$('form input').on('keypress', function(e) {
    return e.which !== 13;
});

DEMO: http://jsfiddle.net/bnx96/325/


Özel bir otomatik tamamlama giriş alanında iOS Git düğmesi sorunumdu. Bu çözdü.
Dylan Valade

11
Bu, enter tuşunun textareasaynı formda kullanılmasını önler . $("form input")Bunun yerine kullanmak düzeltiyor $("form :input")gibi görünüyor. DEMO: jsfiddle.net/bnx96/279
shaneparsons

43

Daha da kısa:

$('myform').submit(function() {
  return false;
});

35
Ancak bu, kullanıcının tıklamasını da engeller mi?
haibuihoang

5
@haibuihoang Evet bu form gönderimini devre dışı bırakacaktır.
Tom

7
function(e) {e.preventDefault();}Olay işleyicileri kullanımdan kaldırıldığında dönüş değerleri olarak kullanmalısınız : stackoverflow.com/a/20045473/601386
grip

6
@ user1111929 Bu harika çalışıyor, ancak en iyi yanıt olmamalı, çünkü soru Enter, Submitdüğme tarafından form gönderilmesini devre dışı bırakmayla ilgili değil , yalnızca sordu .
daveslab

Form gönderimini korumak isteyebileceğiniz, ancak 'enter' tuşuna basarak gönderimi devre dışı bırakabileceğiniz yaygın bir durum, onClickbir formu doğrulamak ve yine de jQuery kullanarak göndermek için bir jQuery olayı kullanmaya karar vermenizdir . Başka bir deyişle, yalnızca javascript / jQuery aracılığıyla göndermek istediğiniz durumlar vardır. Bu çözümle AJAX'ı kullanmaya devam etmenize rağmen, submityöntemin temel işlevlerini devre dışı bırakır .
Kötü

23
$('form').keyup(function(e) {
  return e.which !== 13  
});

Event.which mülkiyet event.keyCode ve event.charCode normalleştirir. Etkinliği izlemeniz önerilir. Klavye tuşu girişi için.

which docs.


14
$(document).on('keyup keypress', 'form input[type="text"]', function(e) {
  if(e.which == 13) {
    e.preventDefault();
    return false;
  }
});

Bu çözüm, yalnızca giriş metinlerine girilmesini önleyerek web sitesindeki tüm formlarda (ajax ile eklenen formlarda da) çalışır. Belgeye hazır bir işleve yerleştirin ve bu sorunu bir ömür boyu unutun.


9

Yukarıdaki yanıtların çoğu, kullanıcıların metin alanı alanına yeni satırlar eklemesini önleyecektir. Bu, kaçınmak istediğiniz bir şeyse, şu anda hangi öğenin odağa sahip olduğunu kontrol ederek bu özel durumu hariç tutabilirsiniz:

var keyCode = e.keyCode || e.which;
if (keyCode === 13 && !$(document.activeElement).is('textarea')) {
  e.preventDefault();
  return false;
}

8

ENTER tuşu için her tuş vuruşu yakalayıp test etmenin aşırı yükü beni gerçekten rahatsız ediyor, bu yüzden çözümüm aşağıdaki tarayıcı davranışına dayanıyor:

ENTER tuşuna basmak , gönder düğmesinde bir tıklama olayını tetikleyecektir (IE11, Chrome 38, FF 31'de test edilmiştir) ** (ref: http://mattsnider.com/how-forms-submit-when-pressing-enter/ )

Bu yüzden benim çözümüm standart gönderme düğmesini (yani <input type="submit">) kaldırmaktır, böylece ENTER tuşuna basıldığında sihirli bir şekilde tıklamak için hiçbir gönderme düğmesi olmadığından yukarıdaki davranış başarısız olur. Bunun yerine, formu jQuery .submit()yöntemi ile göndermek için normal bir düğme üzerinde bir jQuery tıklama işleyicisi kullanın .

<form id="myform" method="post">
  <input name="fav_color" type="text">
  <input name="fav_color_2" type="text">
<button type="button" id="form-button-submit">DO IT!</button>
</form>

<script>
 $('#form-button-submit').click(function(){
    $('#myform').submit();
  });
</script>

Demo: http://codepen.io/anon/pen/fxeyv?editors=101

** Formda yalnızca 1 giriş alanı varsa ve bu alan bir 'metin' girdiyse bu davranış uygulanamaz; bu durumda, HTML işaretlemesinde (örneğin bir arama alanı) hiçbir gönderme düğmesi olmasa bile form ENTER tuşuna basılarak gönderilir. Bu, 90'lı yıllardan beri standart tarayıcı davranışıdır.


Sayaç için görünmez bir giriş kutusu ekledim, formun sadece 1 giriş alanı olduğundan ve bu alan bir 'metin' girişinden kaynaklanır.
Luo Jiong Hui

6

sadece giriş ve gönder düğmesindeki gönderimi devre dışı bırakmak istiyorsanız formun onubmit etkinliğini kullanın

<form onsubmit="return false;">

"Return false" ifadesini, gerekli olan her şeyi yapacak JS işlevine çağrı ile değiştirebilir ve formu son adım olarak gönderebilirsiniz.


1
Bu, gönder düğmesine tıklamak da dahil olmak üzere tüm form gönderimlerini devre dışı bırakır.
Nick

% 100 değil ... düzenli çalışmak bir anahtar göndermek ... önlemek için en iyi jquery kullanın
KingRider

İyi bir alternatif cevap (yukarıdaki uyarılarla) çünkü ... şey, bazen ihtiyacınız olan her şey bu.
emilys

bir durum için tam olarak ihtiyacım olan şey bu, teşekkür ederim
shababhsiddique

4

Bunu saf Javascript, basit ve hiçbir kütüphane gerekli mükemmel yapabilirsiniz. İşte benzer bir konu için ayrıntılı cevabım: Form için enter tuşunu devre dışı bırakma

Kısacası, işte kod:

<script type="text/javascript">
window.addEventListener('keydown',function(e){if(e.keyIdentifier=='U+000A'||e.keyIdentifier=='Enter'||e.keyCode==13){if(e.target.nodeName=='INPUT'&&e.target.type=='text'){e.preventDefault();return false;}}},true);
</script>

Bu kod, yalnızca girdi türü = 'metin' için "Enter" tuşunu önlemektir. (Ziyaretçinin sayfa boyunca enter tuşuna basması gerekebilir) Diğer işlemler için de "Enter" özelliğini devre dışı bırakmak istiyorsanız console.log (e) ekleyebilirsiniz; test amaçlarınız için ve kromda F12 tuşuna basın, "konsol" sekmesine gidin ve sayfadaki "geri" tuşuna basın ve hangi değerlerin döndürüldüğünü görmek için içine bakın, ardından kodu daha da geliştirmek için tüm bu parametreleri hedefleyebilirsiniz "e.target.nodeName" , "e.target.type" ve daha fazlası için ihtiyaçlarınızı karşılamak için yukarıda ...


2
Aslında öyle olmalı e.target.nodeName === 'INPUT' && e.target.type !== 'textarea'. Belirtilen kodla, bir radyo veya onay kutusu odaklanmışsa form gönderilmesine izin verir.
afnpires

3

Bu sorunu zaten çözüp çözmediğinizi veya şu anda bunu çözmeye çalışan biri olduğunu bilmiyorum ama işte bunun için benim çözümüm!

$j(':input:not(textarea)').keydown(function(event){
    var kc = event.witch || event.keyCode;
    if(kc == 13){
    event.preventDefault();
        $j(this).closest('form').attr('data-oldaction', function(){
            return $(this).attr('action');
        }).attr('action', 'javascript:;');

        alert('some_text_if_you_want');

        $j(this).closest('form').attr('action', function(){
            return $(this).attr('data-oldaction');
        });
        return false;
    }
});

2

Basit yolu, düğme türünü düğmeye - html'de değiştirmek ve sonra js'de etkinlik eklemektir ...

Bundan değiştirin:

<form id="myForm">
   <button type="submit">Submit</button>
</form>

için

<form id="myForm">
   <button type="button" id="btnSubmit">Submit</button>
</form>

Ve js veya jquery ekleyin:

("#btnSubmit").click(function () {
    $('#myForm').submit();
});

1

Aşağıdaki kod, enter tuşunun form göndermek için kullanılmasını reddeder, ancak enter tuşunu bir metin alanında kullanmanıza izin verir. Gereksinimlerinize bağlı olarak daha fazla düzenleyebilirsiniz.

<script type="text/javascript">
        function stopRKey(evt) {
          var evt = (evt) ? evt : ((event) ? event : null);
          var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
          if ((evt.keyCode == 13) && ((node.type=="text") || (node.type=="radio") || (node.type=="checkbox")) )  {return false;}
        }

        document.onkeypress = stopRKey;
</script> 

1

Firefox'ta, giriş yaptığınızda ve enter tuşuna bastığınızda üst formunu gönderir. Çözüm irade gönderme formunda ekleyin:

<input type="submit" onclick="return false;" style="display:none" />

1

3 yıl sonra ve tek bir kişi bu soruyu tamamen cevaplamadı.

Asker, varsayılan form gönderimini iptal etmek ve kendi Ajax'larını aramak istiyor. Bu basit bir çözüm ile basit bir istek. Her bir girişe girilen her karakterin kesilmesine gerek yoktur.

Formun bir gönderme düğmesi olduğunu varsayarsak, a <button id="save-form">veya a <input id="save-form" type="submit">, aşağıdakileri yapar:

$("#save-form").on("click", function () {
    $.ajax({
        ...
    });
    return false;
});


-2

Dosya bittiğinde (yükleme tamamlandı), komut dosyası "Giriş" tuşu için her olayı algılar ve arkasındaki olayı devre dışı bırakır.

<script>
            $(document).ready(function () {
                $(window).keydown(function(event){
                    if(event.keyCode == 13) {
                        e.preventDefault(); // Disable the " Entry " key
                        return false;               
                    }
                });
            });
        </script>

biraz açıklama ekle
HaveNoDisplayName

@HaveNoDisplayName: Güncellendi.
McNavy

-4

Tüm tarayıcılar için JavaScript'te Eksiksiz Çözüm

Yukarıdaki kod ve çözümlerin çoğu mükemmel. Ancak, en çok sevilen ve eksik olan bir "kısa cevap" olduğunu düşünüyorum.

İşte tüm cevap. IE 7 için yerel Destek ile JavaScript.

var form = document.getElementById("testForm");
form.addEventListener("submit",function(e){e.preventDefault(); return false;});

Bu çözüm artık kullanıcının Enter Anahtarını kullanarak göndermesini engelleyecek ve formunuz aşağıda bir yerdeyse sayfayı yeniden yüklemeyecek veya sizi sayfanın en üstüne götürmeyecektir.


8
Bu, "Gönder" düğmesini tıklarsanız formun gönderilmesini de engeller.
Mario Werner

-10

Buna ne dersin:

$(":submit").closest("form").submit(function(){
    $(':submit').attr('disabled', 'disabled');
});

Bu, uygulamanızdaki gönderme düğmelerine sahip tüm formları devre dışı bırakmalıdır.

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.