Bir formdaki giriş alanının gönderilmesini durdurma


114

Bazı giriş alanlarını bir web sitesindeki forma ekleyecek bir javascript (greasemonkey / userscript) yazıyorum.

Mesele şu ki, bu girdi alanlarının formu hiçbir şekilde etkilemesini istemiyorum, form gönderildiğinde gönderilmesini istemiyorum, sadece javascript'imin değerlerine erişmesini istiyorum.

Bir formun ortasına bazı giriş alanları ekleyip form gönderildiğinde bunları göndermememin bir yolu var mı?

Açıkçası ideal olan şey, giriş alanlarının form öğesinde olmamasıdır, ancak ortaya çıkan sayfamın düzeninin, eklenen giriş alanlarımın orijinal formun öğeleri arasında görünmesini istiyorum.


2
teslim edilirlerse sorun nedir? Sunucu tarafı dilinde hangi alanların işleneceğini seçebilirsiniz.
Sarfraz

6
Adlandırılmamış form öğelerinin bir form gönderildiğinde göründüğüne inanmıyorum - JS'nizi onlara kimlikle başvurmak için yazabilirseniz, adlarını boş bırakabilir ve etkili bir şekilde göndermelerini engelleyebilirsiniz.
gddc

2
ad öznitelik alanını boş bırakın
deostroll

@Sarfraz Ahmed: Bir greasemonkey senaryosu yazıyorum, bu yüzden web sitesi üzerinde hiçbir kontrolüm yok.
Acorn

11
W3'e göre: Bir formun gönderimine dahil edilmek. bir alan (form öğesi), form öğesi içinde tanımlanmalı ve bir ad özelliğine sahip olmalıdır. İsimsiz veya formda yer almayan öğeler sunucuya gönderilmez.
kennebec

Yanıtlar:


159

"Ad" özelliği olmadan giriş alanları ekleyebilirsiniz:

<input type="text" id="in-between" />

Veya form gönderildikten (içinde jQuery) sonra bunları kaldırabilirsiniz :

$("form").submit(function() {
   $(this).children('#in-between').remove();
});

7
Adın çıkarılması, gönderilmesini engeller mi? Harika, bunu bilmiyordum. Bu tüm tarayıcılarda çalışıyor mu? Bir standardın parçası mı yoksa bir uygulama tuhaflığı mı?
BlairHippo

2
@Acorn Tam olarak emin değilim, ama okumaya değer. Esasen, "ad" özniteliği değerini atlarsanız, bu değere herhangi bir yöntemle erişemezsiniz ... bu nedenle, değer tarayıcı tarafından basitçe göz ardı edilebilir. Sizin için güvenli olması çok önemliyse, jquery / javascript seçeneğini kullanın (alanların javascript kolayca devre dışı bırakıldığında gönderileceğini unutmayın - bu nedenle güvenlik mekanizmalarınızdan hiçbirine güvenmeyin).
Gal

17
İsim özelliğini chrome, firefox, safari ile dışarıda bırakarak test ettim ve form alanları sunucuya isim için boş bir dizeyle gönderiliyor gibi görünüyor. WebScarab kullanarak gönderi verilerini inceledim ve verilerin gönderildiğini gördüm. Şimdilik, gönderilmelerini önlemek için alanları devre dışı bırakmam gerekecek sanırım.
kldavis4

1
@ kldavis4 - hem stripe (stripe.js) hem de Braintree (braintree.js) [link] braintreepayments.com/docs/python/guide/getting_paid , verilerin sunuculara isabet etmesini durdurmak için "adı dışarıda bırakarak" öznitelik kavramını kullanıyor gibi görünüyor böylece "PCI" uyumluluğuna olan ihtiyacı azaltır ... "veri" gönderildiğini söylerseniz, bunlar hatalı mıdır?
Rahul Dighe


57

Yapılacak en kolay şey, disabledöznitelikle öğeleri eklemek olacaktır .

<input type="hidden" name="not_gonna_submit" disabled="disabled" value="invisible" />

Bu şekilde onlara formun alt öğeleri olarak erişmeye devam edebilirsiniz.

Devre dışı bırakılan alanların dezavantajı, kullanıcının onlarla hiçbir şekilde etkileşim kuramamasıdır - bu nedenle, bir disabledmetin alanınız varsa, kullanıcı metni seçemez. disabledOnay kutunuz varsa , kullanıcı durumunu değiştiremez.

Ayrıca, göndermek istemediğiniz alanları kaldırmak için form gönderirken tetiklenecek bir javascript de yazabilirsiniz.


Buradaki fikir, eklenen alanlarımın kullanılabilir olması, böylece kullanıcının onay kutularını vb. Değiştirebilmesi ve ardından bunları javascript'ime gönderebilmesidir.
Acorn

3
Alanları yalnızca gönderim sırasında devre dışı bırakırsanız veya seçilen bir onay kutusuna bağlı olarak devre dışı bırakılmaya devam edilebilir. Bu şekilde name, daha sonra kullanılmasını istiyorsanız, elinizde tutmak isteyebileceğiniz mülkü sadece çöpe atmıyorsunuz .
JMTyler

Formu AJAX kullanarak göndermeniz gerektiğinde ve girişlerinizi formdan veya nameözniteliklerini kaldırmak istemediğinizde bu harikadır .
Nolonar

15

Basitçe, isim özniteliğini giriş öğesinden kaldırmayı deneyin .
Yani benzemeli

<input type="checkbox" checked="" id="class_box_2" value="2">

Cevap bu olmalı :))
Máxima Alekz

1
Bu, onay kutuları için çalışır. Ancak bunun, radyo düğmeleriyle birlikte kullanıldığında diğer radyo düğmesinin otomatik olarak seçimini kaldıracağını unutmayın.
2017

10

Sadece ek bir seçenek eklemek istedim: Girişinize form etiketini ekleyin ve sayfanızda bulunmayan bir formun adını belirtin:

<input form="fakeForm" type="text" readonly value="random value" />

1
bu muhtemelen çalışır (test edilmemiştir), gerçekten fakeFormbaşka bir yerde tanımlamadığınız sürece (göndermeye gerek yoktur) bu geçersiz HTML ile sonuçlanır.
Brian H.

1
Javascript eklemek istemiyorsanız ve formun içindeki girdiye kullanıcı etkileşimi ile ihtiyacınız varsa. Benim açımdan en basit çözüm budur.
yannisalexiou

1
NOT: Bu çözüm IE ile çalışmaz . Burayı
Harvey

@Harvey Yikes! Söylediğin için teşekkürler!
Joshua Pinter

9

Bunu onsubmitkaldıran bir olay işleyicisi yazabilirsiniz .nameForm gönderimine dahil edilmesini istemediğiniz tüm giriş alanlarından özniteliği .

İşte test edilmemiş hızlı bir örnek:

var noSubmitElements = [ 'someFormElementID1', 'someFormElementID2' ]; //...
function submitForm() {
    for( var i = 0, j = noSubmitElements.length; i < j; i++ ) {
        document.getElementById(noSubmitElements[i]).removeAttribute('name');
    }
}
form.onsubmit = submitForm;

2

Bu yazının eski olduğunu biliyorum ama yine de cevaplayacağım. Bulduğum en kolay / en iyi yol, sadece adı boş olarak ayarlamaktır.

Bunu göndermeden önce koyun:

document.getElementById("TheInputsIdHere").name = "";

Sonuç olarak gönderme işleviniz şöyle görünebilir:

document.getElementById("TheInputsIdHere").name = "";
document.getElementById("TheFormsIdHere").submit();

Bu, formu diğer tüm alanlarınızla göndermeye devam edecek, ancak adsız olanı göndermeyecektir.


Basit ve anlaşılır. Bunu sevdim!
pbarney

2

Girişte devre dışı = "devre dışı" ekleyin ve jquery sırasında .removeAttr ('devre dışı') kullanarak göndermek istediğinizde devre dışı bırakılan özniteliği kaldırın

HTML:

<input type="hidden" name="test" value="test" disabled='disabled'/>

jQuery:

$("input[name='test']").removeAttr('disabled');


2

Yukarıdaki yanıtların tümü, form kontrollerini adlandırmak (değil) veya formunuzu gerçekten göndermeden önce bunları programlı olarak kaldırmakla ilgili her şeyi zaten söyledi.

Araştırmam boyunca, bu yazıda bahsetmediğim başka bir çözüm buldum:
İşlenmesini / gönderilmemesini istediğiniz form kontrollerini, özniteliği <form>olmayan başka bir etiketin içine methodkoyarsanız path(ve açıkça gönderme türü kontrolü yok) bir düğme gibi veya içine yerleştirilmiş giriş gönder), ardından ana formun gönderilmesi bu kapsüllenmiş form kontrollerini içermez.

<form method="POST" path="/path">
  <input type="text" name="sent" value="..." />
  <form>
    <input type="text" name="notSent" value="..." />
  </form>
  <input type="submit" name="submit" value="Submit" />
</form>

[Name = "notSent"] kontrol değeri işlenmeyecek veya sunucu POST uç noktasına gönderilmeyecek, ancak [name = "gönderildi"] 'den gelen değer işlenecek.

Bu çözüm anekdotik olabilir ama hala gelecek nesillere bırakıyorum ...


İlginç bir gözlem ama bunu çeşitli tarayıcılarda test ettiniz mi? Tasarımdan mı, spesifikasyondan mı yoksa tarayıcı davranışından mı kaynaklandığını merak ediyorum. Tarayıcılar değiştikçe gelecekte güvenilir bir yöntem olacak mı?
scipilot

1

Formun gönderimini onSubmit () aracılığıyla bir işlevde gerçekleştirin ve form öğesini kaldırmak için aşağıdaki gibi bir işlem gerçekleştirin: getElementById()DOM'un kullanılması, ardından[object].parentNode.removeChild([object])

söz konusu alanınızın "my_removable_field" koduna sahip bir id özniteliğine sahip olduğunu varsayalım:

var remEl = document.getElementById("my_removable_field");
if ( remEl.parentNode && remEl.parentNode.removeChild ) {
remEl.parentNode.removeChild(remEl);
}

Bu size tam olarak aradığınız şeyi verecektir.


0

İlk etapta giriş öğeleri olmalarına bile ihtiyacınız var mı? Dinamik olarak div'ler veya paragraflar oluşturmak veya öğeleri veya sunmak istediğiniz bilgileri içeren her şeyi listelemek için Javascript'i kullanabilirsiniz.

Ancak, etkileşimli öğe önemliyse ve bu öğeleri <form>bloğun dışına yerleştirmek zor bir durumsa, sayfa gönderildiğinde bu öğeleri formdan çıkarmak mümkün olmalıdır.


Evet, bunların girdi öğeleri olmasına ihtiyacım var çünkü kullanıcı girdisi almaya çalışıyorum.
Acorn

0
$('#serialize').click(function () {
  $('#out').text(
    $('form').serialize()
  );
});

$('#exclude').change(function () {
  if ($(this).is(':checked')) {
    $('[name=age]').attr('form', 'fake-form-id');
  } else {
    $('[name=age]').removeAttr('form');    
  }
  
  $('#serialize').click();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="/">
  <input type="text" value="John" name="name">
  <input type="number" value="100" name="age">
</form>

<input type="button" value="serialize" id="serialize">
<label for="exclude">  
  <input type="checkbox" value="exclude age" id="exclude">
  exlude age
</label>

<pre id="out"></pre>

Maalesef form özniteliği IE / Edge'de çalışmıyor. caniuse.com/#search=form%20attribute
George Helyar

0

Formunuza onsubmit eklemeniz gerekiyor:

<form action="YOUR_URL" method="post" accept-charset="utf-8" onsubmit="return validateRegisterForm();">

Ve senaryo şöyle olacak:

        function validateRegisterForm(){
        if(SOMETHING IS WRONG)
        { 
            alert("validation failed");
            event.preventDefault();
            return false;

        }else{
            alert("validations passed");
            return true;
        }
    }

Bu benim için her zaman işe yarar :)

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.