Interrompere l'invio di un campo di input in un modulo


114

Sto scrivendo un po 'di javascript (un greasemonkey / userscript) che inserirà alcuni campi di input in un form su un sito web.

Il fatto è che non voglio che quei campi di input influenzino in alcun modo il modulo, non voglio che vengano inviati quando il modulo viene inviato, voglio solo che il mio javascript abbia accesso ai loro valori.

C'è un modo per aggiungere alcuni campi di input nel mezzo di un modulo e non averli inviati quando viene inviato il modulo?

Ovviamente l'ideale sarebbe che i campi di input non siano nell'elemento del modulo, ma voglio che il layout della mia pagina risultante abbia i miei campi di input inseriti tra gli elementi del modulo originale.


2
qual è il problema se vengono inviati? Puoi scegliere quali campi elaborare nella lingua lato server.
Sarfraz

6
Non credo che gli elementi del modulo senza nome vengano visualizzati quando viene inviato un modulo: se puoi scrivere il tuo JS per fare riferimento a loro tramite ID, potresti lasciare i loro nomi vuoti, impedendo di fatto loro di inviare.
gddc

2
lasciare vuoto il campo attributo nome
deostroll

@Sarfraz Ahmed: sto scrivendo uno script greasemonkey, quindi non ho alcun controllo sul sito web.
Ghianda

11
Secondo il w3: da includere nella presentazione di un modulo. un campo (elemento modulo) deve essere definito all'interno dell'elemento modulo e deve avere un attributo nome. Gli elementi privi di nome, o non contenuti nel modulo, non vengono inviati al server.
kennebec

Risposte:


159

Puoi inserire campi di input senza l'attributo "nome":

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

Oppure puoi semplicemente rimuoverli una volta inviato il modulo (in jQuery):

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

7
Omettere il nome ne impedisce l'invio? Bene, non lo sapevo. Funziona su tutti i browser? Fa parte di uno standard o è un capriccio di implementazione?
BlairHippo

2
@ Acorn non ne sono del tutto sicuro, ma vale la pena leggerlo. Essenzialmente se ometti il ​​valore dell'attributo "nome" non puoi accedere a quel valore con nessun metodo ... quindi potrebbe essere che il valore venga semplicemente scartato dal browser. Se è fondamentale essere sicuri per te, scegli l'opzione jquery / javascript (tieni presente che i campi saranno inviati quando javascript è facilmente disabilitato, quindi non fare affidamento su nessuno dei tuoi meccanismi di sicurezza).
Gal

17
Ho provato a tralasciare l'attributo name con chrome, firefox, safari e sembra che i campi del form vengano inviati al server con una stringa vuota per il nome. Ho esaminato i dati del post utilizzando WebScarab e ho scoperto che i dati vengono inviati. Per ora immagino che dovrò disabilitare i campi per evitare che vengano inviati.
kldavis4

1
@ kldavis4 - sembra che sia stripe (stripe.js) che Braintree (braintree.js) [link] braintreepayments.com/docs/python/guide/getting_paid utilizzino il concetto di attributo "tralascia il nome" per impedire che i dati raggiungano i server riducendo così la necessità di conformità "PCI" ... se dici che i "dati" vengono inviati sono in errore?
Rahul Dighe


57

La cosa più semplice da fare sarebbe inserire gli elementi con l' disabledattributo.

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

In questo modo puoi ancora accedervi come figli del modulo.

I campi disabilitati hanno lo svantaggio che l'utente non può interagire con loro, quindi se hai un disabledcampo di testo, l'utente non può selezionare il testo. Se hai una disabledcasella di controllo, l'utente non può modificarne lo stato.

Puoi anche scrivere un po 'di javascript per attivare l'invio del modulo per rimuovere i campi che non desideri inviare.


L'idea è che i miei campi inseriti siano utilizzabili in modo che l'utente possa cambiare le caselle di controllo ecc. E quindi inviarli al mio javascript.
Acorn

3
Disabilitato potrebbe ancora funzionare, se disabiliti solo i campi all'invio o in base a una casella di controllo selezionata. In questo modo non stai solo buttando via la nameproprietà, a cui potresti voler aggrapparti se vuoi che venga utilizzata in seguito.
JMTyler

Questo è ottimo quando devi inviare il modulo utilizzando AJAX e non vuoi rimuovere i tuoi input dal modulo o rimuovere il loro nameattributo.
Nolonar

15

Semplice tentativo di rimuovere l' attributo name dall'elemento di input.
Quindi deve assomigliare

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

Questa dovrebbe essere la risposta :))
Máxima Alekz

1
Questo funziona per le caselle di controllo. Si noti tuttavia che ciò interromperà la deselezione automatica dell'altro pulsante di opzione se utilizzato con i pulsanti di opzione.
anre

10

Volevo solo aggiungere un'opzione aggiuntiva: nel tuo input aggiungi il tag del modulo e specifica il nome di un modulo che non esiste sulla tua pagina:

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

1
mentre questo probabilmente funziona (non è stato testato), a meno che tu non lo definisca fakeFormaltrove (non è necessario inviare) questo si traduce in HTML non valido.
Brian H.

1
Se non vuoi aggiungere javascript e hai bisogno dell'input all'interno del form con l'interazione dell'utente. Questa è di gran lunga la soluzione più semplice dal mio punto di vista.
yannisalexiou

1
NOTA: questa soluzione non funziona con IE . Controlla qui
Harvey

@Harvey Yikes! Grazie per il testa a testa!
Joshua Pinter

9

È possibile scrivere un gestore di eventi per onsubmitrimuovere l' nameattributo da tutti i campi di input che si desidera non includere nell'invio del modulo.

Ecco un rapido esempio non testato:

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

So che questo post è antico, ma risponderò comunque. Il modo più semplice / migliore che ho trovato è semplicemente impostare il nome su vuoto.

Metti questo prima del tuo invio:

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

Tutto sommato la tua funzione di invio potrebbe essere simile a questa:

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

Questo invierà comunque il modulo con tutti gli altri campi, ma non invierà quello senza nome.


Semplice e diretto. Mi piace!
pbarney

2

Aggiungi disabled = "disabled" in input e mentre jquery rimuovi l'attributo disabled quando vuoi inviarlo utilizzando .removeAttr ('disabled')

HTML:

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

jQuery:

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


2

Tutte le risposte precedenti dicevano già tutto sulla (non) denominazione dei controlli del modulo o sulla loro rimozione a livello di codice prima di inviare effettivamente il modulo.

Anche se, attraverso la mia ricerca, ho trovato un'altra soluzione che non ho visto menzionata in questo post:
se incapsuli i controlli del modulo che vuoi essere non elaborati / non inviati, all'interno di un altro <form>tag senza methodattributo né path(e ovviamente nessun controllo del tipo di invio come un pulsante o inviare un input annidato in esso), quindi l'invio del modulo padre non includerà quei controlli del modulo incapsulato.

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

Il valore di controllo [name = "notSent"] non verrà elaborato né inviato all'endpoint POST del server, ma quello da [name = "sent"] lo sarà.

Questa soluzione potrebbe essere aneddotica ma la lascio ancora ai posteri ...


Osservazione interessante ma l'hai testata in vari browser? Mi chiedo se sia in base alla progettazione, alle specifiche o solo a un capriccio del comportamento del browser. Sarà un metodo affidabile in futuro quando i browser cambieranno?
scipilot

1

Gestisci l'invio del modulo in una funzione tramite onSubmit () ed esegui qualcosa come di seguito per rimuovere l'elemento del modulo: Usa getElementById()il DOM, quindi utilizza[object].parentNode.removeChild([object])

supponi che il tuo campo in questione abbia un attributo id "my_remoucted_field" codice:

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

Questo ti darà esattamente quello che stai cercando.


0

Hai anche bisogno che siano elementi di input in primo luogo? Puoi utilizzare Javascript per creare dinamicamente div o paragrafi o voci di elenco o qualsiasi altra cosa che contenga le informazioni che desideri presentare.

Ma se l'elemento interattivo è importante ed è una seccatura collocare quegli elementi fuori dal <form>blocco, dovrebbe essere possibile rimuovere quegli elementi dal modulo quando la pagina viene inviata.


Sì, ho bisogno che siano elementi di input perché sto cercando di ottenere l'input dell'utente.
Ghianda

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>

Purtroppo l'attributo form non funziona in IE / Edge. caniuse.com/#search=form%20attribute
George Helyar

0

È necessario aggiungere onsubmit al modulo:

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

E lo script sarà così:

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

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

Questo funziona per me ogni volta :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.