Qual è il modo migliore per evitare la duplicazione del codice in queste due funzioni che fanno la stessa cosa?

StackOverflow https://stackoverflow.com/questions/1633630

Domanda

Dato questo modulo (che contiene un pulsante di invio):

<form id="review_form">
  <input type="submit" id="btn_submit" value="Submit with ajax! (submit button)">
</form>

e questo link (per inviare lo stesso modulo):

<a href="#" id="lnk_submit">Submit with ajax! (hyperlink)</a>

Nel seguente codice jQuery, quando si fa clic sull'elemento #btn_submit , il modulo ( #review_form) viene inviato con ajax:

jQuery.fn.submitWithAjax = function() {
  this.submit(function() {
    $.post(this.action, $(this).serialize(), null, "script");
    return false;
  })
  return this;
};

$(document).ready(function() {
  $("#btn_submit").submitWithAjax();
})

Quello che voglio fare è rimuovere il pulsante di invio e inviare il modulo utilizzando il link sopra ( #lnk_submit ) qualcosa del genere:

$("#lnk_submit").click(function(){ 
   $("#review_form").submit(function() {
    $.post(this.action, $(this).serialize(), null, "script");
    return false;
    }); 
   return false;
});

Ma il problema è che questo duplica tutto il codice in jQuery.fn.submitWithAjax definito sopra.

Qual è il modo migliore per evitare la duplicazione del codice qui?

È stato utile?

Soluzione

Che ne dici di avere una funzione come questa:

function submitWithAjax() {
    $("#review_form").submit(function() {
        $.post(this.action, $(this).serialize(), null, "script");
        return false;
    });         
}

E quindi collegare entrambe le azioni alla funzione:

$(document).ready(submitWithAjax);
$("#lnk_submit").click(submitWithAjax);

Altri suggerimenti

Forse sto semplificando troppo, ma non puoi semplicemente assegnare la funzione a una variabile e riutilizzarla?

var submitWithAjaxFn = function() {
  this.submit(function() {
    $.post(this.action, $(this).serialize(), null, "script");
    return false;
  })
  return this;
};

jQuery.fn.submitWithAjax = submitWithAjaxFn;
$("#lnk_submit").click(function(){ 
   $("#review_form").submit(submitWithAjaxFn); 
   return false;
});

La risposta più semplice (anche se forse non la più elegante) è usare la seconda funzione per entrambi (che si riferisce esplicitamente al tuo modulo indipendentemente da ciò che sta chiamando la funzione), e quindi dare ad ogni 'trigger' la stessa classe e allegare il clic evento per entrambi.

Se si desidera la stessa funzionalità dal collegamento ipertestuale, rendere l'azione del collegamento ipertestuale semplicemente un clic del pulsante.

$('#lnk_submit').click(function(e){ $('#btn_submit').click(); return false; });
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top